From 4571b31fc0f9a0219d2c1f0b9fffe5f35f1b164a Mon Sep 17 00:00:00 2001 From: Amritanshu Date: Fri, 31 May 2024 22:51:01 +0530 Subject: [PATCH] Chore: Check for deprecations using eslint plugin Chore: environment file replacement stopped. Chore: All components are now standalone and removed all modules Chore: App routing is now in app.routes and similarly for all submodules Chore: Http interceptors are now functional and split refresh interceptor into a separate one. --- overlord/.eslintrc.json | 9 +- overlord/angular.json | 6 - overlord/package.json | 3 +- .../account-detail.component.spec.ts | 14 +- .../account-detail.component.ts | 52 ++++- .../account-list.component.spec.ts | 5 +- .../account-list/account-list.component.ts | 52 ++++- .../account/account-routing.module.spec.ts | 13 -- .../src/app/account/account.module.spec.ts | 13 -- overlord/src/app/account/account.module.ts | 41 ---- ...nt-routing.module.ts => account.routes.ts} | 12 +- overlord/src/app/app-routing.module.spec.ts | 13 -- overlord/src/app/app-routing.module.ts | 190 ------------------ overlord/src/app/app.component.spec.ts | 22 +- overlord/src/app/app.component.ts | 6 + overlord/src/app/app.config.ts | 68 +++++++ overlord/src/app/app.environment.ts | 18 ++ overlord/src/app/app.module.ts | 65 ------ overlord/src/app/app.routes.ts | 171 ++++++++++++++++ .../attendance-routing.module.spec.ts | 13 -- .../attendance/attendance.component.spec.ts | 14 +- .../app/attendance/attendance.component.ts | 63 +++++- .../app/attendance/attendance.module.spec.ts | 13 -- .../src/app/attendance/attendance.module.ts | 72 ------- ...routing.module.ts => attendance.routes.ts} | 12 +- overlord/src/app/auth/auth.service.ts | 51 +++-- .../app/auth/login/login.component.spec.ts | 14 +- .../src/app/auth/login/login.component.ts | 32 ++- .../app/auth/logout/logout.component.spec.ts | 14 +- .../src/app/auth/logout/logout.component.ts | 1 + .../balance-sheet-routing.module.spec.ts | 13 -- .../balance-sheet.component.spec.ts | 13 +- .../balance-sheet/balance-sheet.component.ts | 63 +++++- .../balance-sheet.module.spec.ts | 13 -- .../app/balance-sheet/balance-sheet.module.ts | 60 ------ ...ting.module.ts => balance-sheet.routes.ts} | 12 +- ...ch-integrity-report-routing.module.spec.ts | 13 -- .../batch-integrity-report.component.spec.ts | 14 +- .../batch-integrity-report.component.ts | 35 +++- .../batch-integrity-report.module.spec.ts | 13 -- .../batch-integrity-report.module.ts | 66 ------ ...le.ts => batch-integrity-report.routes.ts} | 12 +- .../cash-flow-routing.module.spec.ts | 13 -- .../app/cash-flow/cash-flow.component.spec.ts | 13 +- .../src/app/cash-flow/cash-flow.component.ts | 56 +++++- .../app/cash-flow/cash-flow.module.spec.ts | 13 -- .../src/app/cash-flow/cash-flow.module.ts | 60 ------ ...-routing.module.ts => cash-flow.routes.ts} | 12 +- .../client-detail.component.spec.ts | 14 +- .../client-detail/client-detail.component.ts | 37 +++- .../client-list/client-list.component.spec.ts | 4 +- .../client-list/client-list.component.ts | 40 +++- .../app/client/client-routing.module.spec.ts | 13 -- overlord/src/app/client/client.module.spec.ts | 13 -- overlord/src/app/client/client.module.ts | 40 ---- ...ent-routing.module.ts => client.routes.ts} | 12 +- .../closing-stock-routing.module.spec.ts | 13 -- .../closing-stock.component.spec.ts | 13 +- .../closing-stock/closing-stock.component.ts | 94 +++++++-- .../closing-stock.module.spec.ts | 13 -- .../app/closing-stock/closing-stock.module.ts | 64 ------ ...ting.module.ts => closing-stock.routes.ts} | 12 +- .../src/app/core/auth.interceptor.spec.ts | 16 ++ overlord/src/app/core/auth.interceptor.ts | 53 +++++ overlord/src/app/core/core.module.spec.ts | 13 -- overlord/src/app/core/core.module.ts | 34 ---- .../src/app/core/http-auth-interceptor.ts | 63 ------ overlord/src/app/core/jwt.interceptor.spec.ts | 16 ++ overlord/src/app/core/jwt.interceptor.ts | 44 ++-- .../core/nav-bar/nav-bar.component.spec.ts | 2 +- .../src/app/core/nav-bar/nav-bar.component.ts | 11 +- .../src/app/core/refresh.interceptor.spec.ts | 17 ++ overlord/src/app/core/refresh.interceptor.ts | 17 ++ .../cost-centre-detail.component.spec.ts | 13 +- .../cost-centre-detail.component.ts | 27 ++- .../cost-centre-list.component.spec.ts | 4 +- .../cost-centre-list.component.ts | 43 +++- .../cost-centre-routing.module.spec.ts | 13 -- .../cost-centre/cost-centre.module.spec.ts | 13 -- .../src/app/cost-centre/cost-centre.module.ts | 35 ---- ...outing.module.ts => cost-centre.routes.ts} | 12 +- .../daybook/daybook-routing.module.spec.ts | 13 -- .../src/app/daybook/daybook.component.spec.ts | 13 +- overlord/src/app/daybook/daybook.component.ts | 55 ++++- .../src/app/daybook/daybook.module.spec.ts | 13 -- overlord/src/app/daybook/daybook.module.ts | 66 ------ ...ok-routing.module.ts => daybook.routes.ts} | 12 +- .../employee-attendance.component.ts | 69 ++++++- .../employee-attendance.module.ts | 72 ------- ...odule.ts => employee-attendance.routes.ts} | 12 +- .../employee-benefits.component.ts | 93 +++++++-- .../employee-benefits.module.ts | 70 ------- ....module.ts => employee-benefits.routes.ts} | 12 +- .../employee-functions-routing.module.ts | 25 --- .../employee-functions.component.ts | 42 +++- .../employee-functions.module.ts | 72 ------- .../employee-functions.routes.ts | 17 ++ .../employee-detail.component.spec.ts | 14 +- .../employee-detail.component.ts | 56 +++++- .../employee-list.component.spec.ts | 5 +- .../employee-list/employee-list.component.ts | 56 +++++- .../employee/employee-routing.module.spec.ts | 13 -- .../src/app/employee/employee.module.spec.ts | 13 -- overlord/src/app/employee/employee.module.ts | 63 ------ ...e-routing.module.ts => employee.routes.ts} | 12 +- .../entries/entries-routing.module.spec.ts | 13 -- .../src/app/entries/entries.component.spec.ts | 14 +- overlord/src/app/entries/entries.component.ts | 96 +++++++-- .../src/app/entries/entries.module.spec.ts | 13 -- overlord/src/app/entries/entries.module.ts | 66 ------ ...es-routing.module.ts => entries.routes.ts} | 12 +- overlord/src/app/home/home.component.spec.ts | 10 +- overlord/src/app/home/home.component.ts | 1 + .../incentive-routing.module.spec.ts | 13 -- .../app/incentive/incentive.component.spec.ts | 14 +- .../src/app/incentive/incentive.component.ts | 87 ++++++-- .../app/incentive/incentive.module.spec.ts | 13 -- .../src/app/incentive/incentive.module.ts | 70 ------- ...-routing.module.ts => incentive.routes.ts} | 12 +- .../app/issue/issue-dialog.component.spec.ts | 10 +- .../src/app/issue/issue-dialog.component.ts | 36 +++- .../app/issue/issue-routing.module.spec.ts | 13 -- .../src/app/issue/issue.component.spec.ts | 14 +- overlord/src/app/issue/issue.component.ts | 90 ++++++++- overlord/src/app/issue/issue.module.spec.ts | 13 -- overlord/src/app/issue/issue.module.ts | 73 ------- ...ssue-routing.module.ts => issue.routes.ts} | 12 +- .../journal/journal-dialog.component.spec.ts | 10 +- .../app/journal/journal-dialog.component.ts | 45 ++++- .../journal/journal-routing.module.spec.ts | 13 -- .../src/app/journal/journal.component.spec.ts | 14 +- overlord/src/app/journal/journal.component.ts | 106 ++++++++-- .../src/app/journal/journal.module.spec.ts | 13 -- overlord/src/app/journal/journal.module.ts | 75 ------- ...al-routing.module.ts => journal.routes.ts} | 12 +- .../app/ledger/ledger-routing.module.spec.ts | 13 -- .../src/app/ledger/ledger.component.spec.ts | 15 +- overlord/src/app/ledger/ledger.component.ts | 78 ++++++- overlord/src/app/ledger/ledger.module.spec.ts | 13 -- overlord/src/app/ledger/ledger.module.ts | 66 ------ ...ger-routing.module.ts => ledger.routes.ts} | 12 +- .../net-transactions-routing.module.spec.ts | 13 -- .../net-transactions.component.spec.ts | 13 +- .../net-transactions.component.ts | 55 ++++- .../net-transactions.module.spec.ts | 13 -- .../net-transactions.module.ts | 66 ------ ...g.module.ts => net-transactions.routes.ts} | 12 +- ...n-contract-purchase-routing.module.spec.ts | 13 -- .../non-contract-purchase.component.spec.ts | 14 +- .../non-contract-purchase.component.ts | 35 +++- .../non-contract-purchase.module.spec.ts | 13 -- .../non-contract-purchase.module.ts | 47 ----- ...ule.ts => non-contract-purchase.routes.ts} | 12 +- .../payment/payment-dialog.component.spec.ts | 10 +- .../app/payment/payment-dialog.component.ts | 41 +++- .../payment/payment-routing.module.spec.ts | 13 -- .../src/app/payment/payment.component.spec.ts | 14 +- overlord/src/app/payment/payment.component.ts | 106 ++++++++-- .../src/app/payment/payment.module.spec.ts | 13 -- overlord/src/app/payment/payment.module.ts | 75 ------- ...nt-routing.module.ts => payment.routes.ts} | 12 +- .../period-detail.component.spec.ts | 14 +- .../period-detail/period-detail.component.ts | 40 +++- .../period-list/period-list.component.spec.ts | 5 +- .../period-list/period-list.component.ts | 38 +++- .../app/period/period-routing.module.spec.ts | 13 -- overlord/src/app/period/period.module.spec.ts | 13 -- overlord/src/app/period/period.module.ts | 63 ------ ...iod-routing.module.ts => period.routes.ts} | 12 +- .../product-group-detail.component.spec.ts | 13 +- .../product-group-detail.component.ts | 29 ++- .../product-group-list.component.spec.ts | 4 +- .../product-group-list.component.ts | 43 +++- .../product-group-routing.module.spec.ts | 13 -- .../product-group.module.spec.ts | 13 -- .../app/product-group/product-group.module.ts | 37 ---- ...ting.module.ts => product-group.routes.ts} | 12 +- .../product-ledger-routing.module.spec.ts | 13 -- .../product-ledger.component.spec.ts | 15 +- .../product-ledger.component.ts | 75 ++++++- .../product-ledger.module.spec.ts | 13 -- .../product-ledger/product-ledger.module.ts | 66 ------ ...ing.module.ts => product-ledger.routes.ts} | 12 +- .../product-detail-dialog.component.spec.ts | 10 +- .../product-detail-dialog.component.ts | 28 ++- .../product-detail.component.spec.ts | 14 +- .../product-detail.component.ts | 68 ++++++- .../product-list.component.spec.ts | 5 +- .../product-list/product-list.component.ts | 55 ++++- .../product/product-routing.module.spec.ts | 13 -- .../src/app/product/product.module.spec.ts | 13 -- overlord/src/app/product/product.module.ts | 44 ---- ...ct-routing.module.ts => product.routes.ts} | 12 +- .../profit-loss-routing.module.spec.ts | 13 -- .../profit-loss/profit-loss.component.spec.ts | 13 +- .../app/profit-loss/profit-loss.component.ts | 60 +++++- .../profit-loss/profit-loss.module.spec.ts | 13 -- .../src/app/profit-loss/profit-loss.module.ts | 66 ------ ...outing.module.ts => profit-loss.routes.ts} | 12 +- .../purchase-entries-routing.module.spec.ts | 13 -- .../purchase-entries.component.spec.ts | 13 +- .../purchase-entries.component.ts | 57 +++++- .../purchase-entries.module.spec.ts | 13 -- .../purchase-entries.module.ts | 66 ------ ...g.module.ts => purchase-entries.routes.ts} | 12 +- .../purchase-return-dialog.component.spec.ts | 10 +- .../purchase-return-dialog.component.ts | 36 +++- .../purchase-return-routing.module.spec.ts | 13 -- .../purchase-return.component.spec.ts | 14 +- .../purchase-return.component.ts | 106 ++++++++-- .../purchase-return.module.spec.ts | 13 -- .../purchase-return/purchase-return.module.ts | 75 ------- ...ng.module.ts => purchase-return.routes.ts} | 12 +- .../purchase-dialog.component.spec.ts | 11 +- .../app/purchase/purchase-dialog.component.ts | 36 +++- .../purchase/purchase-routing.module.spec.ts | 13 -- .../app/purchase/purchase.component.spec.ts | 14 +- .../src/app/purchase/purchase.component.ts | 106 ++++++++-- .../src/app/purchase/purchase.module.spec.ts | 13 -- overlord/src/app/purchase/purchase.module.ts | 75 ------- ...e-routing.module.ts => purchase.routes.ts} | 12 +- .../purchases-routing.module.spec.ts | 13 -- .../app/purchases/purchases.component.spec.ts | 14 +- .../src/app/purchases/purchases.component.ts | 64 +++++- .../app/purchases/purchases.module.spec.ts | 13 -- .../src/app/purchases/purchases.module.ts | 66 ------ ...-routing.module.ts => purchases.routes.ts} | 12 +- .../rate-contract/rate-contact.module.spec.ts | 13 -- .../rate-contract-detail.component.spec.ts | 13 +- .../rate-contract-detail.component.ts | 76 ++++++- .../rate-contract-list.component.spec.ts | 4 +- .../rate-contract-list.component.ts | 45 ++++- .../rate-contract-routing.module.spec.ts | 13 -- .../app/rate-contract/rate-contract.module.ts | 64 ------ ...ting.module.ts => rate-contract.routes.ts} | 12 +- .../raw-material-cost-routing.module.spec.ts | 13 -- .../raw-material-cost.component.spec.ts | 13 +- .../raw-material-cost.component.ts | 69 ++++++- .../raw-material-cost.module.spec.ts | 13 -- .../raw-material-cost.module.ts | 66 ------ ....module.ts => raw-material-cost.routes.ts} | 12 +- .../receipt/receipt-dialog.component.spec.ts | 12 +- .../app/receipt/receipt-dialog.component.ts | 41 +++- .../receipt/receipt-routing.module.spec.ts | 13 -- .../src/app/receipt/receipt.component.spec.ts | 14 +- overlord/src/app/receipt/receipt.component.ts | 106 ++++++++-- .../src/app/receipt/receipt.module.spec.ts | 13 -- overlord/src/app/receipt/receipt.module.ts | 75 ------- ...pt-routing.module.ts => receipt.routes.ts} | 12 +- .../recipe-template-detail.component.spec.ts | 14 +- .../recipe-template-detail.component.ts | 42 +++- .../recipe-template-list.component.spec.ts | 4 +- .../recipe-template-list.component.ts | 43 +++- .../recipe-template-routing.module.spec.ts | 13 -- .../recipe-template.module.spec.ts | 13 -- .../recipe-template/recipe-template.module.ts | 61 ------ ...ng.module.ts => recipe-template.routes.ts} | 12 +- .../recipe-detail.component.spec.ts | 13 +- .../recipe-detail/recipe-detail.component.ts | 76 ++++++- .../recipe-list/recipe-list.component.spec.ts | 4 +- .../recipe-list/recipe-list.component.ts | 54 ++++- .../app/recipe/recipe-routing.module.spec.ts | 13 -- overlord/src/app/recipe/recipe.module.spec.ts | 13 -- overlord/src/app/recipe/recipe.module.ts | 66 ------ ...ipe-routing.module.ts => recipe.routes.ts} | 12 +- .../role-detail/role-detail.component.spec.ts | 13 +- .../role/role-detail/role-detail.component.ts | 39 +++- .../role-list/role-list.component.spec.ts | 4 +- .../app/role/role-list/role-list.component.ts | 43 +++- .../src/app/role/role-routing.module.spec.ts | 13 -- overlord/src/app/role/role.module.spec.ts | 13 -- overlord/src/app/role/role.module.ts | 42 ---- ...{role-routing.module.ts => role.routes.ts} | 12 +- .../src/app/settings/settings.component.ts | 72 ++++++- overlord/src/app/settings/settings.module.ts | 72 ------- ...s-routing.module.ts => settings.routes.ts} | 12 +- overlord/src/app/shared/accounting.pipe.ts | 1 + overlord/src/app/shared/clear.pipe.ts | 1 + .../confirm-dialog.component.spec.ts | 10 +- .../confirm-dialog.component.ts | 13 +- .../image-dialog.component.spec.ts | 10 +- .../image-dialog/image-dialog.component.ts | 1 + overlord/src/app/shared/local-time.pipe.ts | 1 + overlord/src/app/shared/shared.module.spec.ts | 13 -- overlord/src/app/shared/shared.module.ts | 17 -- .../stock-movement-routing.module.spec.ts | 13 -- .../stock-movement.component.spec.ts | 13 +- .../stock-movement.component.ts | 55 ++++- .../stock-movement.module.spec.ts | 13 -- .../stock-movement/stock-movement.module.ts | 66 ------ ...ing.module.ts => stock-movement.routes.ts} | 12 +- .../trial-balance-routing.module.spec.ts | 13 -- .../trial-balance.component.spec.ts | 13 +- .../trial-balance/trial-balance.component.ts | 55 ++++- .../trial-balance.module.spec.ts | 13 -- .../app/trial-balance/trial-balance.module.ts | 62 ------ ...ting.module.ts => trial-balance.routes.ts} | 12 +- .../user-detail/user-detail.component.spec.ts | 13 +- .../user/user-detail/user-detail.component.ts | 50 +++-- .../app/user/user-list/user-list.component.ts | 45 ++++- .../src/app/user/user-routing.module.spec.ts | 13 -- overlord/src/app/user/user.module.spec.ts | 13 -- overlord/src/app/user/user.module.ts | 42 ---- ...{user-routing.module.ts => user.routes.ts} | 12 +- overlord/src/environments/environment.prod.ts | 7 - overlord/src/environments/environment.ts | 20 -- overlord/src/main.ts | 16 +- overlord/src/test.ts | 13 -- version_bump.sh | 6 +- 309 files changed, 3897 insertions(+), 5222 deletions(-) delete mode 100644 overlord/src/app/account/account-routing.module.spec.ts delete mode 100644 overlord/src/app/account/account.module.spec.ts delete mode 100644 overlord/src/app/account/account.module.ts rename overlord/src/app/account/{account-routing.module.ts => account.routes.ts} (79%) delete mode 100644 overlord/src/app/app-routing.module.spec.ts delete mode 100644 overlord/src/app/app-routing.module.ts create mode 100644 overlord/src/app/app.config.ts create mode 100644 overlord/src/app/app.environment.ts delete mode 100644 overlord/src/app/app.module.ts create mode 100644 overlord/src/app/app.routes.ts delete mode 100644 overlord/src/app/attendance/attendance-routing.module.spec.ts delete mode 100644 overlord/src/app/attendance/attendance.module.spec.ts delete mode 100644 overlord/src/app/attendance/attendance.module.ts rename overlord/src/app/attendance/{attendance-routing.module.ts => attendance.routes.ts} (71%) delete mode 100644 overlord/src/app/balance-sheet/balance-sheet-routing.module.spec.ts delete mode 100644 overlord/src/app/balance-sheet/balance-sheet.module.spec.ts delete mode 100644 overlord/src/app/balance-sheet/balance-sheet.module.ts rename overlord/src/app/balance-sheet/{balance-sheet-routing.module.ts => balance-sheet.routes.ts} (66%) delete mode 100644 overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.spec.ts delete mode 100644 overlord/src/app/batch-integrity-report/batch-integrity-report.module.spec.ts delete mode 100644 overlord/src/app/batch-integrity-report/batch-integrity-report.module.ts rename overlord/src/app/batch-integrity-report/{batch-integrity-report-routing.module.ts => batch-integrity-report.routes.ts} (57%) delete mode 100644 overlord/src/app/cash-flow/cash-flow-routing.module.spec.ts delete mode 100644 overlord/src/app/cash-flow/cash-flow.module.spec.ts delete mode 100644 overlord/src/app/cash-flow/cash-flow.module.ts rename overlord/src/app/cash-flow/{cash-flow-routing.module.ts => cash-flow.routes.ts} (66%) delete mode 100644 overlord/src/app/client/client-routing.module.spec.ts delete mode 100644 overlord/src/app/client/client.module.spec.ts delete mode 100644 overlord/src/app/client/client.module.ts rename overlord/src/app/client/{client-routing.module.ts => client.routes.ts} (69%) delete mode 100644 overlord/src/app/closing-stock/closing-stock-routing.module.spec.ts delete mode 100644 overlord/src/app/closing-stock/closing-stock.module.spec.ts delete mode 100644 overlord/src/app/closing-stock/closing-stock.module.ts rename overlord/src/app/closing-stock/{closing-stock-routing.module.ts => closing-stock.routes.ts} (71%) create mode 100644 overlord/src/app/core/auth.interceptor.spec.ts create mode 100644 overlord/src/app/core/auth.interceptor.ts delete mode 100644 overlord/src/app/core/core.module.spec.ts delete mode 100644 overlord/src/app/core/core.module.ts delete mode 100644 overlord/src/app/core/http-auth-interceptor.ts create mode 100644 overlord/src/app/core/jwt.interceptor.spec.ts create mode 100644 overlord/src/app/core/refresh.interceptor.spec.ts create mode 100644 overlord/src/app/core/refresh.interceptor.ts delete mode 100644 overlord/src/app/cost-centre/cost-centre-routing.module.spec.ts delete mode 100644 overlord/src/app/cost-centre/cost-centre.module.spec.ts delete mode 100644 overlord/src/app/cost-centre/cost-centre.module.ts rename overlord/src/app/cost-centre/{cost-centre-routing.module.ts => cost-centre.routes.ts} (74%) delete mode 100644 overlord/src/app/daybook/daybook-routing.module.spec.ts delete mode 100644 overlord/src/app/daybook/daybook.module.spec.ts delete mode 100644 overlord/src/app/daybook/daybook.module.ts rename overlord/src/app/daybook/{daybook-routing.module.ts => daybook.routes.ts} (54%) delete mode 100644 overlord/src/app/employee-attendance/employee-attendance.module.ts rename overlord/src/app/employee-attendance/{employee-attendance-routing.module.ts => employee-attendance.routes.ts} (70%) delete mode 100644 overlord/src/app/employee-benefits/employee-benefits.module.ts rename overlord/src/app/employee-benefits/{employee-benefits-routing.module.ts => employee-benefits.routes.ts} (67%) delete mode 100644 overlord/src/app/employee-functions/employee-functions-routing.module.ts delete mode 100644 overlord/src/app/employee-functions/employee-functions.module.ts create mode 100644 overlord/src/app/employee-functions/employee-functions.routes.ts delete mode 100644 overlord/src/app/employee/employee-routing.module.spec.ts delete mode 100644 overlord/src/app/employee/employee.module.spec.ts delete mode 100644 overlord/src/app/employee/employee.module.ts rename overlord/src/app/employee/{employee-routing.module.ts => employee.routes.ts} (77%) delete mode 100644 overlord/src/app/entries/entries-routing.module.spec.ts delete mode 100644 overlord/src/app/entries/entries.module.spec.ts delete mode 100644 overlord/src/app/entries/entries.module.ts rename overlord/src/app/entries/{entries-routing.module.ts => entries.routes.ts} (54%) delete mode 100644 overlord/src/app/incentive/incentive-routing.module.spec.ts delete mode 100644 overlord/src/app/incentive/incentive.module.spec.ts delete mode 100644 overlord/src/app/incentive/incentive.module.ts rename overlord/src/app/incentive/{incentive-routing.module.ts => incentive.routes.ts} (66%) delete mode 100644 overlord/src/app/issue/issue-routing.module.spec.ts delete mode 100644 overlord/src/app/issue/issue.module.spec.ts delete mode 100644 overlord/src/app/issue/issue.module.ts rename overlord/src/app/issue/{issue-routing.module.ts => issue.routes.ts} (70%) delete mode 100644 overlord/src/app/journal/journal-routing.module.spec.ts delete mode 100644 overlord/src/app/journal/journal.module.spec.ts delete mode 100644 overlord/src/app/journal/journal.module.ts rename overlord/src/app/journal/{journal-routing.module.ts => journal.routes.ts} (65%) delete mode 100644 overlord/src/app/ledger/ledger-routing.module.spec.ts delete mode 100644 overlord/src/app/ledger/ledger.module.spec.ts delete mode 100644 overlord/src/app/ledger/ledger.module.ts rename overlord/src/app/ledger/{ledger-routing.module.ts => ledger.routes.ts} (65%) delete mode 100644 overlord/src/app/net-transactions/net-transactions-routing.module.spec.ts delete mode 100644 overlord/src/app/net-transactions/net-transactions.module.spec.ts delete mode 100644 overlord/src/app/net-transactions/net-transactions.module.ts rename overlord/src/app/net-transactions/{net-transactions-routing.module.ts => net-transactions.routes.ts} (56%) delete mode 100644 overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.spec.ts delete mode 100644 overlord/src/app/non-contact-purchase/non-contract-purchase.module.spec.ts delete mode 100644 overlord/src/app/non-contact-purchase/non-contract-purchase.module.ts rename overlord/src/app/non-contact-purchase/{non-contract-purchase-routing.module.ts => non-contract-purchase.routes.ts} (57%) delete mode 100644 overlord/src/app/payment/payment-routing.module.spec.ts delete mode 100644 overlord/src/app/payment/payment.module.spec.ts delete mode 100644 overlord/src/app/payment/payment.module.ts rename overlord/src/app/payment/{payment-routing.module.ts => payment.routes.ts} (71%) delete mode 100644 overlord/src/app/period/period-routing.module.spec.ts delete mode 100644 overlord/src/app/period/period.module.spec.ts delete mode 100644 overlord/src/app/period/period.module.ts rename overlord/src/app/period/{period-routing.module.ts => period.routes.ts} (77%) delete mode 100644 overlord/src/app/product-group/product-group-routing.module.spec.ts delete mode 100644 overlord/src/app/product-group/product-group.module.spec.ts delete mode 100644 overlord/src/app/product-group/product-group.module.ts rename overlord/src/app/product-group/{product-group-routing.module.ts => product-group.routes.ts} (75%) delete mode 100644 overlord/src/app/product-ledger/product-ledger-routing.module.spec.ts delete mode 100644 overlord/src/app/product-ledger/product-ledger.module.spec.ts delete mode 100644 overlord/src/app/product-ledger/product-ledger.module.ts rename overlord/src/app/product-ledger/{product-ledger-routing.module.ts => product-ledger.routes.ts} (66%) delete mode 100644 overlord/src/app/product/product-routing.module.spec.ts delete mode 100644 overlord/src/app/product/product.module.spec.ts delete mode 100644 overlord/src/app/product/product.module.ts rename overlord/src/app/product/{product-routing.module.ts => product.routes.ts} (77%) delete mode 100644 overlord/src/app/profit-loss/profit-loss-routing.module.spec.ts delete mode 100644 overlord/src/app/profit-loss/profit-loss.module.spec.ts delete mode 100644 overlord/src/app/profit-loss/profit-loss.module.ts rename overlord/src/app/profit-loss/{profit-loss-routing.module.ts => profit-loss.routes.ts} (55%) delete mode 100644 overlord/src/app/purchase-entries/purchase-entries-routing.module.spec.ts delete mode 100644 overlord/src/app/purchase-entries/purchase-entries.module.spec.ts delete mode 100644 overlord/src/app/purchase-entries/purchase-entries.module.ts rename overlord/src/app/purchase-entries/{purchase-entries-routing.module.ts => purchase-entries.routes.ts} (56%) delete mode 100644 overlord/src/app/purchase-return/purchase-return-routing.module.spec.ts delete mode 100644 overlord/src/app/purchase-return/purchase-return.module.spec.ts delete mode 100644 overlord/src/app/purchase-return/purchase-return.module.ts rename overlord/src/app/purchase-return/{purchase-return-routing.module.ts => purchase-return.routes.ts} (67%) delete mode 100644 overlord/src/app/purchase/purchase-routing.module.spec.ts delete mode 100644 overlord/src/app/purchase/purchase.module.spec.ts delete mode 100644 overlord/src/app/purchase/purchase.module.ts rename overlord/src/app/purchase/{purchase-routing.module.ts => purchase.routes.ts} (66%) delete mode 100644 overlord/src/app/purchases/purchases-routing.module.spec.ts delete mode 100644 overlord/src/app/purchases/purchases.module.spec.ts delete mode 100644 overlord/src/app/purchases/purchases.module.ts rename overlord/src/app/purchases/{purchases-routing.module.ts => purchases.routes.ts} (55%) delete mode 100644 overlord/src/app/rate-contract/rate-contact.module.spec.ts delete mode 100644 overlord/src/app/rate-contract/rate-contract-routing.module.spec.ts delete mode 100644 overlord/src/app/rate-contract/rate-contract.module.ts rename overlord/src/app/rate-contract/{rate-contract-routing.module.ts => rate-contract.routes.ts} (75%) delete mode 100644 overlord/src/app/raw-material-cost/raw-material-cost-routing.module.spec.ts delete mode 100644 overlord/src/app/raw-material-cost/raw-material-cost.module.spec.ts delete mode 100644 overlord/src/app/raw-material-cost/raw-material-cost.module.ts rename overlord/src/app/raw-material-cost/{raw-material-cost-routing.module.ts => raw-material-cost.routes.ts} (67%) delete mode 100644 overlord/src/app/receipt/receipt-routing.module.spec.ts delete mode 100644 overlord/src/app/receipt/receipt.module.spec.ts delete mode 100644 overlord/src/app/receipt/receipt.module.ts rename overlord/src/app/receipt/{receipt-routing.module.ts => receipt.routes.ts} (71%) delete mode 100644 overlord/src/app/recipe-template/recipe-template-routing.module.spec.ts delete mode 100644 overlord/src/app/recipe-template/recipe-template.module.spec.ts delete mode 100644 overlord/src/app/recipe-template/recipe-template.module.ts rename overlord/src/app/recipe-template/{recipe-template-routing.module.ts => recipe-template.routes.ts} (75%) delete mode 100644 overlord/src/app/recipe/recipe-routing.module.spec.ts delete mode 100644 overlord/src/app/recipe/recipe.module.spec.ts delete mode 100644 overlord/src/app/recipe/recipe.module.ts rename overlord/src/app/recipe/{recipe-routing.module.ts => recipe.routes.ts} (79%) delete mode 100644 overlord/src/app/role/role-routing.module.spec.ts delete mode 100644 overlord/src/app/role/role.module.spec.ts delete mode 100644 overlord/src/app/role/role.module.ts rename overlord/src/app/role/{role-routing.module.ts => role.routes.ts} (73%) delete mode 100644 overlord/src/app/settings/settings.module.ts rename overlord/src/app/settings/{settings-routing.module.ts => settings.routes.ts} (70%) delete mode 100644 overlord/src/app/shared/shared.module.spec.ts delete mode 100644 overlord/src/app/shared/shared.module.ts delete mode 100644 overlord/src/app/stock-movement/stock-movement-routing.module.spec.ts delete mode 100644 overlord/src/app/stock-movement/stock-movement.module.spec.ts delete mode 100644 overlord/src/app/stock-movement/stock-movement.module.ts rename overlord/src/app/stock-movement/{stock-movement-routing.module.ts => stock-movement.routes.ts} (56%) delete mode 100644 overlord/src/app/trial-balance/trial-balance-routing.module.spec.ts delete mode 100644 overlord/src/app/trial-balance/trial-balance.module.spec.ts delete mode 100644 overlord/src/app/trial-balance/trial-balance.module.ts rename overlord/src/app/trial-balance/{trial-balance-routing.module.ts => trial-balance.routes.ts} (66%) delete mode 100644 overlord/src/app/user/user-routing.module.spec.ts delete mode 100644 overlord/src/app/user/user.module.spec.ts delete mode 100644 overlord/src/app/user/user.module.ts rename overlord/src/app/user/{user-routing.module.ts => user.routes.ts} (72%) delete mode 100644 overlord/src/environments/environment.prod.ts delete mode 100644 overlord/src/environments/environment.ts delete mode 100644 overlord/src/test.ts diff --git a/overlord/.eslintrc.json b/overlord/.eslintrc.json index 52b87c86..c50a03c7 100644 --- a/overlord/.eslintrc.json +++ b/overlord/.eslintrc.json @@ -8,6 +8,9 @@ "files": [ "*.ts" ], + "parserOptions": { + "project": ["tsconfig.(app|spec).json"] + }, "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", @@ -17,7 +20,8 @@ ], "plugins": [ "import", - "unused-imports" + "unused-imports", + "deprecation" ], "rules": { "@angular-eslint/directive-selector": [ @@ -57,7 +61,8 @@ "error" ], "unused-imports/no-unused-imports": "error", - "@typescript-eslint/no-empty-function": "off" + "@typescript-eslint/no-empty-function": "off", + "deprecation/deprecation": "warn" } }, { diff --git a/overlord/angular.json b/overlord/angular.json index 3cb8e5e3..1a8a9e7f 100644 --- a/overlord/angular.json +++ b/overlord/angular.json @@ -53,12 +53,6 @@ "maximumError": "4kb" } ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], "outputHashing": "all" }, "development": { diff --git a/overlord/package.json b/overlord/package.json index fb38a5b9..8c485041 100644 --- a/overlord/package.json +++ b/overlord/package.json @@ -52,6 +52,7 @@ "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", + "eslint-plugin-deprecation": "^2.0.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-unused-imports": "^3.2.0", "husky": "^9.0.11", @@ -82,4 +83,4 @@ "npx eslint --cache --fix" ] } -} \ No newline at end of file +} diff --git a/overlord/src/app/account/account-detail/account-detail.component.spec.ts b/overlord/src/app/account/account-detail/account-detail.component.spec.ts index dcb1a9ce..bdb2c7c1 100644 --- a/overlord/src/app/account/account-detail/account-detail.component.spec.ts +++ b/overlord/src/app/account/account-detail/account-detail.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AccountDetailComponent } from './account-detail.component'; @@ -9,14 +6,11 @@ describe('AccountDetailComponent', () => { let component: AccountDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [AccountDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AccountDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(AccountDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/account/account-detail/account-detail.component.ts b/overlord/src/app/account/account-detail/account-detail.component.ts index 46f1edd5..c727ee6f 100644 --- a/overlord/src/app/account/account-detail/account-detail.component.ts +++ b/overlord/src/app/account/account-detail/account-detail.component.ts @@ -1,6 +1,21 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { Account } from '../../core/account'; @@ -14,6 +29,25 @@ import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dial selector: 'app-account-detail', templateUrl: './account-detail.component.html', styleUrls: ['./account-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSelect, + MatOption, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class AccountDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -82,27 +116,27 @@ export class AccountDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/accounts'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/accounts'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/account/account-list/account-list.component.spec.ts b/overlord/src/app/account/account-list/account-list.component.spec.ts index 85aabf1f..1f4c72e2 100644 --- a/overlord/src/app/account/account-list/account-list.component.spec.ts +++ b/overlord/src/app/account/account-list/account-list.component.spec.ts @@ -1,6 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; import { AccountListComponent } from './account-list.component'; @@ -10,8 +8,7 @@ describe('AccountListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [AccountListComponent], + imports: [ReactiveFormsModule, RouterTestingModule, AccountListComponent], }).compileComponents(); fixture = TestBed.createComponent(AccountListComponent); diff --git a/overlord/src/app/account/account-list/account-list.component.ts b/overlord/src/app/account/account-list/account-list.component.ts index 8077675f..99782480 100644 --- a/overlord/src/app/account/account-list/account-list.component.ts +++ b/overlord/src/app/account/account-list/account-list.component.ts @@ -1,8 +1,25 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; @@ -15,6 +32,35 @@ import { AccountListDataSource } from './account-list-datasource'; selector: 'app-account-list', templateUrl: './account-list.component.html', styleUrls: ['./account-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatSuffix, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + ], }) export class AccountListComponent implements OnInit, AfterViewInit { @ViewChild('filterElement', { static: true }) filterElement?: ElementRef; diff --git a/overlord/src/app/account/account-routing.module.spec.ts b/overlord/src/app/account/account-routing.module.spec.ts deleted file mode 100644 index f305058a..00000000 --- a/overlord/src/app/account/account-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AccountRoutingModule } from './account-routing.module'; - -describe('AccountRoutingModule', () => { - let accountRoutingModule: AccountRoutingModule; - - beforeEach(() => { - accountRoutingModule = new AccountRoutingModule(); - }); - - it('should create an instance', () => { - expect(accountRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/account/account.module.spec.ts b/overlord/src/app/account/account.module.spec.ts deleted file mode 100644 index 13241c9c..00000000 --- a/overlord/src/app/account/account.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AccountModule } from './account.module'; - -describe('AccountModule', () => { - let accountModule: AccountModule; - - beforeEach(() => { - accountModule = new AccountModule(); - }); - - it('should create an instance', () => { - expect(accountModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/account/account.module.ts b/overlord/src/app/account/account.module.ts deleted file mode 100644 index 31984929..00000000 --- a/overlord/src/app/account/account.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { AccountDetailComponent } from './account-detail/account-detail.component'; -import { AccountListComponent } from './account-list/account-list.component'; -import { AccountRoutingModule } from './account-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatCardModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - AccountRoutingModule, - ], - declarations: [AccountListComponent, AccountDetailComponent], -}) -export class AccountModule {} diff --git a/overlord/src/app/account/account-routing.module.ts b/overlord/src/app/account/account.routes.ts similarity index 79% rename from overlord/src/app/account/account-routing.module.ts rename to overlord/src/app/account/account.routes.ts index 8a8d93ad..8388ebf7 100644 --- a/overlord/src/app/account/account-routing.module.ts +++ b/overlord/src/app/account/account.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver'; @@ -11,7 +9,7 @@ import { accountListResolver } from './account-list.resolver'; import { accountTypeResolver } from './account-type.resolver'; import { accountResolver } from './account.resolver'; -const accountRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: AccountListComponent, @@ -51,9 +49,3 @@ const accountRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(accountRoutes)], - exports: [RouterModule], -}) -export class AccountRoutingModule {} diff --git a/overlord/src/app/app-routing.module.spec.ts b/overlord/src/app/app-routing.module.spec.ts deleted file mode 100644 index d68ef067..00000000 --- a/overlord/src/app/app-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRoutingModule } from './app-routing.module'; - -describe('AppRoutingModule', () => { - let appRoutingModule: AppRoutingModule; - - beforeEach(() => { - appRoutingModule = new AppRoutingModule(); - }); - - it('should create an instance', () => { - expect(appRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/app-routing.module.ts b/overlord/src/app/app-routing.module.ts deleted file mode 100644 index e4cda8e9..00000000 --- a/overlord/src/app/app-routing.module.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { LoginComponent } from './auth/login/login.component'; -import { LogoutComponent } from './auth/logout/logout.component'; -import { HomeComponent } from './home/home.component'; - -const appRoutes: Routes = [ - { - path: 'accounts', - loadChildren: () => import('./account/account.module').then((mod) => mod.AccountModule), - }, - { - path: 'attendance', - loadChildren: () => import('./attendance/attendance.module').then((mod) => mod.AttendanceModule), - }, - { - path: 'balance-sheet', - loadChildren: () => import('./balance-sheet/balance-sheet.module').then((mod) => mod.BalanceSheetModule), - }, - { - path: 'batch-integrity-report', - loadChildren: () => - import('./batch-integrity-report/batch-integrity-report.module').then((mod) => mod.BatchIntegrityReportModule), - }, - { - path: 'cash-flow', - loadChildren: () => import('./cash-flow/cash-flow.module').then((mod) => mod.CashFlowModule), - }, - { - path: 'clients', - loadChildren: () => import('./client/client.module').then((mod) => mod.ClientModule), - }, - { - path: 'closing-stock', - loadChildren: () => import('./closing-stock/closing-stock.module').then((mod) => mod.ClosingStockModule), - }, - { - path: 'cost-centres', - loadChildren: () => import('./cost-centre/cost-centre.module').then((mod) => mod.CostCentreModule), - }, - { - path: 'daybook', - loadChildren: () => import('./daybook/daybook.module').then((mod) => mod.DaybookModule), - }, - { - path: 'employees', - loadChildren: () => import('./employee/employee.module').then((mod) => mod.EmployeeModule), - }, - { - path: 'employee-attendance', - loadChildren: () => - import('./employee-attendance/employee-attendance.module').then((mod) => mod.EmployeeAttendanceModule), - }, - { - path: 'employee-benefits', - loadChildren: () => - import('./employee-benefits/employee-benefits.module').then((mod) => mod.EmployeeBenefitsModule), - }, - { - path: 'employee-functions', - loadChildren: () => - import('./employee-functions/employee-functions.module').then((mod) => mod.EmployeeFunctionsModule), - }, - { - path: 'rate-contracts', - loadChildren: () => import('./rate-contract/rate-contract.module').then((mod) => mod.RateContractModule), - }, - { - path: 'recipes', - loadChildren: () => import('./recipe/recipe.module').then((mod) => mod.RecipeModule), - }, - { - path: 'recipe-templates', - loadChildren: () => import('./recipe-template/recipe-template.module').then((mod) => mod.RecipeTemplateModule), - }, - { - path: 'roles', - loadChildren: () => import('./role/role.module').then((mod) => mod.RoleModule), - }, - { - path: 'incentive', - loadChildren: () => import('./incentive/incentive.module').then((mod) => mod.IncentiveModule), - }, - { - path: 'issue', - loadChildren: () => import('./issue/issue.module').then((mod) => mod.IssueModule), - }, - { - path: 'journal', - loadChildren: () => import('./journal/journal.module').then((mod) => mod.JournalModule), - }, - { - path: 'ledger', - loadChildren: () => import('./ledger/ledger.module').then((mod) => mod.LedgerModule), - }, - { - path: 'net-transactions', - loadChildren: () => import('./net-transactions/net-transactions.module').then((mod) => mod.NetTransactionsModule), - }, - { - path: 'non-contract-purchase', - loadChildren: () => - import('./non-contact-purchase/non-contract-purchase.module').then((mod) => mod.NonContractPurchaseModule), - }, - { - path: 'payment', - loadChildren: () => import('./payment/payment.module').then((mod) => mod.PaymentModule), - }, - { - path: 'periods', - loadChildren: () => import('./period/period.module').then((mod) => mod.PeriodModule), - }, - { - path: 'products', - loadChildren: () => import('./product/product.module').then((mod) => mod.ProductModule), - }, - { - path: 'product-groups', - loadChildren: () => import('./product-group/product-group.module').then((mod) => mod.ProductGroupModule), - }, - { - path: 'product-ledger', - loadChildren: () => import('./product-ledger/product-ledger.module').then((mod) => mod.ProductLedgerModule), - }, - { - path: 'profit-loss', - loadChildren: () => import('./profit-loss/profit-loss.module').then((mod) => mod.ProfitLossModule), - }, - { - path: 'purchase', - loadChildren: () => import('./purchase/purchase.module').then((mod) => mod.PurchaseModule), - }, - { - path: 'purchase-entries', - loadChildren: () => import('./purchase-entries/purchase-entries.module').then((mod) => mod.PurchaseEntriesModule), - }, - { - path: 'purchases', - loadChildren: () => import('./purchases/purchases.module').then((mod) => mod.PurchasesModule), - }, - { - path: 'raw-material-cost', - loadChildren: () => import('./raw-material-cost/raw-material-cost.module').then((mod) => mod.RawMaterialCostModule), - }, - { - path: 'receipt', - loadChildren: () => import('./receipt/receipt.module').then((mod) => mod.ReceiptModule), - }, - { - path: 'purchase-return', - loadChildren: () => import('./purchase-return/purchase-return.module').then((mod) => mod.PurchaseReturnModule), - }, - { - path: 'settings', - loadChildren: () => import('./settings/settings.module').then((mod) => mod.SettingsModule), - }, - { - path: 'stock-movement', - loadChildren: () => import('./stock-movement/stock-movement.module').then((mod) => mod.StockMovementModule), - }, - { - path: 'trial-balance', - loadChildren: () => import('./trial-balance/trial-balance.module').then((mod) => mod.TrialBalanceModule), - }, - { - path: 'entries', - loadChildren: () => import('./entries/entries.module').then((mod) => mod.EntriesModule), - }, - { - path: 'users', - loadChildren: () => import('./user/user.module').then((mod) => mod.UserModule), - }, - { path: 'login', component: LoginComponent }, - { path: 'logout', component: LogoutComponent }, - { path: '', component: HomeComponent }, -]; - -@NgModule({ - imports: [ - CommonModule, - RouterModule.forRoot(appRoutes, { - onSameUrlNavigation: 'reload', - }), - ], - exports: [RouterModule], - declarations: [], -}) -export class AppRoutingModule {} diff --git a/overlord/src/app/app.component.spec.ts b/overlord/src/app/app.component.spec.ts index cd8bc964..ae0e555c 100644 --- a/overlord/src/app/app.component.spec.ts +++ b/overlord/src/app/app.component.spec.ts @@ -1,27 +1,27 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { AppComponent } from './app.component'; describe('AppComponent', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [AppComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent], }).compileComponents(); - })); - it('should create the app', waitForAsync(() => { + }); + it('should create the app', () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; expect(app).toBeTruthy(); - })); - it(`should have as title 'app'`, waitForAsync(() => { + }); + it(`should have as title 'app'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; expect(app.title).toEqual('app'); - })); - it('should render title in a h1 tag', waitForAsync(() => { + }); + it('should render title in a h1 tag', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.debugElement.nativeElement; expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); - })); + }); }); diff --git a/overlord/src/app/app.component.ts b/overlord/src/app/app.component.ts index 5c65edda..f7d2a345 100644 --- a/overlord/src/app/app.component.ts +++ b/overlord/src/app/app.component.ts @@ -1,9 +1,15 @@ import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { LoadingBarModule } from '@ngx-loading-bar/core'; + +import { NavBarComponent } from './core/nav-bar/nav-bar.component'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], + standalone: true, + imports: [LoadingBarModule, NavBarComponent, RouterOutlet], }) export class AppComponent { title = 'app'; diff --git a/overlord/src/app/app.config.ts b/overlord/src/app/app.config.ts new file mode 100644 index 00000000..32b40bdf --- /dev/null +++ b/overlord/src/app/app.config.ts @@ -0,0 +1,68 @@ +import { LayoutModule } from '@angular/cdk/layout'; +import { provideHttpClient, withInterceptors } from '@angular/common/http'; +import { LOCALE_ID, importProvidersFrom, ApplicationConfig } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; +import { BrowserModule } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { provideRouter, withRouterConfig } from '@angular/router'; +import { HotkeyModule } from 'angular2-hotkeys'; + +import { dateFormat } from './app.environment'; +import { routes } from './app.routes'; +import { AuthService } from './auth/auth.service'; +import { authInterceptor } from './core/auth.interceptor'; +import { jwtInterceptor } from './core/jwt.interceptor'; +import { refreshInterceptor } from './core/refresh.interceptor'; + +export const appConfig: ApplicationConfig = { + providers: [ + importProvidersFrom( + BrowserModule, + HotkeyModule.forRoot(), + LayoutModule, + MatButtonModule, + MatCardModule, + MatDividerModule, + MatIconModule, + MatInputModule, + MatSidenavModule, + MatToolbarModule, + MatListModule, + MatMenuModule, + MatProgressSpinnerModule, + MatSnackBarModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + ReactiveFormsModule, + ), + { provide: LOCALE_ID, useValue: 'en-IN' }, + AuthService, + provideHttpClient(withInterceptors([refreshInterceptor, jwtInterceptor, authInterceptor])), + provideAnimations(), + provideRouter( + routes, + withRouterConfig({ + onSameUrlNavigation: 'reload', + }), + ), + { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, + { provide: MAT_DATE_FORMATS, useValue: dateFormat }, + ], +}; diff --git a/overlord/src/app/app.environment.ts b/overlord/src/app/app.environment.ts new file mode 100644 index 00000000..001c371e --- /dev/null +++ b/overlord/src/app/app.environment.ts @@ -0,0 +1,18 @@ +export const environment = { + // eslint-disable-next-line @typescript-eslint/naming-convention + ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry + version: '12.1.1', + title: 'HnG / TGB', +}; + +export const dateFormat = { + parse: { + dateInput: 'DD-MMM-YYYY', + }, + display: { + dateInput: 'DD-MMM-YYYY', + monthYearLabel: 'MMM YYYY', + dateA11yLabel: 'DD-MMM-YYYY', + monthYearA11yLabel: 'MMM YYYY', + }, +}; diff --git a/overlord/src/app/app.module.ts b/overlord/src/app/app.module.ts deleted file mode 100644 index 13938a3e..00000000 --- a/overlord/src/app/app.module.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { LayoutModule } from '@angular/cdk/layout'; -import { registerLocaleData } from '@angular/common'; -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import enIN from '@angular/common/locales/en-IN'; -import { LOCALE_ID, NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { AuthService } from './auth/auth.service'; -import { LoginComponent } from './auth/login/login.component'; -import { LogoutComponent } from './auth/logout/logout.component'; -import { CoreModule } from './core/core.module'; -import { HomeComponent } from './home/home.component'; -import { SharedModule } from './shared/shared.module'; - -registerLocaleData(enIN); - -@NgModule({ - declarations: [AppComponent, LoginComponent, LogoutComponent, HomeComponent], - bootstrap: [AppComponent], - imports: [ - BrowserModule, - BrowserAnimationsModule, - HotkeyModule.forRoot(), - LayoutModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatSidenavModule, - MatToolbarModule, - MatListModule, - MatMenuModule, - MatProgressSpinnerModule, - MatSnackBarModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - ReactiveFormsModule, - SharedModule, - CoreModule, - AppRoutingModule, - ], - providers: [{ provide: LOCALE_ID, useValue: 'en-IN' }, AuthService, provideHttpClient(withInterceptorsFromDi())], -}) -export class AppModule {} diff --git a/overlord/src/app/app.routes.ts b/overlord/src/app/app.routes.ts new file mode 100644 index 00000000..4736d600 --- /dev/null +++ b/overlord/src/app/app.routes.ts @@ -0,0 +1,171 @@ +import { Routes } from '@angular/router'; + +import { LoginComponent } from './auth/login/login.component'; +import { LogoutComponent } from './auth/logout/logout.component'; +import { HomeComponent } from './home/home.component'; + +export const routes: Routes = [ + { + path: 'accounts', + loadChildren: () => import('./account/account.routes').then((mod) => mod.routes), + }, + { + path: 'attendance', + loadChildren: () => import('./attendance/attendance.routes').then((mod) => mod.routes), + }, + { + path: 'balance-sheet', + loadChildren: () => import('./balance-sheet/balance-sheet.routes').then((mod) => mod.routes), + }, + { + path: 'batch-integrity-report', + loadChildren: () => import('./batch-integrity-report/batch-integrity-report.routes').then((mod) => mod.routes), + }, + { + path: 'cash-flow', + loadChildren: () => import('./cash-flow/cash-flow.routes').then((mod) => mod.routes), + }, + { + path: 'clients', + loadChildren: () => import('./client/client.routes').then((mod) => mod.routes), + }, + { + path: 'closing-stock', + loadChildren: () => import('./closing-stock/closing-stock.routes').then((mod) => mod.routes), + }, + { + path: 'cost-centres', + loadChildren: () => import('./cost-centre/cost-centre.routes').then((mod) => mod.routes), + }, + { + path: 'daybook', + loadChildren: () => import('./daybook/daybook.routes').then((mod) => mod.routes), + }, + { + path: 'employees', + loadChildren: () => import('./employee/employee.routes').then((mod) => mod.routes), + }, + { + path: 'employee-attendance', + loadChildren: () => import('./employee-attendance/employee-attendance.routes').then((mod) => mod.routes), + }, + { + path: 'employee-benefits', + loadChildren: () => import('./employee-benefits/employee-benefits.routes').then((mod) => mod.routes), + }, + { + path: 'employee-functions', + loadChildren: () => import('./employee-functions/employee-functions.routes').then((mod) => mod.routes), + }, + { + path: 'rate-contracts', + loadChildren: () => import('./rate-contract/rate-contract.routes').then((mod) => mod.routes), + }, + { + path: 'recipes', + loadChildren: () => import('./recipe/recipe.routes').then((mod) => mod.routes), + }, + { + path: 'recipe-templates', + loadChildren: () => import('./recipe-template/recipe-template.routes').then((mod) => mod.routes), + }, + { + path: 'roles', + loadChildren: () => import('./role/role.routes').then((mod) => mod.routes), + }, + { + path: 'incentive', + loadChildren: () => import('./incentive/incentive.routes').then((mod) => mod.routes), + }, + { + path: 'issue', + loadChildren: () => import('./issue/issue.routes').then((mod) => mod.routes), + }, + { + path: 'journal', + loadChildren: () => import('./journal/journal.routes').then((mod) => mod.routes), + }, + { + path: 'ledger', + loadChildren: () => import('./ledger/ledger.routes').then((mod) => mod.routes), + }, + { + path: 'net-transactions', + loadChildren: () => import('./net-transactions/net-transactions.routes').then((mod) => mod.routes), + }, + { + path: 'non-contract-purchase', + loadChildren: () => import('./non-contact-purchase/non-contract-purchase.routes').then((mod) => mod.routes), + }, + { + path: 'payment', + loadChildren: () => import('./payment/payment.routes').then((mod) => mod.routes), + }, + { + path: 'periods', + loadChildren: () => import('./period/period.routes').then((mod) => mod.routes), + }, + { + path: 'products', + loadChildren: () => import('./product/product.routes').then((mod) => mod.routes), + }, + { + path: 'product-groups', + loadChildren: () => import('./product-group/product-group.routes').then((mod) => mod.routes), + }, + { + path: 'product-ledger', + loadChildren: () => import('./product-ledger/product-ledger.routes').then((mod) => mod.routes), + }, + { + path: 'profit-loss', + loadChildren: () => import('./profit-loss/profit-loss.routes').then((mod) => mod.routes), + }, + { + path: 'purchase', + loadChildren: () => import('./purchase/purchase.routes').then((mod) => mod.routes), + }, + { + path: 'purchase-entries', + loadChildren: () => import('./purchase-entries/purchase-entries.routes').then((mod) => mod.routes), + }, + { + path: 'purchases', + loadChildren: () => import('./purchases/purchases.routes').then((mod) => mod.routes), + }, + { + path: 'raw-material-cost', + loadChildren: () => import('./raw-material-cost/raw-material-cost.routes').then((mod) => mod.routes), + }, + { + path: 'receipt', + loadChildren: () => import('./receipt/receipt.routes').then((mod) => mod.routes), + }, + { + path: 'purchase-return', + loadChildren: () => import('./purchase-return/purchase-return.routes').then((mod) => mod.routes), + }, + { + path: 'settings', + loadChildren: () => import('./settings/settings.routes').then((mod) => mod.routes), + }, + { + path: 'stock-movement', + loadChildren: () => import('./stock-movement/stock-movement.routes').then((mod) => mod.routes), + }, + { + path: 'trial-balance', + loadChildren: () => import('./trial-balance/trial-balance.routes').then((mod) => mod.routes), + }, + { + path: 'entries', + loadChildren: () => import('./entries/entries.routes').then((mod) => mod.routes), + }, + { + path: 'users', + loadChildren: () => import('./user/user.routes').then((mod) => mod.routes), + }, + { path: 'login', component: LoginComponent }, + { path: 'logout', component: LogoutComponent }, + { path: '', component: HomeComponent }, +]; diff --git a/overlord/src/app/attendance/attendance-routing.module.spec.ts b/overlord/src/app/attendance/attendance-routing.module.spec.ts deleted file mode 100644 index 59b43617..00000000 --- a/overlord/src/app/attendance/attendance-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AttendanceRoutingModule } from './attendance-routing.module'; - -describe('AttendanceRoutingModule', () => { - let attendanceRoutingModule: AttendanceRoutingModule; - - beforeEach(() => { - attendanceRoutingModule = new AttendanceRoutingModule(); - }); - - it('should create an instance', () => { - expect(attendanceRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/attendance/attendance.component.spec.ts b/overlord/src/app/attendance/attendance.component.spec.ts index 17342165..a9aba6a2 100644 --- a/overlord/src/app/attendance/attendance.component.spec.ts +++ b/overlord/src/app/attendance/attendance.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AttendanceComponent } from './attendance.component'; @@ -9,14 +6,11 @@ describe('AttendanceComponent', () => { let component: AttendanceComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [AttendanceComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AttendanceComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(AttendanceComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/attendance/attendance.component.ts b/overlord/src/app/attendance/attendance.component.ts index 37260427..bc1a91b7 100644 --- a/overlord/src/app/attendance/attendance.component.ts +++ b/overlord/src/app/attendance/attendance.component.ts @@ -1,6 +1,27 @@ import { Component, OnInit } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatChipSet, MatChipOption } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject } from 'rxjs'; @@ -18,6 +39,38 @@ import { AttendanceService } from './attendance.service'; selector: 'app-attendance', templateUrl: './attendance.component.html', styleUrls: ['./attendance.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatSelect, + MatOption, + MatIcon, + MatChipSet, + MatChipOption, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + ], }) export class AttendanceComponent implements OnInit { public attendanceObservable = new BehaviorSubject([]); @@ -83,14 +136,14 @@ export class AttendanceComponent implements OnInit { } save() { - this.ser.save(this.getAttendance()).subscribe( - () => { + this.ser.save(this.getAttendance()).subscribe({ + next: () => { this.toaster.show('Success', ''); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getAttendance(): Attendance { diff --git a/overlord/src/app/attendance/attendance.module.spec.ts b/overlord/src/app/attendance/attendance.module.spec.ts deleted file mode 100644 index 9d6f1a54..00000000 --- a/overlord/src/app/attendance/attendance.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AttendanceModule } from './attendance.module'; - -describe('AttendanceModule', () => { - let attendanceModule: AttendanceModule; - - beforeEach(() => { - attendanceModule = new AttendanceModule(); - }); - - it('should create an instance', () => { - expect(attendanceModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/attendance/attendance.module.ts b/overlord/src/app/attendance/attendance.module.ts deleted file mode 100644 index 4066e626..00000000 --- a/overlord/src/app/attendance/attendance.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { AttendanceRoutingModule } from './attendance-routing.module'; -import { AttendanceComponent } from './attendance.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - AttendanceRoutingModule, - ], - declarations: [AttendanceComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class AttendanceModule {} diff --git a/overlord/src/app/attendance/attendance-routing.module.ts b/overlord/src/app/attendance/attendance.routes.ts similarity index 71% rename from overlord/src/app/attendance/attendance-routing.module.ts rename to overlord/src/app/attendance/attendance.routes.ts index a012b840..8d9d93f7 100644 --- a/overlord/src/app/attendance/attendance-routing.module.ts +++ b/overlord/src/app/attendance/attendance.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -8,7 +6,7 @@ import { attendanceTypeResolver } from './attendance-type.resolver'; import { AttendanceComponent } from './attendance.component'; import { attendanceResolver } from './attendance.resolver'; -const attendanceRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: AttendanceComponent, @@ -36,9 +34,3 @@ const attendanceRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(attendanceRoutes)], - exports: [RouterModule], -}) -export class AttendanceRoutingModule {} diff --git a/overlord/src/app/auth/auth.service.ts b/overlord/src/app/auth/auth.service.ts index d495ef91..af18a985 100644 --- a/overlord/src/app/auth/auth.service.ts +++ b/overlord/src/app/auth/auth.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { environment } from '../../environments/environment'; +import { environment } from '../app.environment'; import { User } from '../core/user'; const loginUrl = '/token'; @@ -14,6 +14,7 @@ const JWT_USER = 'JWT_USER'; export class AuthService { public currentUser: Observable; private currentUserSubject: BehaviorSubject = new BehaviorSubject(null); + public isRefreshing = false; constructor(private http: HttpClient) { this.checkStorage(); @@ -82,19 +83,17 @@ export class AuthService { formData.append('password', password); formData.append('otp', '' + otp); formData.append('grant_type', 'password'); - return this.http - .post<{ access_token: string; token_type: string }>(loginUrl, formData) - .pipe(map((u) => u.access_token)) - .pipe(map((u) => AuthService.parseJwt(u))) - .pipe( - map((user) => { - // Store user details and jwt token in local storage - // to keep user logged in between page refreshes - localStorage.setItem(JWT_USER, JSON.stringify(user)); - this.currentUserSubject.next(user); - return user; - }), - ); + return this.http.post<{ access_token: string; token_type: string }>(loginUrl, formData).pipe( + map((u) => u.access_token), + map((u) => AuthService.parseJwt(u)), + map((user) => { + // Store user details and jwt token in local storage + // to keep user logged in between page refreshes + localStorage.setItem(JWT_USER, JSON.stringify(user)); + this.currentUserSubject.next(user); + return user; + }), + ); } needsRefreshing(): boolean { @@ -112,19 +111,17 @@ export class AuthService { } refreshToken() { - return this.http - .post<{ access_token: string; token_type: string }>(refreshUrl, {}) - .pipe(map((u) => u.access_token)) - .pipe(map((u) => AuthService.parseJwt(u))) - .pipe( - map((user) => { - // Store user details and jwt token in local storage - // to keep user logged in between page refreshes - localStorage.setItem(JWT_USER, JSON.stringify(user)); - this.currentUserSubject.next(user); - return user; - }), - ); + return this.http.post<{ access_token: string; token_type: string }>(refreshUrl, {}).pipe( + map((u) => u.access_token), + map((u) => AuthService.parseJwt(u)), + map((user) => { + // Store user details and jwt token in local storage + // to keep user logged in between page refreshes + localStorage.setItem(JWT_USER, JSON.stringify(user)); + this.currentUserSubject.next(user); + return user; + }), + ); } allowed(permission: string): boolean { diff --git a/overlord/src/app/auth/login/login.component.spec.ts b/overlord/src/app/auth/login/login.component.spec.ts index e962a3f4..251a67f8 100644 --- a/overlord/src/app/auth/login/login.component.spec.ts +++ b/overlord/src/app/auth/login/login.component.spec.ts @@ -1,6 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { LoginComponent } from './login.component'; @@ -8,15 +6,11 @@ describe('LoginComponent', () => { let component: LoginComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [LoginComponent], - imports: [RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [LoginComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(LoginComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/auth/login/login.component.ts b/overlord/src/app/auth/login/login.component.ts index 1c38aac8..81496046 100644 --- a/overlord/src/app/auth/login/login.component.ts +++ b/overlord/src/app/auth/login/login.component.ts @@ -1,5 +1,11 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -10,6 +16,22 @@ import { AuthService } from '../auth.service'; selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatIcon, + MatSuffix, + MatDivider, + MatCardActions, + MatButton, + ], }) export class LoginComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -60,17 +82,17 @@ export class LoginComponent implements OnInit, AfterViewInit { this.auth .login(username, password, otp) // .pipe(first()) - .subscribe( - () => { + .subscribe({ + next: () => { this.router.navigateByUrl(this.returnUrl); }, - (error) => { + error: (error) => { if (error.status === 401 && error.error.detail === 'Client is not registered') { this.showOtp = true; this.clientId = this.cs.getCookie('client_id'); } this.toaster.show('Danger', error.error.details); }, - ); + }); } } diff --git a/overlord/src/app/auth/logout/logout.component.spec.ts b/overlord/src/app/auth/logout/logout.component.spec.ts index 36b2ed8f..308c7d91 100644 --- a/overlord/src/app/auth/logout/logout.component.spec.ts +++ b/overlord/src/app/auth/logout/logout.component.spec.ts @@ -1,6 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { LogoutComponent } from './logout.component'; @@ -8,15 +6,11 @@ describe('LogoutComponent', () => { let component: LogoutComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [LogoutComponent], - imports: [RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [LogoutComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(LogoutComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/auth/logout/logout.component.ts b/overlord/src/app/auth/logout/logout.component.ts index 47dcc34d..1d36fb13 100644 --- a/overlord/src/app/auth/logout/logout.component.ts +++ b/overlord/src/app/auth/logout/logout.component.ts @@ -7,6 +7,7 @@ import { AuthService } from '../auth.service'; @Component({ selector: 'app-logout', template: '', + standalone: true, }) export class LogoutComponent implements OnInit { constructor( diff --git a/overlord/src/app/balance-sheet/balance-sheet-routing.module.spec.ts b/overlord/src/app/balance-sheet/balance-sheet-routing.module.spec.ts deleted file mode 100644 index 0d707c1c..00000000 --- a/overlord/src/app/balance-sheet/balance-sheet-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BalanceSheetRoutingModule } from './balance-sheet-routing.module'; - -describe('BalanceSheetRoutingModule', () => { - let balanceSheetRoutingModule: BalanceSheetRoutingModule; - - beforeEach(() => { - balanceSheetRoutingModule = new BalanceSheetRoutingModule(); - }); - - it('should create an instance', () => { - expect(balanceSheetRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/balance-sheet/balance-sheet.component.spec.ts b/overlord/src/app/balance-sheet/balance-sheet.component.spec.ts index 82cc5aad..0edef824 100644 --- a/overlord/src/app/balance-sheet/balance-sheet.component.spec.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BalanceSheetComponent } from './balance-sheet.component'; @@ -8,14 +6,11 @@ describe('BalanceSheetComponent', () => { let component: BalanceSheetComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [BalanceSheetComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BalanceSheetComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(BalanceSheetComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/balance-sheet/balance-sheet.component.ts b/overlord/src/app/balance-sheet/balance-sheet.component.ts index 832e0026..878cd178 100644 --- a/overlord/src/app/balance-sheet/balance-sheet.component.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.component.ts @@ -1,10 +1,34 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; +import { ClearPipe } from '../shared/clear.pipe'; + import { BalanceSheet } from './balance-sheet'; import { BalanceSheetDataSource } from './balance-sheet-datasource'; @@ -12,6 +36,41 @@ import { BalanceSheetDataSource } from './balance-sheet-datasource'; selector: 'app-balance-sheet', templateUrl: './balance-sheet.component.html', styleUrls: ['./balance-sheet.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatPaginator, + CurrencyPipe, + ClearPipe, + ], }) export class BalanceSheetComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/balance-sheet/balance-sheet.module.spec.ts b/overlord/src/app/balance-sheet/balance-sheet.module.spec.ts deleted file mode 100644 index 32d2fdd7..00000000 --- a/overlord/src/app/balance-sheet/balance-sheet.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BalanceSheetModule } from './balance-sheet.module'; - -describe('BalanceSheetModule', () => { - let balanceSheetModule: BalanceSheetModule; - - beforeEach(() => { - balanceSheetModule = new BalanceSheetModule(); - }); - - it('should create an instance', () => { - expect(balanceSheetModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/balance-sheet/balance-sheet.module.ts b/overlord/src/app/balance-sheet/balance-sheet.module.ts deleted file mode 100644 index 34317b42..00000000 --- a/overlord/src/app/balance-sheet/balance-sheet.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { BalanceSheetRoutingModule } from './balance-sheet-routing.module'; -import { BalanceSheetComponent } from './balance-sheet.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - BalanceSheetRoutingModule, - ], - declarations: [BalanceSheetComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class BalanceSheetModule {} diff --git a/overlord/src/app/balance-sheet/balance-sheet-routing.module.ts b/overlord/src/app/balance-sheet/balance-sheet.routes.ts similarity index 66% rename from overlord/src/app/balance-sheet/balance-sheet-routing.module.ts rename to overlord/src/app/balance-sheet/balance-sheet.routes.ts index b06903eb..da4178c4 100644 --- a/overlord/src/app/balance-sheet/balance-sheet-routing.module.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { BalanceSheetComponent } from './balance-sheet.component'; import { balanceSheetResolver } from './balance-sheet.resolver'; -const balanceSheetRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: BalanceSheetComponent, @@ -33,9 +31,3 @@ const balanceSheetRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(balanceSheetRoutes)], - exports: [RouterModule], -}) -export class BalanceSheetRoutingModule {} diff --git a/overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.spec.ts b/overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.spec.ts deleted file mode 100644 index 5eb39c4e..00000000 --- a/overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BatchIntegrityReportRoutingModule } from './batch-integrity-report-routing.module'; - -describe('BatchIntegrityRoutingModule', () => { - let batchIntegrityRoutingModule: BatchIntegrityReportRoutingModule; - - beforeEach(() => { - batchIntegrityRoutingModule = new BatchIntegrityReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(batchIntegrityRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/batch-integrity-report/batch-integrity-report.component.spec.ts b/overlord/src/app/batch-integrity-report/batch-integrity-report.component.spec.ts index d636c6e3..d77ded1f 100644 --- a/overlord/src/app/batch-integrity-report/batch-integrity-report.component.spec.ts +++ b/overlord/src/app/batch-integrity-report/batch-integrity-report.component.spec.ts @@ -1,6 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BatchIntegrityReportComponent } from './batch-integrity-report.component'; @@ -8,15 +6,11 @@ describe('BatchIntegrityComponent', () => { let component: BatchIntegrityReportComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [BatchIntegrityReportComponent], - imports: [RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BatchIntegrityReportComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(BatchIntegrityReportComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/batch-integrity-report/batch-integrity-report.component.ts b/overlord/src/app/batch-integrity-report/batch-integrity-report.component.ts index d2666811..a5ae0583 100644 --- a/overlord/src/app/batch-integrity-report/batch-integrity-report.component.ts +++ b/overlord/src/app/batch-integrity-report/batch-integrity-report.component.ts @@ -1,5 +1,19 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BatchIntegrity } from './batch-integrity'; import { BatchIntegrityReportDatasource } from './batch-integrity-report-datasource'; @@ -8,6 +22,25 @@ import { BatchIntegrityReportDatasource } from './batch-integrity-report-datasou selector: 'app-batch-integrity', templateUrl: './batch-integrity-report.component.html', styleUrls: ['./batch-integrity-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class BatchIntegrityReportComponent implements OnInit { info: BatchIntegrity[] = []; diff --git a/overlord/src/app/batch-integrity-report/batch-integrity-report.module.spec.ts b/overlord/src/app/batch-integrity-report/batch-integrity-report.module.spec.ts deleted file mode 100644 index f0a5b5db..00000000 --- a/overlord/src/app/batch-integrity-report/batch-integrity-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BatchIntegrityReportModule } from './batch-integrity-report.module'; - -describe('BatchIntegrityModule', () => { - let batchIntegrityModule: BatchIntegrityReportModule; - - beforeEach(() => { - batchIntegrityModule = new BatchIntegrityReportModule(); - }); - - it('should create an instance', () => { - expect(batchIntegrityModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/batch-integrity-report/batch-integrity-report.module.ts b/overlord/src/app/batch-integrity-report/batch-integrity-report.module.ts deleted file mode 100644 index c7694f0a..00000000 --- a/overlord/src/app/batch-integrity-report/batch-integrity-report.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { BatchIntegrityReportRoutingModule } from './batch-integrity-report-routing.module'; -import { BatchIntegrityReportComponent } from './batch-integrity-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSortModule, - MatTableModule, - SharedModule, - BatchIntegrityReportRoutingModule, - MatExpansionModule, - MatDatepickerModule, - ReactiveFormsModule, - ], - declarations: [BatchIntegrityReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class BatchIntegrityReportModule {} diff --git a/overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.ts b/overlord/src/app/batch-integrity-report/batch-integrity-report.routes.ts similarity index 57% rename from overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.ts rename to overlord/src/app/batch-integrity-report/batch-integrity-report.routes.ts index 6afa039f..6cd5ab41 100644 --- a/overlord/src/app/batch-integrity-report/batch-integrity-report-routing.module.ts +++ b/overlord/src/app/batch-integrity-report/batch-integrity-report.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { BatchIntegrityReportComponent } from './batch-integrity-report.component'; import { batchIntegrityResolver } from './batch-integrity.resolver'; -const batchIntegrityRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: BatchIntegrityReportComponent, @@ -21,9 +19,3 @@ const batchIntegrityRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(batchIntegrityRoutes)], - exports: [RouterModule], -}) -export class BatchIntegrityReportRoutingModule {} diff --git a/overlord/src/app/cash-flow/cash-flow-routing.module.spec.ts b/overlord/src/app/cash-flow/cash-flow-routing.module.spec.ts deleted file mode 100644 index 6737c932..00000000 --- a/overlord/src/app/cash-flow/cash-flow-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CashFlowRoutingModule } from './cash-flow-routing.module'; - -describe('CashFlowRoutingModule', () => { - let cashFlowRoutingModule: CashFlowRoutingModule; - - beforeEach(() => { - cashFlowRoutingModule = new CashFlowRoutingModule(); - }); - - it('should create an instance', () => { - expect(cashFlowRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/cash-flow/cash-flow.component.spec.ts b/overlord/src/app/cash-flow/cash-flow.component.spec.ts index ab507574..8d425810 100644 --- a/overlord/src/app/cash-flow/cash-flow.component.spec.ts +++ b/overlord/src/app/cash-flow/cash-flow.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CashFlowComponent } from './cash-flow.component'; @@ -8,14 +6,11 @@ describe('CashFlowComponent', () => { let component: CashFlowComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [CashFlowComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [CashFlowComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(CashFlowComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/cash-flow/cash-flow.component.ts b/overlord/src/app/cash-flow/cash-flow.component.ts index cc8d17ec..eeb11473 100644 --- a/overlord/src/app/cash-flow/cash-flow.component.ts +++ b/overlord/src/app/cash-flow/cash-flow.component.ts @@ -1,8 +1,29 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; +import { ClearPipe } from '../shared/clear.pipe'; + import { CashFlow } from './cash-flow'; import { CashFlowDataSource } from './cash-flow-datasource'; @@ -10,6 +31,37 @@ import { CashFlowDataSource } from './cash-flow-datasource'; selector: 'app-cash-flow', templateUrl: './cash-flow.component.html', styleUrls: ['./cash-flow.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ClearPipe, + ], }) export class CashFlowComponent implements OnInit { info: CashFlow = new CashFlow(); diff --git a/overlord/src/app/cash-flow/cash-flow.module.spec.ts b/overlord/src/app/cash-flow/cash-flow.module.spec.ts deleted file mode 100644 index b3af9470..00000000 --- a/overlord/src/app/cash-flow/cash-flow.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CashFlowModule } from './cash-flow.module'; - -describe('CashFlowModule', () => { - let cashFlowModule: CashFlowModule; - - beforeEach(() => { - cashFlowModule = new CashFlowModule(); - }); - - it('should create an instance', () => { - expect(cashFlowModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/cash-flow/cash-flow.module.ts b/overlord/src/app/cash-flow/cash-flow.module.ts deleted file mode 100644 index 60d4d0f1..00000000 --- a/overlord/src/app/cash-flow/cash-flow.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { CashFlowRoutingModule } from './cash-flow-routing.module'; -import { CashFlowComponent } from './cash-flow.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - CashFlowRoutingModule, - ], - declarations: [CashFlowComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class CashFlowModule {} diff --git a/overlord/src/app/cash-flow/cash-flow-routing.module.ts b/overlord/src/app/cash-flow/cash-flow.routes.ts similarity index 66% rename from overlord/src/app/cash-flow/cash-flow-routing.module.ts rename to overlord/src/app/cash-flow/cash-flow.routes.ts index 47fcc869..44b29cfa 100644 --- a/overlord/src/app/cash-flow/cash-flow-routing.module.ts +++ b/overlord/src/app/cash-flow/cash-flow.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { CashFlowComponent } from './cash-flow.component'; import { cashFlowResolver } from './cash-flow.resolver'; -const cashFlowRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: CashFlowComponent, @@ -33,9 +31,3 @@ const cashFlowRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(cashFlowRoutes)], - exports: [RouterModule], -}) -export class CashFlowRoutingModule {} diff --git a/overlord/src/app/client/client-detail/client-detail.component.spec.ts b/overlord/src/app/client/client-detail/client-detail.component.spec.ts index 14936831..80a892c0 100644 --- a/overlord/src/app/client/client-detail/client-detail.component.spec.ts +++ b/overlord/src/app/client/client-detail/client-detail.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ClientDetailComponent } from './client-detail.component'; @@ -9,14 +6,11 @@ describe('ClientDetailComponent', () => { let component: ClientDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [ClientDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ClientDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ClientDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/client/client-detail/client-detail.component.ts b/overlord/src/app/client/client-detail/client-detail.component.ts index 9d1a2313..0abf5d0d 100644 --- a/overlord/src/app/client/client-detail/client-detail.component.ts +++ b/overlord/src/app/client/client-detail/client-detail.component.ts @@ -1,6 +1,11 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -12,6 +17,20 @@ import { ClientService } from '../client.service'; selector: 'app-client-detail', templateUrl: './client-detail.component.html', styleUrls: ['./client-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class ClientDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -66,27 +85,27 @@ export class ClientDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.update(this.getItem()).subscribe( - () => { + this.ser.update(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/clients'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id).subscribe( - () => { + this.ser.delete(this.item.id).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/clients'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/client/client-list/client-list.component.spec.ts b/overlord/src/app/client/client-list/client-list.component.spec.ts index 44250781..47d88b16 100644 --- a/overlord/src/app/client/client-list/client-list.component.spec.ts +++ b/overlord/src/app/client/client-list/client-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { ClientListComponent } from './client-list.component'; @@ -9,8 +8,7 @@ describe('ClientListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [ClientListComponent], + imports: [RouterTestingModule, ClientListComponent], }).compileComponents(); fixture = TestBed.createComponent(ClientListComponent); diff --git a/overlord/src/app/client/client-list/client-list.component.ts b/overlord/src/app/client/client-list/client-list.component.ts index 6aedffb3..8b18f29b 100644 --- a/overlord/src/app/client/client-list/client-list.component.ts +++ b/overlord/src/app/client/client-list/client-list.component.ts @@ -1,8 +1,22 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { Client } from '../client'; import { ClientListDataSource } from './client-list-datasource'; @@ -11,6 +25,28 @@ import { ClientListDataSource } from './client-list-datasource'; selector: 'app-client-list', templateUrl: './client-list.component.html', styleUrls: ['./client-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + LocalTimePipe, + ], }) export class ClientListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/client/client-routing.module.spec.ts b/overlord/src/app/client/client-routing.module.spec.ts deleted file mode 100644 index 15f67c5e..00000000 --- a/overlord/src/app/client/client-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ClientRoutingModule } from './client-routing.module'; - -describe('ClientRoutingModule', () => { - let clientRoutingModule: ClientRoutingModule; - - beforeEach(() => { - clientRoutingModule = new ClientRoutingModule(); - }); - - it('should create an instance', () => { - expect(clientRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/client/client.module.spec.ts b/overlord/src/app/client/client.module.spec.ts deleted file mode 100644 index fec7a9f5..00000000 --- a/overlord/src/app/client/client.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ClientModule } from './client.module'; - -describe('ClientModule', () => { - let clientModule: ClientModule; - - beforeEach(() => { - clientModule = new ClientModule(); - }); - - it('should create an instance', () => { - expect(clientModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/client/client.module.ts b/overlord/src/app/client/client.module.ts deleted file mode 100644 index 0a25e820..00000000 --- a/overlord/src/app/client/client.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { ClientDetailComponent } from './client-detail/client-detail.component'; -import { ClientListComponent } from './client-list/client-list.component'; -import { ClientRoutingModule } from './client-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ClientRoutingModule, - ], - declarations: [ClientListComponent, ClientDetailComponent], -}) -export class ClientModule {} diff --git a/overlord/src/app/client/client-routing.module.ts b/overlord/src/app/client/client.routes.ts similarity index 69% rename from overlord/src/app/client/client-routing.module.ts rename to overlord/src/app/client/client.routes.ts index eceea1ac..cd8e6573 100644 --- a/overlord/src/app/client/client-routing.module.ts +++ b/overlord/src/app/client/client.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { ClientListComponent } from './client-list/client-list.component'; import { clientListResolver } from './client-list.resolver'; import { clientResolver } from './client.resolver'; -const clientRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ClientListComponent, @@ -33,9 +31,3 @@ const clientRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(clientRoutes)], - exports: [RouterModule], -}) -export class ClientRoutingModule {} diff --git a/overlord/src/app/closing-stock/closing-stock-routing.module.spec.ts b/overlord/src/app/closing-stock/closing-stock-routing.module.spec.ts deleted file mode 100644 index 6726f315..00000000 --- a/overlord/src/app/closing-stock/closing-stock-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ClosingStockRoutingModule } from './closing-stock-routing.module'; - -describe('ClosingStockRoutingModule', () => { - let closingStockRoutingModule: ClosingStockRoutingModule; - - beforeEach(() => { - closingStockRoutingModule = new ClosingStockRoutingModule(); - }); - - it('should create an instance', () => { - expect(closingStockRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/closing-stock/closing-stock.component.spec.ts b/overlord/src/app/closing-stock/closing-stock.component.spec.ts index a4d2ed28..ee5cc2af 100644 --- a/overlord/src/app/closing-stock/closing-stock.component.spec.ts +++ b/overlord/src/app/closing-stock/closing-stock.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ClosingStockComponent } from './closing-stock.component'; @@ -8,14 +6,11 @@ describe('ClosingStockComponent', () => { let component: ClosingStockComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [ClosingStockComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ClosingStockComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ClosingStockComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/closing-stock/closing-stock.component.ts b/overlord/src/app/closing-stock/closing-stock.component.ts index ae746133..fae8b4c7 100644 --- a/overlord/src/app/closing-stock/closing-stock.component.ts +++ b/overlord/src/app/closing-stock/closing-stock.component.ts @@ -1,9 +1,36 @@ +import { DecimalPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormGroup, FormArray, FormControl } from '@angular/forms'; +import { FormGroup, FormArray, FormControl, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSelectChange } from '@angular/material/select'; -import { MatSort } from '@angular/material/sort'; +import { MatSelectChange, MatSelect } from '@angular/material/select'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; @@ -23,6 +50,43 @@ import { ClosingStockService } from './closing-stock.service'; selector: 'app-closing-stock', templateUrl: './closing-stock.component.html', styleUrls: ['./closing-stock.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatSelect, + MatOption, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + MatCardActions, + DecimalPipe, + CurrencyPipe, + ], }) export class ClosingStockComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; @@ -96,14 +160,14 @@ export class ClosingStockComponent implements OnInit { } save() { - this.ser.save(this.getClosingStock()).subscribe( - () => { + this.ser.save(this.getClosingStock()).subscribe({ + next: () => { this.toaster.show('Success', ''); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getClosingStock(): ClosingStock { @@ -177,26 +241,26 @@ export class ClosingStockComponent implements OnInit { } post() { - this.ser.post(this.info.date, this.info.costCentre.id as string).subscribe( - () => { + this.ser.post(this.info.date, this.info.costCentre.id as string).subscribe({ + next: () => { this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.info.date, this.info.costCentre.id as string).subscribe( - () => { + this.ser.delete(this.info.date, this.info.costCentre.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/closing-stock'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/closing-stock/closing-stock.module.spec.ts b/overlord/src/app/closing-stock/closing-stock.module.spec.ts deleted file mode 100644 index e3e8a24f..00000000 --- a/overlord/src/app/closing-stock/closing-stock.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ClosingStockModule } from './closing-stock.module'; - -describe('ClosingStockModule', () => { - let closingStockModule: ClosingStockModule; - - beforeEach(() => { - closingStockModule = new ClosingStockModule(); - }); - - it('should create an instance', () => { - expect(closingStockModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/closing-stock/closing-stock.module.ts b/overlord/src/app/closing-stock/closing-stock.module.ts deleted file mode 100644 index d22ad7d3..00000000 --- a/overlord/src/app/closing-stock/closing-stock.module.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { ClosingStockRoutingModule } from './closing-stock-routing.module'; -import { ClosingStockComponent } from './closing-stock.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ClosingStockRoutingModule, - MatSelectModule, - ], - declarations: [ClosingStockComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class ClosingStockModule {} diff --git a/overlord/src/app/closing-stock/closing-stock-routing.module.ts b/overlord/src/app/closing-stock/closing-stock.routes.ts similarity index 71% rename from overlord/src/app/closing-stock/closing-stock-routing.module.ts rename to overlord/src/app/closing-stock/closing-stock.routes.ts index 7f5929c8..20cdbe80 100644 --- a/overlord/src/app/closing-stock/closing-stock-routing.module.ts +++ b/overlord/src/app/closing-stock/closing-stock.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver'; @@ -8,7 +6,7 @@ import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver import { ClosingStockComponent } from './closing-stock.component'; import { closingStockResolver } from './closing-stock.resolver'; -const closingStockRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ClosingStockComponent, @@ -36,9 +34,3 @@ const closingStockRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(closingStockRoutes)], - exports: [RouterModule], -}) -export class ClosingStockRoutingModule {} diff --git a/overlord/src/app/core/auth.interceptor.spec.ts b/overlord/src/app/core/auth.interceptor.spec.ts new file mode 100644 index 00000000..78478957 --- /dev/null +++ b/overlord/src/app/core/auth.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { authInterceptor } from './auth.interceptor'; + +describe('authInterceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => TestBed.runInInjectionContext(() => authInterceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/overlord/src/app/core/auth.interceptor.ts b/overlord/src/app/core/auth.interceptor.ts new file mode 100644 index 00000000..b965adf4 --- /dev/null +++ b/overlord/src/app/core/auth.interceptor.ts @@ -0,0 +1,53 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { inject } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Router } from '@angular/router'; +import { throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +import { AuthService } from '../auth/auth.service'; +import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; + +import { ToasterService } from './toaster.service'; + +export const authInterceptor: HttpInterceptorFn = (req, next) => { + return next(req).pipe( + catchError((err) => { + // We don't want to refresh token for some requests like login or refresh token itself + // So we verify url and we throw an error if it's the case + if (req.url.includes('/refresh') || req.url.includes('/token')) { + // We do another check to see if refresh token failed + // In this case we want to logout user and to redirect it to login page + if (req.url.includes('/refresh')) { + inject(AuthService).logout(); + } + return throwError(() => new Error(err)); + } + // If error status is different than 401 we want to skip refresh token + // So we check that and throw the error if it's the case + if (err.status !== 401) { + const error = err.error.message || err.error.detail || err.statusText; + return throwError(() => new Error(error)); + } + // auto logout if 401 response returned from api + inject(AuthService).logout(); + inject(ToasterService).show('Danger', 'User has been logged out'); + const dialogRef = inject(MatDialog).open(ConfirmDialogComponent, { + width: '250px', + data: { + title: 'Logged out!', + content: + 'You have been logged out.\n' + + 'You can press Cancel to stay on page and login in another tab to resume here, ' + + 'or you can press Ok to navigate to the login page.', + }, + }); + dialogRef.afterClosed().subscribe((result: boolean) => { + if (result) { + inject(Router).navigate(['login']); + } + }); + return throwError(() => new Error(err)); + }), + ); +}; diff --git a/overlord/src/app/core/core.module.spec.ts b/overlord/src/app/core/core.module.spec.ts deleted file mode 100644 index d8fcf7e3..00000000 --- a/overlord/src/app/core/core.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CoreModule } from './core.module'; - -describe('CoreModule', () => { - let coreModule: CoreModule; - - beforeEach(() => { - coreModule = new CoreModule(); - }); - - it('should create an instance', () => { - expect(coreModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/core/core.module.ts b/overlord/src/app/core/core.module.ts deleted file mode 100644 index 1096be22..00000000 --- a/overlord/src/app/core/core.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { RouterModule } from '@angular/router'; -import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client'; -import { LoadingBarRouterModule } from '@ngx-loading-bar/router'; - -import { ErrorInterceptor } from './http-auth-interceptor'; -import { JwtInterceptor } from './jwt.interceptor'; -import { NavBarComponent } from './nav-bar/nav-bar.component'; - -@NgModule({ - imports: [ - CommonModule, - LoadingBarHttpClientModule, - LoadingBarRouterModule, - MatButtonModule, - MatIconModule, - MatMenuModule, - MatToolbarModule, - RouterModule, - ], - declarations: [NavBarComponent], - exports: [NavBarComponent, LoadingBarHttpClientModule, LoadingBarRouterModule], - providers: [ - { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, - ], -}) -export class CoreModule {} diff --git a/overlord/src/app/core/http-auth-interceptor.ts b/overlord/src/app/core/http-auth-interceptor.ts deleted file mode 100644 index 54326433..00000000 --- a/overlord/src/app/core/http-auth-interceptor.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { Router } from '@angular/router'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import { AuthService } from '../auth/auth.service'; -import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; - -import { ToasterService } from './toaster.service'; - -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - constructor( - private authService: AuthService, - private router: Router, - private dialog: MatDialog, - private toaster: ToasterService, - ) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe( - catchError((err) => { - // We don't want to refresh token for some requests like login or refresh token itself - // So we verify url and we throw an error if it's the case - if (request.url.includes('/refresh') || request.url.includes('/token')) { - // We do another check to see if refresh token failed - // In this case we want to logout user and to redirect it to login page - if (request.url.includes('/refresh')) { - this.authService.logout(); - } - return throwError(err); - } - // If error status is different than 401 we want to skip refresh token - // So we check that and throw the error if it's the case - if (err.status !== 401) { - const error = err.error.message || err.error.detail || err.statusText; - return throwError(error); - } - // auto logout if 401 response returned from api - this.authService.logout(); - this.toaster.show('Danger', 'User has been logged out'); - const dialogRef = this.dialog.open(ConfirmDialogComponent, { - width: '250px', - data: { - title: 'Logged out!', - content: - 'You have been logged out.\n' + - 'You can press Cancel to stay on page and login in another tab to resume here, ' + - 'or you can press Ok to navigate to the login page.', - }, - }); - dialogRef.afterClosed().subscribe((result: boolean) => { - if (result) { - this.router.navigate(['login']); - } - }); - return throwError(err); - }), - ); - } -} diff --git a/overlord/src/app/core/jwt.interceptor.spec.ts b/overlord/src/app/core/jwt.interceptor.spec.ts new file mode 100644 index 00000000..39227996 --- /dev/null +++ b/overlord/src/app/core/jwt.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { jwtInterceptor } from './jwt.interceptor'; + +describe('jwtInterceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => TestBed.runInInjectionContext(() => jwtInterceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/overlord/src/app/core/jwt.interceptor.ts b/overlord/src/app/core/jwt.interceptor.ts index 940b7e53..2dfe1948 100644 --- a/overlord/src/app/core/jwt.interceptor.ts +++ b/overlord/src/app/core/jwt.interceptor.ts @@ -1,34 +1,18 @@ -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; +import { HttpInterceptorFn } from '@angular/common/http'; +import { inject } from '@angular/core'; import { AuthService } from '../auth/auth.service'; -@Injectable() -export class JwtInterceptor implements HttpInterceptor { - private isRefreshing = false; - - constructor(private authService: AuthService) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - // add authorization header with jwt token if available - - // We use this line to debug token refreshing - if (!this.isRefreshing && this.authService.user && this.authService.needsRefreshing()) { - this.isRefreshing = true; - this.authService.refreshToken().subscribe(() => { - this.isRefreshing = false; - }); - } - const currentUser = this.authService.user; - if (currentUser?.access_token) { - request = request.clone({ - setHeaders: { - Authorization: `Bearer ${currentUser.access_token}`, - }, - }); - } - - return next.handle(request); +export const jwtInterceptor: HttpInterceptorFn = (req, next) => { + // add authorization header with jwt token if available + const currentUser = inject(AuthService).user; + if (currentUser?.access_token) { + req = req.clone({ + setHeaders: { + Authorization: `Bearer ${currentUser.access_token}`, + }, + }); } -} + + return next(req); +}; diff --git a/overlord/src/app/core/nav-bar/nav-bar.component.spec.ts b/overlord/src/app/core/nav-bar/nav-bar.component.spec.ts index 13da390b..6f8f6d75 100644 --- a/overlord/src/app/core/nav-bar/nav-bar.component.spec.ts +++ b/overlord/src/app/core/nav-bar/nav-bar.component.spec.ts @@ -8,7 +8,7 @@ describe('NavBarComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [NavBarComponent], + imports: [NavBarComponent], }).compileComponents(); fixture = TestBed.createComponent(NavBarComponent); diff --git a/overlord/src/app/core/nav-bar/nav-bar.component.ts b/overlord/src/app/core/nav-bar/nav-bar.component.ts index 34c0a57b..851401e0 100644 --- a/overlord/src/app/core/nav-bar/nav-bar.component.ts +++ b/overlord/src/app/core/nav-bar/nav-bar.component.ts @@ -1,7 +1,12 @@ +import { AsyncPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; +import { MatButton, MatAnchor } from '@angular/material/button'; +import { MatIcon } from '@angular/material/icon'; +import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu'; +import { MatToolbar } from '@angular/material/toolbar'; +import { Router, RouterLink } from '@angular/router'; -import { environment } from '../../../environments/environment'; +import { environment } from '../../app.environment'; import { AuthService } from '../../auth/auth.service'; import { TitleService } from '../title.service'; @@ -9,6 +14,8 @@ import { TitleService } from '../title.service'; selector: 'app-nav-bar', templateUrl: './nav-bar.component.html', styleUrls: ['./nav-bar.component.css'], + standalone: true, + imports: [MatToolbar, RouterLink, MatMenu, MatMenuItem, MatButton, MatMenuTrigger, MatIcon, MatAnchor, AsyncPipe], }) export class NavBarComponent implements OnInit { title: string; diff --git a/overlord/src/app/core/refresh.interceptor.spec.ts b/overlord/src/app/core/refresh.interceptor.spec.ts new file mode 100644 index 00000000..9e45c295 --- /dev/null +++ b/overlord/src/app/core/refresh.interceptor.spec.ts @@ -0,0 +1,17 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { refreshInterceptor } from './refresh.interceptor'; + +describe('refreshInterceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => + TestBed.runInInjectionContext(() => refreshInterceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/overlord/src/app/core/refresh.interceptor.ts b/overlord/src/app/core/refresh.interceptor.ts new file mode 100644 index 00000000..c76bf020 --- /dev/null +++ b/overlord/src/app/core/refresh.interceptor.ts @@ -0,0 +1,17 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { inject } from '@angular/core'; + +import { AuthService } from '../auth/auth.service'; + +export const refreshInterceptor: HttpInterceptorFn = (req, next) => { + const authService = inject(AuthService); + if (!authService.isRefreshing && authService.user && authService.needsRefreshing()) { + authService.isRefreshing = true; + authService.refreshToken().subscribe({ + next: () => { + authService.isRefreshing = false; + }, + }); + } + return next(req); +}; diff --git a/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.spec.ts b/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.spec.ts index 32aa0e0e..708fb5f2 100644 --- a/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.spec.ts +++ b/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CostCentreDetailComponent } from './cost-centre-detail.component'; @@ -8,14 +6,11 @@ describe('CostCentreDetailComponent', () => { let component: CostCentreDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [CostCentreDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [CostCentreDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(CostCentreDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts b/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts index e5485901..7cbfc77c 100644 --- a/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts +++ b/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts @@ -1,5 +1,9 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { CostCentre } from '../../core/cost-centre'; @@ -10,6 +14,19 @@ import { CostCentreService } from '../cost-centre.service'; selector: 'app-cost-centre-detail', templateUrl: './cost-centre-detail.component.html', styleUrls: ['./cost-centre-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCardActions, + MatButton, + ], }) export class CostCentreDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -54,15 +71,15 @@ export class CostCentreDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/cost-centres'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getItem(): CostCentre { diff --git a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.spec.ts b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.spec.ts index 0db401ea..711ef6c3 100644 --- a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.spec.ts +++ b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { CostCentreListComponent } from './cost-centre-list.component'; @@ -9,8 +8,7 @@ describe('CostCentreListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [CostCentreListComponent], + imports: [RouterTestingModule, CostCentreListComponent], }).compileComponents(); fixture = TestBed.createComponent(CostCentreListComponent); diff --git a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts index c7b4e2e4..5a44e927 100644 --- a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts +++ b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts @@ -1,7 +1,22 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { CostCentre } from '../../core/cost-centre'; @@ -11,6 +26,30 @@ import { CostCentreListDataSource } from './cost-centre-list-datasource'; selector: 'app-cost-centre-list', templateUrl: './cost-centre-list.component.html', styleUrls: ['./cost-centre-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + ], }) export class CostCentreListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/cost-centre/cost-centre-routing.module.spec.ts b/overlord/src/app/cost-centre/cost-centre-routing.module.spec.ts deleted file mode 100644 index 493878fa..00000000 --- a/overlord/src/app/cost-centre/cost-centre-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CostCentreRoutingModule } from './cost-centre-routing.module'; - -describe('CostCentreRoutingModule', () => { - let costCentreRoutingModule: CostCentreRoutingModule; - - beforeEach(() => { - costCentreRoutingModule = new CostCentreRoutingModule(); - }); - - it('should create an instance', () => { - expect(costCentreRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/cost-centre/cost-centre.module.spec.ts b/overlord/src/app/cost-centre/cost-centre.module.spec.ts deleted file mode 100644 index a59fbbc9..00000000 --- a/overlord/src/app/cost-centre/cost-centre.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CostCentreModule } from './cost-centre.module'; - -describe('CostCentreModule', () => { - let costCentreModule: CostCentreModule; - - beforeEach(() => { - costCentreModule = new CostCentreModule(); - }); - - it('should create an instance', () => { - expect(costCentreModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/cost-centre/cost-centre.module.ts b/overlord/src/app/cost-centre/cost-centre.module.ts deleted file mode 100644 index c1d9bf13..00000000 --- a/overlord/src/app/cost-centre/cost-centre.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { CostCentreDetailComponent } from './cost-centre-detail/cost-centre-detail.component'; -import { CostCentreListComponent } from './cost-centre-list/cost-centre-list.component'; -import { CostCentreRoutingModule } from './cost-centre-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - CostCentreRoutingModule, - ], - declarations: [CostCentreListComponent, CostCentreDetailComponent], -}) -export class CostCentreModule {} diff --git a/overlord/src/app/cost-centre/cost-centre-routing.module.ts b/overlord/src/app/cost-centre/cost-centre.routes.ts similarity index 74% rename from overlord/src/app/cost-centre/cost-centre-routing.module.ts rename to overlord/src/app/cost-centre/cost-centre.routes.ts index 7cb79531..dac9c31e 100644 --- a/overlord/src/app/cost-centre/cost-centre-routing.module.ts +++ b/overlord/src/app/cost-centre/cost-centre.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { CostCentreListComponent } from './cost-centre-list/cost-centre-list.com import { costCentreListResolver } from './cost-centre-list.resolver'; import { costCentreResolver } from './cost-centre.resolver'; -const costCentreRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: CostCentreListComponent, @@ -44,9 +42,3 @@ const costCentreRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(costCentreRoutes)], - exports: [RouterModule], -}) -export class CostCentreRoutingModule {} diff --git a/overlord/src/app/daybook/daybook-routing.module.spec.ts b/overlord/src/app/daybook/daybook-routing.module.spec.ts deleted file mode 100644 index 11a23966..00000000 --- a/overlord/src/app/daybook/daybook-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DaybookRoutingModule } from './daybook-routing.module'; - -describe('DaybookRoutingModule', () => { - let daybookRoutingModule: DaybookRoutingModule; - - beforeEach(() => { - daybookRoutingModule = new DaybookRoutingModule(); - }); - - it('should create an instance', () => { - expect(daybookRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/daybook/daybook.component.spec.ts b/overlord/src/app/daybook/daybook.component.spec.ts index fb7bd586..7f402954 100644 --- a/overlord/src/app/daybook/daybook.component.spec.ts +++ b/overlord/src/app/daybook/daybook.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DaybookComponent } from './daybook.component'; @@ -8,14 +6,11 @@ describe('DaybookComponent', () => { let component: DaybookComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [DaybookComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DaybookComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(DaybookComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/daybook/daybook.component.ts b/overlord/src/app/daybook/daybook.component.ts index 616da9ae..3dc0495d 100644 --- a/overlord/src/app/daybook/daybook.component.ts +++ b/overlord/src/app/daybook/daybook.component.ts @@ -1,8 +1,26 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { Daybook } from './daybook'; @@ -12,6 +30,37 @@ import { DaybookDataSource } from './daybook-datasource'; selector: 'app-daybook', templateUrl: './daybook.component.html', styleUrls: ['./daybook.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + CurrencyPipe, + ], }) export class DaybookComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/daybook/daybook.module.spec.ts b/overlord/src/app/daybook/daybook.module.spec.ts deleted file mode 100644 index 62cd41e0..00000000 --- a/overlord/src/app/daybook/daybook.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DaybookModule } from './daybook.module'; - -describe('DaybookModule', () => { - let daybookModule: DaybookModule; - - beforeEach(() => { - daybookModule = new DaybookModule(); - }); - - it('should create an instance', () => { - expect(daybookModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/daybook/daybook.module.ts b/overlord/src/app/daybook/daybook.module.ts deleted file mode 100644 index 04cba02e..00000000 --- a/overlord/src/app/daybook/daybook.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { DaybookRoutingModule } from './daybook-routing.module'; -import { DaybookComponent } from './daybook.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - DaybookRoutingModule, - ], - declarations: [DaybookComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class DaybookModule {} diff --git a/overlord/src/app/daybook/daybook-routing.module.ts b/overlord/src/app/daybook/daybook.routes.ts similarity index 54% rename from overlord/src/app/daybook/daybook-routing.module.ts rename to overlord/src/app/daybook/daybook.routes.ts index 7b3f7205..1ae70af9 100644 --- a/overlord/src/app/daybook/daybook-routing.module.ts +++ b/overlord/src/app/daybook/daybook.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { DaybookComponent } from './daybook.component'; import { daybookResolver } from './daybook.resolver'; -const daybookRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: DaybookComponent, @@ -21,9 +19,3 @@ const daybookRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(daybookRoutes)], - exports: [RouterModule], -}) -export class DaybookRoutingModule {} diff --git a/overlord/src/app/employee-attendance/employee-attendance.component.ts b/overlord/src/app/employee-attendance/employee-attendance.component.ts index 2b561fd9..26d5b4fc 100644 --- a/overlord/src/app/employee-attendance/employee-attendance.component.ts +++ b/overlord/src/app/employee-attendance/employee-attendance.component.ts @@ -1,7 +1,29 @@ +import { AsyncPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatChipSet, MatChipOption } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; @@ -22,6 +44,41 @@ import { EmployeeAttendanceService } from './employee-attendance.service'; selector: 'app-employee-attendance', templateUrl: './employee-attendance.component.html', styleUrls: ['./employee-attendance.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatSelect, + MatIcon, + MatChipSet, + MatChipOption, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + AsyncPipe, + ], }) export class EmployeeAttendanceComponent implements OnInit, AfterViewInit { @ViewChild('employeeElement', { static: true }) employeeElement?: ElementRef; @@ -129,14 +186,14 @@ export class EmployeeAttendanceComponent implements OnInit, AfterViewInit { } save() { - this.ser.save(this.getEmployeeAttendance()).subscribe( - () => { + this.ser.save(this.getEmployeeAttendance()).subscribe({ + next: () => { this.toaster.show('Success', ''); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getEmployeeAttendance(): EmployeeAttendance { diff --git a/overlord/src/app/employee-attendance/employee-attendance.module.ts b/overlord/src/app/employee-attendance/employee-attendance.module.ts deleted file mode 100644 index 2a45df19..00000000 --- a/overlord/src/app/employee-attendance/employee-attendance.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { EmployeeAttendanceRoutingModule } from './employee-attendance-routing.module'; -import { EmployeeAttendanceComponent } from './employee-attendance.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - EmployeeAttendanceRoutingModule, - ], - declarations: [EmployeeAttendanceComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class EmployeeAttendanceModule {} diff --git a/overlord/src/app/employee-attendance/employee-attendance-routing.module.ts b/overlord/src/app/employee-attendance/employee-attendance.routes.ts similarity index 70% rename from overlord/src/app/employee-attendance/employee-attendance-routing.module.ts rename to overlord/src/app/employee-attendance/employee-attendance.routes.ts index 89cc8acb..09efb3f0 100644 --- a/overlord/src/app/employee-attendance/employee-attendance-routing.module.ts +++ b/overlord/src/app/employee-attendance/employee-attendance.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { attendanceTypeResolver } from '../attendance/attendance-type.resolver'; import { authGuard } from '../auth/auth-guard.service'; @@ -8,7 +6,7 @@ import { authGuard } from '../auth/auth-guard.service'; import { EmployeeAttendanceComponent } from './employee-attendance.component'; import { employeeAttendanceResolver } from './employee-attendance.resolver'; -const employeeEmployeeAttendanceRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: EmployeeAttendanceComponent, @@ -36,9 +34,3 @@ const employeeEmployeeAttendanceRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(employeeEmployeeAttendanceRoutes)], - exports: [RouterModule], -}) -export class EmployeeAttendanceRoutingModule {} diff --git a/overlord/src/app/employee-benefits/employee-benefits.component.ts b/overlord/src/app/employee-benefits/employee-benefits.component.ts index 12a962ea..bc76789e 100644 --- a/overlord/src/app/employee-benefits/employee-benefits.component.ts +++ b/overlord/src/app/employee-benefits/employee-benefits.component.ts @@ -1,7 +1,34 @@ +import { AsyncPipe, DecimalPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatCardActions, + MatCardSubtitle, +} from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; @@ -17,6 +44,7 @@ import { VoucherService } from '../core/voucher.service'; import { Employee } from '../employee/employee'; import { EmployeeService } from '../employee/employee.service'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { EmployeeBenefitsDataSource } from './employee-benefits-datasource'; @@ -24,6 +52,43 @@ import { EmployeeBenefitsDataSource } from './employee-benefits-datasource'; selector: 'app-employee-benefits', templateUrl: './employee-benefits.component.html', styleUrls: ['./employee-benefits.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + MatCardSubtitle, + AsyncPipe, + DecimalPipe, + CurrencyPipe, + LocalTimePipe, + ], }) export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { @ViewChild('employeeElement', { static: true }) employeeElement?: ElementRef; @@ -196,21 +261,21 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -218,10 +283,10 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { this.router.navigate(['/employee-benefits', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -231,15 +296,15 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/employee-benefits'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/employee-benefits/employee-benefits.module.ts b/overlord/src/app/employee-benefits/employee-benefits.module.ts deleted file mode 100644 index 1571d91f..00000000 --- a/overlord/src/app/employee-benefits/employee-benefits.module.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { EmployeeBenefitsRoutingModule } from './employee-benefits-routing.module'; -import { EmployeeBenefitsComponent } from './employee-benefits.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - EmployeeBenefitsRoutingModule, - ], - declarations: [EmployeeBenefitsComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class EmployeeBenefitsModule {} diff --git a/overlord/src/app/employee-benefits/employee-benefits-routing.module.ts b/overlord/src/app/employee-benefits/employee-benefits.routes.ts similarity index 67% rename from overlord/src/app/employee-benefits/employee-benefits-routing.module.ts rename to overlord/src/app/employee-benefits/employee-benefits.routes.ts index 58a9fb08..b1a5813f 100644 --- a/overlord/src/app/employee-benefits/employee-benefits-routing.module.ts +++ b/overlord/src/app/employee-benefits/employee-benefits.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { EmployeeBenefitsComponent } from './employee-benefits.component'; import { employeeBenefitsResolver } from './employee-benefits.resolver'; -const employeeBenefitsRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: EmployeeBenefitsComponent, @@ -33,9 +31,3 @@ const employeeBenefitsRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(employeeBenefitsRoutes)], - exports: [RouterModule], -}) -export class EmployeeBenefitsRoutingModule {} diff --git a/overlord/src/app/employee-functions/employee-functions-routing.module.ts b/overlord/src/app/employee-functions/employee-functions-routing.module.ts deleted file mode 100644 index 73971a39..00000000 --- a/overlord/src/app/employee-functions/employee-functions-routing.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { authGuard } from '../auth/auth-guard.service'; - -import { EmployeeFunctionsComponent } from './employee-functions.component'; - -const employeeFunctionsRoutes: Routes = [ - { - path: '', - component: EmployeeFunctionsComponent, - canActivate: [authGuard], - data: { - permission: 'employee-benefit', - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(employeeFunctionsRoutes)], - exports: [RouterModule], -}) -export class EmployeeFunctionsRoutingModule {} diff --git a/overlord/src/app/employee-functions/employee-functions.component.ts b/overlord/src/app/employee-functions/employee-functions.component.ts index d4171521..683e877b 100644 --- a/overlord/src/app/employee-functions/employee-functions.component.ts +++ b/overlord/src/app/employee-functions/employee-functions.component.ts @@ -1,6 +1,11 @@ import { Component } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatDatepicker } from '@angular/material/datepicker'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardContent } from '@angular/material/card'; +import { MatDatepicker, MatDatepickerInput, MatDatepickerToggle } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatTabGroup, MatTab } from '@angular/material/tabs'; import moment from 'moment'; import { Moment } from 'moment'; @@ -12,6 +17,23 @@ import { EmployeeFunctionsService } from './employee-functions.service'; selector: 'app-employee-functions', templateUrl: './employee-functions.component.html', styleUrls: ['./employee-functions.component.css'], + standalone: true, + imports: [ + MatTabGroup, + MatTab, + MatCard, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatAnchor, + ], }) export class EmployeeFunctionsComponent { creditSalaryForm: FormGroup<{ @@ -61,14 +83,14 @@ export class EmployeeFunctionsComponent { this.toaster.show('Danger', 'Please choose a valid date.'); return; } - this.ser.creditSalary(date).subscribe( - () => { + this.ser.creditSalary(date).subscribe({ + next: () => { this.toaster.show('Success', 'Salaries Credited'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } attendanceRecordUrl() { @@ -100,13 +122,13 @@ export class EmployeeFunctionsComponent { this.toaster.show('Danger', 'Please choose a file first!'); return; } - this.ser.uploadFingerprints(this.fingerprintFile).subscribe( - () => { + this.ser.uploadFingerprints(this.fingerprintFile).subscribe({ + next: () => { this.toaster.show('Success', 'Fingerprints uploaded'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } } diff --git a/overlord/src/app/employee-functions/employee-functions.module.ts b/overlord/src/app/employee-functions/employee-functions.module.ts deleted file mode 100644 index 56cfe91d..00000000 --- a/overlord/src/app/employee-functions/employee-functions.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { EmployeeFunctionsRoutingModule } from './employee-functions-routing.module'; -import { EmployeeFunctionsComponent } from './employee-functions.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - MatTabsModule, - ReactiveFormsModule, - SharedModule, - EmployeeFunctionsRoutingModule, - ], - declarations: [EmployeeFunctionsComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class EmployeeFunctionsModule {} diff --git a/overlord/src/app/employee-functions/employee-functions.routes.ts b/overlord/src/app/employee-functions/employee-functions.routes.ts new file mode 100644 index 00000000..8769e4ec --- /dev/null +++ b/overlord/src/app/employee-functions/employee-functions.routes.ts @@ -0,0 +1,17 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { EmployeeFunctionsComponent } from './employee-functions.component'; + +export const routes: Routes = [ + { + path: '', + component: EmployeeFunctionsComponent, + canActivate: [authGuard], + data: { + permission: 'employee-benefit', + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/overlord/src/app/employee/employee-detail/employee-detail.component.spec.ts b/overlord/src/app/employee/employee-detail/employee-detail.component.spec.ts index 91fa1282..e4d44437 100644 --- a/overlord/src/app/employee/employee-detail/employee-detail.component.spec.ts +++ b/overlord/src/app/employee/employee-detail/employee-detail.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EmployeeDetailComponent } from './employee-detail.component'; @@ -9,14 +6,11 @@ describe('EmployeeDetailComponent', () => { let component: EmployeeDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [EmployeeDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EmployeeDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(EmployeeDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/employee/employee-detail/employee-detail.component.ts b/overlord/src/app/employee/employee-detail/employee-detail.component.ts index 9bd4a804..e380587d 100644 --- a/overlord/src/app/employee/employee-detail/employee-detail.component.ts +++ b/overlord/src/app/employee/employee-detail/employee-detail.component.ts @@ -1,6 +1,22 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; @@ -14,6 +30,28 @@ import { EmployeeService } from '../employee.service'; selector: 'app-employee-detail', templateUrl: './employee-detail.component.html', styleUrls: ['./employee-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatSelect, + MatOption, + MatDatepickerInput, + MatDatepickerToggle, + MatDatepicker, + MatCardActions, + MatButton, + ], }) export class EmployeeDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -89,27 +127,27 @@ export class EmployeeDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/employees'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/employees'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/employee/employee-list/employee-list.component.spec.ts b/overlord/src/app/employee/employee-list/employee-list.component.spec.ts index 406d0a86..789a76fc 100644 --- a/overlord/src/app/employee/employee-list/employee-list.component.spec.ts +++ b/overlord/src/app/employee/employee-list/employee-list.component.spec.ts @@ -1,6 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; import { EmployeeListComponent } from './employee-list.component'; @@ -10,8 +8,7 @@ describe('EmployeeListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [EmployeeListComponent], + imports: [ReactiveFormsModule, RouterTestingModule, EmployeeListComponent], }).compileComponents(); fixture = TestBed.createComponent(EmployeeListComponent); diff --git a/overlord/src/app/employee/employee-list/employee-list.component.ts b/overlord/src/app/employee/employee-list/employee-list.component.ts index 13507565..b3796da8 100644 --- a/overlord/src/app/employee/employee-list/employee-list.component.ts +++ b/overlord/src/app/employee/employee-list/employee-list.component.ts @@ -1,8 +1,26 @@ +import { DecimalPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; @@ -15,6 +33,38 @@ import { EmployeeListDataSource } from './employee-list-datasource'; selector: 'app-employee-list', templateUrl: './employee-list.component.html', styleUrls: ['./employee-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatAnchor, + RouterLink, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatSuffix, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + DecimalPipe, + CurrencyPipe, + ], }) export class EmployeeListComponent implements OnInit, AfterViewInit { @ViewChild('filterElement', { static: true }) filterElement?: ElementRef; diff --git a/overlord/src/app/employee/employee-routing.module.spec.ts b/overlord/src/app/employee/employee-routing.module.spec.ts deleted file mode 100644 index 90ec1286..00000000 --- a/overlord/src/app/employee/employee-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EmployeeRoutingModule } from './employee-routing.module'; - -describe('EmployeeRoutingModule', () => { - let employeeRoutingModule: EmployeeRoutingModule; - - beforeEach(() => { - employeeRoutingModule = new EmployeeRoutingModule(); - }); - - it('should create an instance', () => { - expect(employeeRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/employee/employee.module.spec.ts b/overlord/src/app/employee/employee.module.spec.ts deleted file mode 100644 index 62d0ae04..00000000 --- a/overlord/src/app/employee/employee.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EmployeeModule } from './employee.module'; - -describe('EmployeeModule', () => { - let employeeModule: EmployeeModule; - - beforeEach(() => { - employeeModule = new EmployeeModule(); - }); - - it('should create an instance', () => { - expect(employeeModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/employee/employee.module.ts b/overlord/src/app/employee/employee.module.ts deleted file mode 100644 index f53db773..00000000 --- a/overlord/src/app/employee/employee.module.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MatOptionModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { EmployeeDetailComponent } from './employee-detail/employee-detail.component'; -import { EmployeeListComponent } from './employee-list/employee-list.component'; -import { EmployeeRoutingModule } from './employee-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatCardModule, - MatDatepickerModule, - MatDialogModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - EmployeeRoutingModule, - ], - declarations: [EmployeeListComponent, EmployeeDetailComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class EmployeeModule {} diff --git a/overlord/src/app/employee/employee-routing.module.ts b/overlord/src/app/employee/employee.routes.ts similarity index 77% rename from overlord/src/app/employee/employee-routing.module.ts rename to overlord/src/app/employee/employee.routes.ts index dbdc97ce..9655f1ef 100644 --- a/overlord/src/app/employee/employee-routing.module.ts +++ b/overlord/src/app/employee/employee.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver'; @@ -10,7 +8,7 @@ import { EmployeeListComponent } from './employee-list/employee-list.component'; import { employeeListResolver } from './employee-list.resolver'; import { employeeResolver } from './employee.resolver'; -const employeeRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: EmployeeListComponent, @@ -47,9 +45,3 @@ const employeeRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(employeeRoutes)], - exports: [RouterModule], -}) -export class EmployeeRoutingModule {} diff --git a/overlord/src/app/entries/entries-routing.module.spec.ts b/overlord/src/app/entries/entries-routing.module.spec.ts deleted file mode 100644 index 0762baca..00000000 --- a/overlord/src/app/entries/entries-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EntriesRoutingModule } from './entries-routing.module'; - -describe('EntriesRoutingModule', () => { - let entriesRoutingModule: EntriesRoutingModule; - - beforeEach(() => { - entriesRoutingModule = new EntriesRoutingModule(); - }); - - it('should create an instance', () => { - expect(entriesRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/entries/entries.component.spec.ts b/overlord/src/app/entries/entries.component.spec.ts index e5cce750..21b637f0 100644 --- a/overlord/src/app/entries/entries.component.spec.ts +++ b/overlord/src/app/entries/entries.component.spec.ts @@ -1,6 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EntriesComponent } from './entries.component'; @@ -8,15 +6,11 @@ describe('EntriesComponent', () => { let component: EntriesComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [EntriesComponent], - imports: [RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EntriesComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(EntriesComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/entries/entries.component.ts b/overlord/src/app/entries/entries.component.ts index bbfbfd08..017a72b2 100644 --- a/overlord/src/app/entries/entries.component.ts +++ b/overlord/src/app/entries/entries.component.ts @@ -1,11 +1,33 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatRadioChange } from '@angular/material/radio'; -import { MatSort, SortDirection } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatRadioChange, MatRadioGroup, MatRadioButton } from '@angular/material/radio'; +import { MatSort, SortDirection, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; +import { LocalTimePipe } from '../shared/local-time.pipe'; + import { EntriesDatasource } from './entries-datasource'; import { Report } from './report'; @@ -13,6 +35,42 @@ import { Report } from './report'; selector: 'app-entries', templateUrl: './entries.component.html', styleUrls: ['./entries.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatIcon, + MatRadioGroup, + MatRadioButton, + MatCheckbox, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + CurrencyPipe, + LocalTimePipe, + ], }) export class EntriesComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; @@ -83,20 +141,22 @@ export class EntriesComponent implements OnInit { sortDirection, ); }); - this.sort?.sortChange.subscribe(() => - this.router.navigate([], { - relativeTo: this.route, - queryParams: { a: this.sort?.active ?? 'date', d: this.sort?.direction }, - queryParamsHandling: 'merge', - }), - ); - this.paginator?.page.subscribe(() => - this.router.navigate([], { - relativeTo: this.route, - queryParams: { ps: this.paginator?.pageSize, pi: this.paginator?.pageIndex }, - queryParamsHandling: 'merge', - }), - ); + this.sort?.sortChange.subscribe({ + next: () => + this.router.navigate([], { + relativeTo: this.route, + queryParams: { a: this.sort?.active ?? 'date', d: this.sort?.direction }, + queryParamsHandling: 'merge', + }), + }); + this.paginator?.page.subscribe({ + next: () => + this.router.navigate([], { + relativeTo: this.route, + queryParams: { ps: this.paginator?.pageSize, pi: this.paginator?.pageIndex }, + queryParamsHandling: 'merge', + }), + }); } refresh() { diff --git a/overlord/src/app/entries/entries.module.spec.ts b/overlord/src/app/entries/entries.module.spec.ts deleted file mode 100644 index a0ee9e04..00000000 --- a/overlord/src/app/entries/entries.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EntriesModule } from './entries.module'; - -describe('EntriesModule', () => { - let entriesModule: EntriesModule; - - beforeEach(() => { - entriesModule = new EntriesModule(); - }); - - it('should create an instance', () => { - expect(entriesModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/entries/entries.module.ts b/overlord/src/app/entries/entries.module.ts deleted file mode 100644 index 68abaad3..00000000 --- a/overlord/src/app/entries/entries.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { EntriesRoutingModule } from './entries-routing.module'; -import { EntriesComponent } from './entries.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSortModule, - MatTableModule, - SharedModule, - EntriesRoutingModule, - MatExpansionModule, - MatDatepickerModule, - ReactiveFormsModule, - ], - declarations: [EntriesComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class EntriesModule {} diff --git a/overlord/src/app/entries/entries-routing.module.ts b/overlord/src/app/entries/entries.routes.ts similarity index 54% rename from overlord/src/app/entries/entries-routing.module.ts rename to overlord/src/app/entries/entries.routes.ts index 226fa2d2..c572fc8f 100644 --- a/overlord/src/app/entries/entries-routing.module.ts +++ b/overlord/src/app/entries/entries.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { EntriesComponent } from './entries.component'; import { entriesResolver } from './entries.resolver'; -const entriesRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: EntriesComponent, @@ -21,9 +19,3 @@ const entriesRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(entriesRoutes)], - exports: [RouterModule], -}) -export class EntriesRoutingModule {} diff --git a/overlord/src/app/home/home.component.spec.ts b/overlord/src/app/home/home.component.spec.ts index d7c6165d..7737f1c8 100644 --- a/overlord/src/app/home/home.component.spec.ts +++ b/overlord/src/app/home/home.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HomeComponent } from './home.component'; @@ -6,13 +6,11 @@ describe('HomeComponent', () => { let component: HomeComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [HomeComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HomeComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(HomeComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/home/home.component.ts b/overlord/src/app/home/home.component.ts index 9ffc897c..320f2acd 100644 --- a/overlord/src/app/home/home.component.ts +++ b/overlord/src/app/home/home.component.ts @@ -4,5 +4,6 @@ import { Component } from '@angular/core'; selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'], + standalone: true, }) export class HomeComponent {} diff --git a/overlord/src/app/incentive/incentive-routing.module.spec.ts b/overlord/src/app/incentive/incentive-routing.module.spec.ts deleted file mode 100644 index 0e6db7e6..00000000 --- a/overlord/src/app/incentive/incentive-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IncentiveRoutingModule } from './incentive-routing.module'; - -describe('IncentiveRoutingModule', () => { - let incentiveRoutingModule: IncentiveRoutingModule; - - beforeEach(() => { - incentiveRoutingModule = new IncentiveRoutingModule(); - }); - - it('should create an instance', () => { - expect(incentiveRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/incentive/incentive.component.spec.ts b/overlord/src/app/incentive/incentive.component.spec.ts index 952343ea..c5498456 100644 --- a/overlord/src/app/incentive/incentive.component.spec.ts +++ b/overlord/src/app/incentive/incentive.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { IncentiveComponent } from './incentive.component'; @@ -9,14 +6,11 @@ describe('IncentiveComponent', () => { let component: IncentiveComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [IncentiveComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [IncentiveComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(IncentiveComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/incentive/incentive.component.ts b/overlord/src/app/incentive/incentive.component.ts index fefe46d9..45308785 100644 --- a/overlord/src/app/incentive/incentive.component.ts +++ b/overlord/src/app/incentive/incentive.component.ts @@ -1,6 +1,32 @@ +import { DecimalPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatCardActions, + MatCardSubtitle, +} from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix, MatPrefix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject } from 'rxjs'; @@ -15,6 +41,7 @@ import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { IncentiveDataSource } from './incentive-datasource'; @@ -22,6 +49,40 @@ import { IncentiveDataSource } from './incentive-datasource'; selector: 'app-incentive', templateUrl: './incentive.component.html', styleUrls: ['./incentive.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatPrefix, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + MatButton, + MatCardSubtitle, + DecimalPipe, + CurrencyPipe, + LocalTimePipe, + ], }) export class IncentiveComponent implements OnInit { public incentiveObservable = new BehaviorSubject([]); @@ -129,31 +190,31 @@ export class IncentiveComponent implements OnInit { } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { if (voucher.id === result.id) { this.loadVoucher(result); } else { this.router.navigate(['/incentive', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -168,15 +229,15 @@ export class IncentiveComponent implements OnInit { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/incentive'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/incentive/incentive.module.spec.ts b/overlord/src/app/incentive/incentive.module.spec.ts deleted file mode 100644 index fffcb6a7..00000000 --- a/overlord/src/app/incentive/incentive.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IncentiveModule } from './incentive.module'; - -describe('IncentiveModule', () => { - let incentiveModule: IncentiveModule; - - beforeEach(() => { - incentiveModule = new IncentiveModule(); - }); - - it('should create an instance', () => { - expect(incentiveModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/incentive/incentive.module.ts b/overlord/src/app/incentive/incentive.module.ts deleted file mode 100644 index b7d28821..00000000 --- a/overlord/src/app/incentive/incentive.module.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { IncentiveRoutingModule } from './incentive-routing.module'; -import { IncentiveComponent } from './incentive.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - IncentiveRoutingModule, - ], - declarations: [IncentiveComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class IncentiveModule {} diff --git a/overlord/src/app/incentive/incentive-routing.module.ts b/overlord/src/app/incentive/incentive.routes.ts similarity index 66% rename from overlord/src/app/incentive/incentive-routing.module.ts rename to overlord/src/app/incentive/incentive.routes.ts index 51691c61..84349bed 100644 --- a/overlord/src/app/incentive/incentive-routing.module.ts +++ b/overlord/src/app/incentive/incentive.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { IncentiveComponent } from './incentive.component'; import { incentiveResolver } from './incentive.resolver'; -const incentiveRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: IncentiveComponent, @@ -33,9 +31,3 @@ const incentiveRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(incentiveRoutes)], - exports: [RouterModule], -}) -export class IncentiveRoutingModule {} diff --git a/overlord/src/app/issue/issue-dialog.component.spec.ts b/overlord/src/app/issue/issue-dialog.component.spec.ts index 92751f47..c253145c 100644 --- a/overlord/src/app/issue/issue-dialog.component.spec.ts +++ b/overlord/src/app/issue/issue-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { IssueDialogComponent } from './issue-dialog.component'; @@ -6,13 +6,11 @@ describe('IssueDialogComponent', () => { let component: IssueDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [IssueDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [IssueDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(IssueDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/issue/issue-dialog.component.ts b/overlord/src/app/issue/issue-dialog.component.ts index 41e04e85..54f3f5f7 100644 --- a/overlord/src/app/issue/issue-dialog.component.ts +++ b/overlord/src/app/issue/issue-dialog.component.ts @@ -1,7 +1,20 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -14,6 +27,23 @@ import { MathService } from '../shared/math.service'; selector: 'app-issue-dialog', templateUrl: './issue-dialog.component.html', styleUrls: ['./issue-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + ], }) export class IssueDialogComponent implements OnInit { batches: Observable; diff --git a/overlord/src/app/issue/issue-routing.module.spec.ts b/overlord/src/app/issue/issue-routing.module.spec.ts deleted file mode 100644 index 99579c72..00000000 --- a/overlord/src/app/issue/issue-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IssueRoutingModule } from './issue-routing.module'; - -describe('IssueRoutingModule', () => { - let issueRoutingModule: IssueRoutingModule; - - beforeEach(() => { - issueRoutingModule = new IssueRoutingModule(); - }); - - it('should create an instance', () => { - expect(issueRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/issue/issue.component.spec.ts b/overlord/src/app/issue/issue.component.spec.ts index 817bc9b6..664f8711 100644 --- a/overlord/src/app/issue/issue.component.spec.ts +++ b/overlord/src/app/issue/issue.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { IssueComponent } from './issue.component'; @@ -9,14 +6,11 @@ describe('IssueComponent', () => { let component: IssueComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [IssueComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [IssueComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(IssueComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/issue/issue.component.ts b/overlord/src/app/issue/issue.component.ts index 9e39f2af..4366b2ea 100644 --- a/overlord/src/app/issue/issue.component.ts +++ b/overlord/src/app/issue/issue.component.ts @@ -1,7 +1,36 @@ +import { AsyncPipe, DecimalPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatCardActions, + MatCardFooter, +} from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix, MatPrefix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { Hotkey, HotkeysService } from 'angular2-hotkeys'; import { round } from 'mathjs'; @@ -20,6 +49,7 @@ import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { MathService } from '../shared/math.service'; import { IssueDataSource } from './issue-datasource'; @@ -31,6 +61,46 @@ import { IssueGridService } from './issue-grid.service'; selector: 'app-issue', templateUrl: './issue.component.html', styleUrls: ['./issue.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatSelect, + MatOption, + MatPrefix, + MatAutocompleteTrigger, + MatAutocomplete, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + MatCardFooter, + AsyncPipe, + DecimalPipe, + CurrencyPipe, + LocalTimePipe, + ], }) export class IssueComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('batchElement', { static: true }) batchElement?: ElementRef; @@ -263,8 +333,8 @@ export class IssueComponent implements OnInit, AfterViewInit, OnDestroy { save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -272,10 +342,10 @@ export class IssueComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate(['/issue', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } newVoucher() { @@ -292,15 +362,15 @@ export class IssueComponent implements OnInit, AfterViewInit, OnDestroy { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/issue'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/issue/issue.module.spec.ts b/overlord/src/app/issue/issue.module.spec.ts deleted file mode 100644 index b621ce39..00000000 --- a/overlord/src/app/issue/issue.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IssueModule } from './issue.module'; - -describe('IssueModule', () => { - let issueModule: IssueModule; - - beforeEach(() => { - issueModule = new IssueModule(); - }); - - it('should create an instance', () => { - expect(issueModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/issue/issue.module.ts b/overlord/src/app/issue/issue.module.ts deleted file mode 100644 index 4e5e9850..00000000 --- a/overlord/src/app/issue/issue.module.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { SharedModule } from '../shared/shared.module'; - -import { IssueDialogComponent } from './issue-dialog.component'; -import { IssueRoutingModule } from './issue-routing.module'; -import { IssueComponent } from './issue.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - HotkeyModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - IssueRoutingModule, - ], - declarations: [IssueComponent, IssueDialogComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class IssueModule {} diff --git a/overlord/src/app/issue/issue-routing.module.ts b/overlord/src/app/issue/issue.routes.ts similarity index 70% rename from overlord/src/app/issue/issue-routing.module.ts rename to overlord/src/app/issue/issue.routes.ts index fea48d52..55c4a2cc 100644 --- a/overlord/src/app/issue/issue-routing.module.ts +++ b/overlord/src/app/issue/issue.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver'; @@ -8,7 +6,7 @@ import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver import { IssueComponent } from './issue.component'; import { issueResolver } from './issue.resolver'; -const issueRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: IssueComponent, @@ -36,9 +34,3 @@ const issueRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(issueRoutes)], - exports: [RouterModule], -}) -export class IssueRoutingModule {} diff --git a/overlord/src/app/journal/journal-dialog.component.spec.ts b/overlord/src/app/journal/journal-dialog.component.spec.ts index 1271720c..7448e8e1 100644 --- a/overlord/src/app/journal/journal-dialog.component.spec.ts +++ b/overlord/src/app/journal/journal-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { JournalDialogComponent } from './journal-dialog.component'; @@ -6,13 +6,11 @@ describe('JournalDialogComponent', () => { let component: JournalDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [JournalDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [JournalDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(JournalDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/journal/journal-dialog.component.ts b/overlord/src/app/journal/journal-dialog.component.ts index 03cfb999..98cc1057 100644 --- a/overlord/src/app/journal/journal-dialog.component.ts +++ b/overlord/src/app/journal/journal-dialog.component.ts @@ -1,7 +1,22 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { MatDatepicker } from '@angular/material/datepicker'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatHint, MatPrefix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -9,12 +24,36 @@ import { Account } from '../core/account'; import { AccountBalance } from '../core/account-balance'; import { AccountService } from '../core/account.service'; import { Journal } from '../core/journal'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { MathService } from '../shared/math.service'; @Component({ selector: 'app-journal-dialog', templateUrl: './journal-dialog.component.html', styleUrls: ['./journal-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatSelect, + MatDatepicker, + MatOption, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatPrefix, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + ], }) export class JournalDialogComponent implements OnInit { accounts: Observable; diff --git a/overlord/src/app/journal/journal-routing.module.spec.ts b/overlord/src/app/journal/journal-routing.module.spec.ts deleted file mode 100644 index 5dd0c90d..00000000 --- a/overlord/src/app/journal/journal-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { JournalRoutingModule } from './journal-routing.module'; - -describe('JournalRoutingModule', () => { - let journalRoutingModule: JournalRoutingModule; - - beforeEach(() => { - journalRoutingModule = new JournalRoutingModule(); - }); - - it('should create an instance', () => { - expect(journalRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/journal/journal.component.spec.ts b/overlord/src/app/journal/journal.component.spec.ts index 44906145..acf82086 100644 --- a/overlord/src/app/journal/journal.component.spec.ts +++ b/overlord/src/app/journal/journal.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { JournalComponent } from './journal.component'; @@ -9,14 +6,11 @@ describe('JournalComponent', () => { let component: JournalComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [JournalComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [JournalComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(JournalComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/journal/journal.component.ts b/overlord/src/app/journal/journal.component.ts index 241d33cd..75449844 100644 --- a/overlord/src/app/journal/journal.component.ts +++ b/overlord/src/app/journal/journal.component.ts @@ -1,9 +1,38 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatChipInputEvent, MatChipGrid, MatChipRow, MatChipRemove, MatChipInput } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel, MatHint, MatPrefix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { Hotkey, HotkeysService } from 'angular2-hotkeys'; import { round } from 'mathjs'; @@ -23,9 +52,11 @@ import { ToasterService } from '../core/toaster.service'; import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; import { ImageDialogComponent } from '../shared/image-dialog/image-dialog.component'; import { ImageService } from '../shared/image.service'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { MathService } from '../shared/math.service'; import { JournalDataSource } from './journal-datasource'; @@ -35,6 +66,51 @@ import { JournalDialogComponent } from './journal-dialog.component'; selector: 'app-journal', templateUrl: './journal.component.html', styleUrls: ['./journal.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatDatepicker, + MatSelect, + MatOption, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatPrefix, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatChipGrid, + MatChipRow, + MatChipRemove, + MatChipInput, + MatCardActions, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + LocalTimePipe, + ], }) export class JournalComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; @@ -271,21 +347,21 @@ export class JournalComponent implements OnInit, AfterViewInit, OnDestroy { } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -293,10 +369,10 @@ export class JournalComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate(['/journal', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -307,15 +383,15 @@ export class JournalComponent implements OnInit, AfterViewInit, OnDestroy { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/journal'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/journal/journal.module.spec.ts b/overlord/src/app/journal/journal.module.spec.ts deleted file mode 100644 index a3134d38..00000000 --- a/overlord/src/app/journal/journal.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { JournalModule } from './journal.module'; - -describe('JournalModule', () => { - let journalModule: JournalModule; - - beforeEach(() => { - journalModule = new JournalModule(); - }); - - it('should create an instance', () => { - expect(journalModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/journal/journal.module.ts b/overlord/src/app/journal/journal.module.ts deleted file mode 100644 index 92982009..00000000 --- a/overlord/src/app/journal/journal.module.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { SharedModule } from '../shared/shared.module'; - -import { JournalDialogComponent } from './journal-dialog.component'; -import { JournalRoutingModule } from './journal-routing.module'; -import { JournalComponent } from './journal.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - HotkeyModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - JournalRoutingModule, - ], - declarations: [JournalComponent, JournalDialogComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class JournalModule {} diff --git a/overlord/src/app/journal/journal-routing.module.ts b/overlord/src/app/journal/journal.routes.ts similarity index 65% rename from overlord/src/app/journal/journal-routing.module.ts rename to overlord/src/app/journal/journal.routes.ts index cbda1890..7af620d7 100644 --- a/overlord/src/app/journal/journal-routing.module.ts +++ b/overlord/src/app/journal/journal.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { JournalComponent } from './journal.component'; import { journalResolver } from './journal.resolver'; -const journalRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: JournalComponent, @@ -33,9 +31,3 @@ const journalRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(journalRoutes)], - exports: [RouterModule], -}) -export class JournalRoutingModule {} diff --git a/overlord/src/app/ledger/ledger-routing.module.spec.ts b/overlord/src/app/ledger/ledger-routing.module.spec.ts deleted file mode 100644 index 22606773..00000000 --- a/overlord/src/app/ledger/ledger-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { LedgerRoutingModule } from './ledger-routing.module'; - -describe('LedgerRoutingModule', () => { - let ledgerRoutingModule: LedgerRoutingModule; - - beforeEach(() => { - ledgerRoutingModule = new LedgerRoutingModule(); - }); - - it('should create an instance', () => { - expect(ledgerRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/ledger/ledger.component.spec.ts b/overlord/src/app/ledger/ledger.component.spec.ts index 2d9165ed..38ebcd92 100644 --- a/overlord/src/app/ledger/ledger.component.spec.ts +++ b/overlord/src/app/ledger/ledger.component.spec.ts @@ -1,7 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { LedgerComponent } from './ledger.component'; @@ -9,15 +6,11 @@ describe('LedgerComponent', () => { let component: LedgerComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [LedgerComponent], - imports: [ReactiveFormsModule, RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [LedgerComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(LedgerComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/ledger/ledger.component.ts b/overlord/src/app/ledger/ledger.component.ts index df922a62..6a55217f 100644 --- a/overlord/src/app/ledger/ledger.component.ts +++ b/overlord/src/app/ledger/ledger.component.ts @@ -1,15 +1,41 @@ +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; import { Account } from '../core/account'; import { AccountService } from '../core/account.service'; +import { AccountingPipe } from '../shared/accounting.pipe'; +import { ClearPipe } from '../shared/clear.pipe'; import { ToCsvService } from '../shared/to-csv.service'; import { Ledger } from './ledger'; @@ -20,6 +46,50 @@ import { LedgerService } from './ledger.service'; selector: 'app-ledger', templateUrl: './ledger.component.html', styleUrls: ['./ledger.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatPaginator, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + ClearPipe, + ], }) export class LedgerComponent implements OnInit, AfterViewInit { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; diff --git a/overlord/src/app/ledger/ledger.module.spec.ts b/overlord/src/app/ledger/ledger.module.spec.ts deleted file mode 100644 index 12be60d0..00000000 --- a/overlord/src/app/ledger/ledger.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { LedgerModule } from './ledger.module'; - -describe('LedgerModule', () => { - let ledgerModule: LedgerModule; - - beforeEach(() => { - ledgerModule = new LedgerModule(); - }); - - it('should create an instance', () => { - expect(ledgerModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/ledger/ledger.module.ts b/overlord/src/app/ledger/ledger.module.ts deleted file mode 100644 index 3f5a67cb..00000000 --- a/overlord/src/app/ledger/ledger.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { LedgerRoutingModule } from './ledger-routing.module'; -import { LedgerComponent } from './ledger.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - LedgerRoutingModule, - ], - declarations: [LedgerComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class LedgerModule {} diff --git a/overlord/src/app/ledger/ledger-routing.module.ts b/overlord/src/app/ledger/ledger.routes.ts similarity index 65% rename from overlord/src/app/ledger/ledger-routing.module.ts rename to overlord/src/app/ledger/ledger.routes.ts index d1851fdc..ab4640ad 100644 --- a/overlord/src/app/ledger/ledger-routing.module.ts +++ b/overlord/src/app/ledger/ledger.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { LedgerComponent } from './ledger.component'; import { ledgerResolver } from './ledger.resolver'; -const ledgerRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: LedgerComponent, @@ -33,9 +31,3 @@ const ledgerRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(ledgerRoutes)], - exports: [RouterModule], -}) -export class LedgerRoutingModule {} diff --git a/overlord/src/app/net-transactions/net-transactions-routing.module.spec.ts b/overlord/src/app/net-transactions/net-transactions-routing.module.spec.ts deleted file mode 100644 index e87b2ffe..00000000 --- a/overlord/src/app/net-transactions/net-transactions-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NetTransactionsRoutingModule } from './net-transactions-routing.module'; - -describe('NetTransactionsRoutingModule', () => { - let netTransactionsRoutingModule: NetTransactionsRoutingModule; - - beforeEach(() => { - netTransactionsRoutingModule = new NetTransactionsRoutingModule(); - }); - - it('should create an instance', () => { - expect(netTransactionsRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/net-transactions/net-transactions.component.spec.ts b/overlord/src/app/net-transactions/net-transactions.component.spec.ts index 4c9603b6..93882bad 100644 --- a/overlord/src/app/net-transactions/net-transactions.component.spec.ts +++ b/overlord/src/app/net-transactions/net-transactions.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NetTransactionsComponent } from './net-transactions.component'; @@ -8,14 +6,11 @@ describe('NetTransactionsComponent', () => { let component: NetTransactionsComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [NetTransactionsComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NetTransactionsComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(NetTransactionsComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/net-transactions/net-transactions.component.ts b/overlord/src/app/net-transactions/net-transactions.component.ts index b4105717..8be94de9 100644 --- a/overlord/src/app/net-transactions/net-transactions.component.ts +++ b/overlord/src/app/net-transactions/net-transactions.component.ts @@ -1,10 +1,30 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; +import { AccountingPipe } from '../shared/accounting.pipe'; + import { NetTransactions } from './net-transactions'; import { NetTransactionsDataSource } from './net-transactions-datasource'; @@ -12,6 +32,37 @@ import { NetTransactionsDataSource } from './net-transactions-datasource'; selector: 'app-net-transactions', templateUrl: './net-transactions.component.html', styleUrls: ['./net-transactions.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + CurrencyPipe, + AccountingPipe, + ], }) export class NetTransactionsComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/net-transactions/net-transactions.module.spec.ts b/overlord/src/app/net-transactions/net-transactions.module.spec.ts deleted file mode 100644 index 61f038a1..00000000 --- a/overlord/src/app/net-transactions/net-transactions.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NetTransactionsModule } from './net-transactions.module'; - -describe('NetTransactionsModule', () => { - let netTransactionsModule: NetTransactionsModule; - - beforeEach(() => { - netTransactionsModule = new NetTransactionsModule(); - }); - - it('should create an instance', () => { - expect(netTransactionsModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/net-transactions/net-transactions.module.ts b/overlord/src/app/net-transactions/net-transactions.module.ts deleted file mode 100644 index 7a6fc47f..00000000 --- a/overlord/src/app/net-transactions/net-transactions.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { NetTransactionsRoutingModule } from './net-transactions-routing.module'; -import { NetTransactionsComponent } from './net-transactions.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - NetTransactionsRoutingModule, - ], - declarations: [NetTransactionsComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class NetTransactionsModule {} diff --git a/overlord/src/app/net-transactions/net-transactions-routing.module.ts b/overlord/src/app/net-transactions/net-transactions.routes.ts similarity index 56% rename from overlord/src/app/net-transactions/net-transactions-routing.module.ts rename to overlord/src/app/net-transactions/net-transactions.routes.ts index 86103800..edec9cb2 100644 --- a/overlord/src/app/net-transactions/net-transactions-routing.module.ts +++ b/overlord/src/app/net-transactions/net-transactions.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { NetTransactionsComponent } from './net-transactions.component'; import { netTransactionsResolver } from './net-transactions.resolver'; -const netTransactionsRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: NetTransactionsComponent, @@ -21,9 +19,3 @@ const netTransactionsRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(netTransactionsRoutes)], - exports: [RouterModule], -}) -export class NetTransactionsRoutingModule {} diff --git a/overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.spec.ts b/overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.spec.ts deleted file mode 100644 index c065a9df..00000000 --- a/overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NonContractPurchaseRoutingModule } from './non-contract-purchase-routing.module'; - -describe('NonContractPurchaseRoutingModule', () => { - let nonContractPurchaseRoutingModule: NonContractPurchaseRoutingModule; - - beforeEach(() => { - nonContractPurchaseRoutingModule = new NonContractPurchaseRoutingModule(); - }); - - it('should create an instance', () => { - expect(nonContractPurchaseRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/non-contact-purchase/non-contract-purchase.component.spec.ts b/overlord/src/app/non-contact-purchase/non-contract-purchase.component.spec.ts index 6c1de391..347fb58b 100644 --- a/overlord/src/app/non-contact-purchase/non-contract-purchase.component.spec.ts +++ b/overlord/src/app/non-contact-purchase/non-contract-purchase.component.spec.ts @@ -1,6 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NonContractPurchaseComponent } from './non-contract-purchase.component'; @@ -8,15 +6,11 @@ describe('NonContractPurchaseComponent', () => { let component: NonContractPurchaseComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [NonContractPurchaseComponent], - imports: [RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NonContractPurchaseComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(NonContractPurchaseComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/non-contact-purchase/non-contract-purchase.component.ts b/overlord/src/app/non-contact-purchase/non-contract-purchase.component.ts index 8d8a11a4..5fbff8a1 100644 --- a/overlord/src/app/non-contact-purchase/non-contract-purchase.component.ts +++ b/overlord/src/app/non-contact-purchase/non-contract-purchase.component.ts @@ -1,5 +1,19 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { NonContractPurchase } from './non-contract-purchase'; import { NonContractPurchaseDatasource } from './non-contract-purchase-datasource'; @@ -8,6 +22,25 @@ import { NonContractPurchaseDatasource } from './non-contract-purchase-datasourc selector: 'app-non-contract-purchase', templateUrl: './non-contract-purchase.component.html', styleUrls: ['./non-contract-purchase.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class NonContractPurchaseComponent implements OnInit { info: NonContractPurchase[] = []; diff --git a/overlord/src/app/non-contact-purchase/non-contract-purchase.module.spec.ts b/overlord/src/app/non-contact-purchase/non-contract-purchase.module.spec.ts deleted file mode 100644 index 0b26fa97..00000000 --- a/overlord/src/app/non-contact-purchase/non-contract-purchase.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NonContractPurchaseModule } from './non-contract-purchase.module'; - -describe('NonContractPurchaseModule', () => { - let nonContractPurchaseModule: NonContractPurchaseModule; - - beforeEach(() => { - nonContractPurchaseModule = new NonContractPurchaseModule(); - }); - - it('should create an instance', () => { - expect(nonContractPurchaseModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/non-contact-purchase/non-contract-purchase.module.ts b/overlord/src/app/non-contact-purchase/non-contract-purchase.module.ts deleted file mode 100644 index aeb5bdcd..00000000 --- a/overlord/src/app/non-contact-purchase/non-contract-purchase.module.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { NonContractPurchaseRoutingModule } from './non-contract-purchase-routing.module'; -import { NonContractPurchaseComponent } from './non-contract-purchase.component'; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSortModule, - MatTableModule, - SharedModule, - NonContractPurchaseRoutingModule, - MatExpansionModule, - MatDatepickerModule, - ReactiveFormsModule, - ], - declarations: [NonContractPurchaseComponent], -}) -export class NonContractPurchaseModule {} diff --git a/overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.ts b/overlord/src/app/non-contact-purchase/non-contract-purchase.routes.ts similarity index 57% rename from overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.ts rename to overlord/src/app/non-contact-purchase/non-contract-purchase.routes.ts index ee80c3e1..65127034 100644 --- a/overlord/src/app/non-contact-purchase/non-contract-purchase-routing.module.ts +++ b/overlord/src/app/non-contact-purchase/non-contract-purchase.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { NonContractPurchaseComponent } from './non-contract-purchase.component'; import { nonContractPurchaseResolver } from './non-contract-purchase.resolver'; -const nonContractPurchaseRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: NonContractPurchaseComponent, @@ -21,9 +19,3 @@ const nonContractPurchaseRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(nonContractPurchaseRoutes)], - exports: [RouterModule], -}) -export class NonContractPurchaseRoutingModule {} diff --git a/overlord/src/app/payment/payment-dialog.component.spec.ts b/overlord/src/app/payment/payment-dialog.component.spec.ts index 488f0f27..35c06567 100644 --- a/overlord/src/app/payment/payment-dialog.component.spec.ts +++ b/overlord/src/app/payment/payment-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PaymentDialogComponent } from './payment-dialog.component'; @@ -6,13 +6,11 @@ describe('PaymentDialogComponent', () => { let component: PaymentDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [PaymentDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PaymentDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PaymentDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/payment/payment-dialog.component.ts b/overlord/src/app/payment/payment-dialog.component.ts index bdf87d6c..755a8361 100644 --- a/overlord/src/app/payment/payment-dialog.component.ts +++ b/overlord/src/app/payment/payment-dialog.component.ts @@ -1,7 +1,20 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatHint, MatPrefix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -9,12 +22,34 @@ import { Account } from '../core/account'; import { AccountBalance } from '../core/account-balance'; import { AccountService } from '../core/account.service'; import { Journal } from '../core/journal'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { MathService } from '../shared/math.service'; @Component({ selector: 'app-payment-dialog', templateUrl: './payment-dialog.component.html', styleUrls: ['./payment-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatOption, + MatPrefix, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + ], }) export class PaymentDialogComponent implements OnInit { accounts: Observable; diff --git a/overlord/src/app/payment/payment-routing.module.spec.ts b/overlord/src/app/payment/payment-routing.module.spec.ts deleted file mode 100644 index 6bf2a521..00000000 --- a/overlord/src/app/payment/payment-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PaymentRoutingModule } from './payment-routing.module'; - -describe('PaymentRoutingModule', () => { - let paymentRoutingModule: PaymentRoutingModule; - - beforeEach(() => { - paymentRoutingModule = new PaymentRoutingModule(); - }); - - it('should create an instance', () => { - expect(paymentRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/payment/payment.component.spec.ts b/overlord/src/app/payment/payment.component.spec.ts index 42f0ae90..8ac87bca 100644 --- a/overlord/src/app/payment/payment.component.spec.ts +++ b/overlord/src/app/payment/payment.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PaymentComponent } from './payment.component'; @@ -9,14 +6,11 @@ describe('PaymentComponent', () => { let component: PaymentComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [PaymentComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PaymentComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PaymentComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/payment/payment.component.ts b/overlord/src/app/payment/payment.component.ts index eb736749..c202f002 100644 --- a/overlord/src/app/payment/payment.component.ts +++ b/overlord/src/app/payment/payment.component.ts @@ -1,9 +1,38 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatChipInputEvent, MatChipGrid, MatChipRow, MatChipRemove, MatChipInput } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel, MatPrefix, MatHint } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { Hotkey, HotkeysService } from 'angular2-hotkeys'; import { round } from 'mathjs'; @@ -23,9 +52,11 @@ import { ToasterService } from '../core/toaster.service'; import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; import { ImageDialogComponent } from '../shared/image-dialog/image-dialog.component'; import { ImageService } from '../shared/image.service'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { MathService } from '../shared/math.service'; import { PaymentDataSource } from './payment-datasource'; @@ -35,6 +66,51 @@ import { PaymentDialogComponent } from './payment-dialog.component'; selector: 'app-payment', templateUrl: './payment.component.html', styleUrls: ['./payment.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatDatepicker, + MatSelect, + MatOption, + MatPrefix, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatChipGrid, + MatChipRow, + MatChipRemove, + MatChipInput, + MatCardActions, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + LocalTimePipe, + ], }) export class PaymentComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; @@ -281,21 +357,21 @@ export class PaymentComponent implements OnInit, AfterViewInit, OnDestroy { } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -303,10 +379,10 @@ export class PaymentComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate(['/payment', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -318,15 +394,15 @@ export class PaymentComponent implements OnInit, AfterViewInit, OnDestroy { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/payment'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/payment/payment.module.spec.ts b/overlord/src/app/payment/payment.module.spec.ts deleted file mode 100644 index 65316ac9..00000000 --- a/overlord/src/app/payment/payment.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PaymentModule } from './payment.module'; - -describe('PaymentModule', () => { - let paymentModule: PaymentModule; - - beforeEach(() => { - paymentModule = new PaymentModule(); - }); - - it('should create an instance', () => { - expect(paymentModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/payment/payment.module.ts b/overlord/src/app/payment/payment.module.ts deleted file mode 100644 index 8f46d971..00000000 --- a/overlord/src/app/payment/payment.module.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { SharedModule } from '../shared/shared.module'; - -import { PaymentDialogComponent } from './payment-dialog.component'; -import { PaymentRoutingModule } from './payment-routing.module'; -import { PaymentComponent } from './payment.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - HotkeyModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - PaymentRoutingModule, - ], - declarations: [PaymentComponent, PaymentDialogComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class PaymentModule {} diff --git a/overlord/src/app/payment/payment-routing.module.ts b/overlord/src/app/payment/payment.routes.ts similarity index 71% rename from overlord/src/app/payment/payment-routing.module.ts rename to overlord/src/app/payment/payment.routes.ts index 9534dfbe..0e7f7c83 100644 --- a/overlord/src/app/payment/payment-routing.module.ts +++ b/overlord/src/app/payment/payment.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -8,7 +6,7 @@ import { paymentAccountsResolver } from './payment-accounts.resolver'; import { PaymentComponent } from './payment.component'; import { paymentResolver } from './payment.resolver'; -const paymentRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: PaymentComponent, @@ -36,9 +34,3 @@ const paymentRoutes: Routes = [ runGuardsAndResolvers: 'paramsChange', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(paymentRoutes)], - exports: [RouterModule], -}) -export class PaymentRoutingModule {} diff --git a/overlord/src/app/period/period-detail/period-detail.component.spec.ts b/overlord/src/app/period/period-detail/period-detail.component.spec.ts index 9ed5f4f9..41fc41af 100644 --- a/overlord/src/app/period/period-detail/period-detail.component.spec.ts +++ b/overlord/src/app/period/period-detail/period-detail.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PeriodDetailComponent } from './period-detail.component'; @@ -9,14 +6,11 @@ describe('PeriodDetailComponent', () => { let component: PeriodDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [PeriodDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PeriodDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PeriodDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/period/period-detail/period-detail.component.ts b/overlord/src/app/period/period-detail/period-detail.component.ts index e9d67914..5790891c 100644 --- a/overlord/src/app/period/period-detail/period-detail.component.ts +++ b/overlord/src/app/period/period-detail/period-detail.component.ts @@ -1,6 +1,11 @@ import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; @@ -13,6 +18,23 @@ import { PeriodService } from '../period.service'; selector: 'app-period-detail', templateUrl: './period-detail.component.html', styleUrls: ['./period-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatCardActions, + MatButton, + ], }) export class PeriodDetailComponent implements OnInit { form: FormGroup<{ @@ -52,27 +74,27 @@ export class PeriodDetailComponent implements OnInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/periods'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/periods'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/period/period-list/period-list.component.spec.ts b/overlord/src/app/period/period-list/period-list.component.spec.ts index b1a7a182..ec8c4ee0 100644 --- a/overlord/src/app/period/period-list/period-list.component.spec.ts +++ b/overlord/src/app/period/period-list/period-list.component.spec.ts @@ -1,6 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; import { PeriodListComponent } from './period-list.component'; @@ -10,8 +8,7 @@ describe('PeriodListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [PeriodListComponent], + imports: [ReactiveFormsModule, RouterTestingModule, PeriodListComponent], }).compileComponents(); fixture = TestBed.createComponent(PeriodListComponent); diff --git a/overlord/src/app/period/period-list/period-list.component.ts b/overlord/src/app/period/period-list/period-list.component.ts index b6da315a..b8fb9ebf 100644 --- a/overlord/src/app/period/period-list/period-list.component.ts +++ b/overlord/src/app/period/period-list/period-list.component.ts @@ -1,5 +1,20 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Period } from '../period'; @@ -9,6 +24,27 @@ import { PeriodListDataSource } from './period-list-datasource'; selector: 'app-period-list', templateUrl: './period-list.component.html', styleUrls: ['./period-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class PeriodListComponent implements OnInit { dataSource: PeriodListDataSource; diff --git a/overlord/src/app/period/period-routing.module.spec.ts b/overlord/src/app/period/period-routing.module.spec.ts deleted file mode 100644 index 77fa1241..00000000 --- a/overlord/src/app/period/period-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PeriodRoutingModule } from './period-routing.module'; - -describe('PeriodRoutingModule', () => { - let periodRoutingModule: PeriodRoutingModule; - - beforeEach(() => { - periodRoutingModule = new PeriodRoutingModule(); - }); - - it('should create an instance', () => { - expect(periodRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/period/period.module.spec.ts b/overlord/src/app/period/period.module.spec.ts deleted file mode 100644 index fa26b166..00000000 --- a/overlord/src/app/period/period.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PeriodModule } from './period.module'; - -describe('PeriodModule', () => { - let periodModule: PeriodModule; - - beforeEach(() => { - periodModule = new PeriodModule(); - }); - - it('should create an instance', () => { - expect(periodModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/period/period.module.ts b/overlord/src/app/period/period.module.ts deleted file mode 100644 index 13df30b9..00000000 --- a/overlord/src/app/period/period.module.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MatOptionModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { PeriodDetailComponent } from './period-detail/period-detail.component'; -import { PeriodListComponent } from './period-list/period-list.component'; -import { PeriodRoutingModule } from './period-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatCardModule, - MatDatepickerModule, - MatDialogModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - PeriodRoutingModule, - ], - declarations: [PeriodListComponent, PeriodDetailComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class PeriodModule {} diff --git a/overlord/src/app/period/period-routing.module.ts b/overlord/src/app/period/period.routes.ts similarity index 77% rename from overlord/src/app/period/period-routing.module.ts rename to overlord/src/app/period/period.routes.ts index 50bc4d78..bf5e1ba3 100644 --- a/overlord/src/app/period/period-routing.module.ts +++ b/overlord/src/app/period/period.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { costCentreListResolver } from '../cost-centre/cost-centre-list.resolver'; @@ -10,7 +8,7 @@ import { PeriodListComponent } from './period-list/period-list.component'; import { periodListResolver } from './period-list.resolver'; import { periodResolver } from './period.resolver'; -const periodRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: PeriodListComponent, @@ -47,9 +45,3 @@ const periodRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(periodRoutes)], - exports: [RouterModule], -}) -export class PeriodRoutingModule {} diff --git a/overlord/src/app/product-group/product-group-detail/product-group-detail.component.spec.ts b/overlord/src/app/product-group/product-group-detail/product-group-detail.component.spec.ts index 73d6ac3d..a00e54a3 100644 --- a/overlord/src/app/product-group/product-group-detail/product-group-detail.component.spec.ts +++ b/overlord/src/app/product-group/product-group-detail/product-group-detail.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProductGroupDetailComponent } from './product-group-detail.component'; @@ -8,14 +6,11 @@ describe('ProductGroupDetailComponent', () => { let component: ProductGroupDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [ProductGroupDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProductGroupDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ProductGroupDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/product-group/product-group-detail/product-group-detail.component.ts b/overlord/src/app/product-group/product-group-detail/product-group-detail.component.ts index 0c113367..41088172 100644 --- a/overlord/src/app/product-group/product-group-detail/product-group-detail.component.ts +++ b/overlord/src/app/product-group/product-group-detail/product-group-detail.component.ts @@ -1,5 +1,10 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ProductGroup } from '../../core/product-group'; @@ -10,6 +15,20 @@ import { ProductGroupService } from '../product-group.service'; selector: 'app-product-group-detail', templateUrl: './product-group-detail.component.html', styleUrls: ['./product-group-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class ProductGroupDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -60,15 +79,15 @@ export class ProductGroupDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/product-groups'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getItem(): ProductGroup { diff --git a/overlord/src/app/product-group/product-group-list/product-group-list.component.spec.ts b/overlord/src/app/product-group/product-group-list/product-group-list.component.spec.ts index 2d58301f..8641dad7 100644 --- a/overlord/src/app/product-group/product-group-list/product-group-list.component.spec.ts +++ b/overlord/src/app/product-group/product-group-list/product-group-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { ProductGroupListComponent } from './product-group-list.component'; @@ -9,8 +8,7 @@ describe('ProductGroupListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [ProductGroupListComponent], + imports: [RouterTestingModule, ProductGroupListComponent], }).compileComponents(); fixture = TestBed.createComponent(ProductGroupListComponent); diff --git a/overlord/src/app/product-group/product-group-list/product-group-list.component.ts b/overlord/src/app/product-group/product-group-list/product-group-list.component.ts index babceb45..cc3fb5e2 100644 --- a/overlord/src/app/product-group/product-group-list/product-group-list.component.ts +++ b/overlord/src/app/product-group/product-group-list/product-group-list.component.ts @@ -1,7 +1,22 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { ProductGroup } from '../../core/product-group'; @@ -11,6 +26,30 @@ import { ProductGroupListDataSource } from './product-group-list-datasource'; selector: 'app-product-group-list', templateUrl: './product-group-list.component.html', styleUrls: ['./product-group-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + ], }) export class ProductGroupListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/product-group/product-group-routing.module.spec.ts b/overlord/src/app/product-group/product-group-routing.module.spec.ts deleted file mode 100644 index d79077f7..00000000 --- a/overlord/src/app/product-group/product-group-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductGroupRoutingModule } from './product-group-routing.module'; - -describe('ProductGroupRoutingModule', () => { - let productGroupRoutingModule: ProductGroupRoutingModule; - - beforeEach(() => { - productGroupRoutingModule = new ProductGroupRoutingModule(); - }); - - it('should create an instance', () => { - expect(productGroupRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/product-group/product-group.module.spec.ts b/overlord/src/app/product-group/product-group.module.spec.ts deleted file mode 100644 index f867f1eb..00000000 --- a/overlord/src/app/product-group/product-group.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductGroupModule } from './product-group.module'; - -describe('ProductGroupModule', () => { - let productGroupModule: ProductGroupModule; - - beforeEach(() => { - productGroupModule = new ProductGroupModule(); - }); - - it('should create an instance', () => { - expect(productGroupModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/product-group/product-group.module.ts b/overlord/src/app/product-group/product-group.module.ts deleted file mode 100644 index bcbd5724..00000000 --- a/overlord/src/app/product-group/product-group.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { ProductGroupDetailComponent } from './product-group-detail/product-group-detail.component'; -import { ProductGroupListComponent } from './product-group-list/product-group-list.component'; -import { ProductGroupRoutingModule } from './product-group-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatCardModule, - MatCheckboxModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - ReactiveFormsModule, - ProductGroupRoutingModule, - ], - declarations: [ProductGroupListComponent, ProductGroupDetailComponent], -}) -export class ProductGroupModule {} diff --git a/overlord/src/app/product-group/product-group-routing.module.ts b/overlord/src/app/product-group/product-group.routes.ts similarity index 75% rename from overlord/src/app/product-group/product-group-routing.module.ts rename to overlord/src/app/product-group/product-group.routes.ts index 50a614c6..7c5851f1 100644 --- a/overlord/src/app/product-group/product-group-routing.module.ts +++ b/overlord/src/app/product-group/product-group.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { ProductGroupListComponent } from './product-group-list/product-group-li import { productGroupListResolver } from './product-group-list.resolver'; import { productGroupResolver } from './product-group.resolver'; -const productGroupRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ProductGroupListComponent, @@ -44,9 +42,3 @@ const productGroupRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(productGroupRoutes)], - exports: [RouterModule], -}) -export class ProductGroupRoutingModule {} diff --git a/overlord/src/app/product-ledger/product-ledger-routing.module.spec.ts b/overlord/src/app/product-ledger/product-ledger-routing.module.spec.ts deleted file mode 100644 index 3b4f3455..00000000 --- a/overlord/src/app/product-ledger/product-ledger-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductLedgerRoutingModule } from './product-ledger-routing.module'; - -describe('ProductLedgerRoutingModule', () => { - let productLedgerRoutingModule: ProductLedgerRoutingModule; - - beforeEach(() => { - productLedgerRoutingModule = new ProductLedgerRoutingModule(); - }); - - it('should create an instance', () => { - expect(productLedgerRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/product-ledger/product-ledger.component.spec.ts b/overlord/src/app/product-ledger/product-ledger.component.spec.ts index dfbcfab8..6cdb01a0 100644 --- a/overlord/src/app/product-ledger/product-ledger.component.spec.ts +++ b/overlord/src/app/product-ledger/product-ledger.component.spec.ts @@ -1,7 +1,4 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProductLedgerComponent } from './product-ledger.component'; @@ -9,15 +6,11 @@ describe('ProductLedgerComponent', () => { let component: ProductLedgerComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ProductLedgerComponent], - imports: [ReactiveFormsModule, RouterTestingModule], - providers: [provideHttpClient(withInterceptorsFromDi())], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProductLedgerComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ProductLedgerComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/product-ledger/product-ledger.component.ts b/overlord/src/app/product-ledger/product-ledger.component.ts index 992ffd7a..e2d3857a 100644 --- a/overlord/src/app/product-ledger/product-ledger.component.ts +++ b/overlord/src/app/product-ledger/product-ledger.component.ts @@ -1,9 +1,33 @@ +import { AsyncPipe, DecimalPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -21,6 +45,49 @@ import { ProductLedgerService } from './product-ledger.service'; selector: 'app-product-ledger', templateUrl: './product-ledger.component.html', styleUrls: ['./product-ledger.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatPaginator, + AsyncPipe, + DecimalPipe, + CurrencyPipe, + ], }) export class ProductLedgerComponent implements OnInit, AfterViewInit { @ViewChild('productElement', { static: true }) productElement?: ElementRef; diff --git a/overlord/src/app/product-ledger/product-ledger.module.spec.ts b/overlord/src/app/product-ledger/product-ledger.module.spec.ts deleted file mode 100644 index 5c80287c..00000000 --- a/overlord/src/app/product-ledger/product-ledger.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductLedgerModule } from './product-ledger.module'; - -describe('ProductLedgerModule', () => { - let productLedgerModule: ProductLedgerModule; - - beforeEach(() => { - productLedgerModule = new ProductLedgerModule(); - }); - - it('should create an instance', () => { - expect(productLedgerModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/product-ledger/product-ledger.module.ts b/overlord/src/app/product-ledger/product-ledger.module.ts deleted file mode 100644 index 1318ebf3..00000000 --- a/overlord/src/app/product-ledger/product-ledger.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { ProductLedgerRoutingModule } from './product-ledger-routing.module'; -import { ProductLedgerComponent } from './product-ledger.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ProductLedgerRoutingModule, - ], - declarations: [ProductLedgerComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class ProductLedgerModule {} diff --git a/overlord/src/app/product-ledger/product-ledger-routing.module.ts b/overlord/src/app/product-ledger/product-ledger.routes.ts similarity index 66% rename from overlord/src/app/product-ledger/product-ledger-routing.module.ts rename to overlord/src/app/product-ledger/product-ledger.routes.ts index 02d0b04b..4720d8e4 100644 --- a/overlord/src/app/product-ledger/product-ledger-routing.module.ts +++ b/overlord/src/app/product-ledger/product-ledger.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { ProductLedgerComponent } from './product-ledger.component'; import { productLedgerResolver } from './product-ledger.resolver'; -const productLedgerRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ProductLedgerComponent, @@ -33,9 +31,3 @@ const productLedgerRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(productLedgerRoutes)], - exports: [RouterModule], -}) -export class ProductLedgerRoutingModule {} diff --git a/overlord/src/app/product/product-detail/product-detail-dialog.component.spec.ts b/overlord/src/app/product/product-detail/product-detail-dialog.component.spec.ts index 5a858890..401e44da 100644 --- a/overlord/src/app/product/product-detail/product-detail-dialog.component.spec.ts +++ b/overlord/src/app/product/product-detail/product-detail-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProductDetailDialogComponent } from './product-detail-dialog.component'; @@ -6,13 +6,11 @@ describe('ProductDetailDialogComponent', () => { let component: ProductDetailDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ProductDetailDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProductDetailDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ProductDetailDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/product/product-detail/product-detail-dialog.component.ts b/overlord/src/app/product/product-detail/product-detail-dialog.component.ts index af34ea1a..40041916 100644 --- a/overlord/src/app/product/product-detail/product-detail-dialog.component.ts +++ b/overlord/src/app/product/product-detail/product-detail-dialog.component.ts @@ -1,6 +1,17 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { StockKeepingUnit } from '../../core/product'; @@ -8,6 +19,19 @@ import { StockKeepingUnit } from '../../core/product'; selector: 'app-journal-dialog', templateUrl: './product-detail-dialog.component.html', styleUrls: ['./product-detail-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class ProductDetailDialogComponent implements OnInit { form: FormGroup<{ diff --git a/overlord/src/app/product/product-detail/product-detail.component.spec.ts b/overlord/src/app/product/product-detail/product-detail.component.spec.ts index 814f5542..67a135c3 100644 --- a/overlord/src/app/product/product-detail/product-detail.component.spec.ts +++ b/overlord/src/app/product/product-detail/product-detail.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProductDetailComponent } from './product-detail.component'; @@ -9,14 +6,11 @@ describe('ProductDetailComponent', () => { let component: ProductDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [ProductDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProductDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ProductDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/product/product-detail/product-detail.component.ts b/overlord/src/app/product/product-detail/product-detail.component.ts index 462b6c81..9155eae2 100644 --- a/overlord/src/app/product/product-detail/product-detail.component.ts +++ b/overlord/src/app/product/product-detail/product-detail.component.ts @@ -1,6 +1,27 @@ +import { CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; @@ -17,6 +38,35 @@ import { ProductDetailDialogComponent } from './product-detail-dialog.component' selector: 'app-product-detail', templateUrl: './product-detail.component.html', styleUrls: ['./product-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatSelect, + MatOption, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + CurrencyPipe, + ], }) export class ProductDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -233,27 +283,27 @@ export class ProductDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/products'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/products'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/product/product-list/product-list.component.spec.ts b/overlord/src/app/product/product-list/product-list.component.spec.ts index 3ba32a4b..c1fe1781 100644 --- a/overlord/src/app/product/product-list/product-list.component.spec.ts +++ b/overlord/src/app/product/product-list/product-list.component.spec.ts @@ -1,6 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; import { ProductListComponent } from './product-list.component'; @@ -10,8 +8,7 @@ describe('ProductListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [ProductListComponent], + imports: [ReactiveFormsModule, RouterTestingModule, ProductListComponent], }).compileComponents(); fixture = TestBed.createComponent(ProductListComponent); diff --git a/overlord/src/app/product/product-list/product-list.component.ts b/overlord/src/app/product/product-list/product-list.component.ts index 4241cd99..97af15c7 100644 --- a/overlord/src/app/product/product-list/product-list.component.ts +++ b/overlord/src/app/product/product-list/product-list.component.ts @@ -1,8 +1,26 @@ +import { PercentPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; @@ -15,6 +33,37 @@ import { ProductListDataSource } from './product-list-datasource'; selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatAnchor, + RouterLink, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + PercentPipe, + CurrencyPipe, + ], }) export class ProductListComponent implements OnInit, AfterViewInit { @ViewChild('filterElement', { static: true }) filterElement?: ElementRef; diff --git a/overlord/src/app/product/product-routing.module.spec.ts b/overlord/src/app/product/product-routing.module.spec.ts deleted file mode 100644 index 003c52f7..00000000 --- a/overlord/src/app/product/product-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductRoutingModule } from './product-routing.module'; - -describe('ProductRoutingModule', () => { - let productRoutingModule: ProductRoutingModule; - - beforeEach(() => { - productRoutingModule = new ProductRoutingModule(); - }); - - it('should create an instance', () => { - expect(productRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/product/product.module.spec.ts b/overlord/src/app/product/product.module.spec.ts deleted file mode 100644 index 4c8a494a..00000000 --- a/overlord/src/app/product/product.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductModule } from './product.module'; - -describe('ProductModule', () => { - let productModule: ProductModule; - - beforeEach(() => { - productModule = new ProductModule(); - }); - - it('should create an instance', () => { - expect(productModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/product/product.module.ts b/overlord/src/app/product/product.module.ts deleted file mode 100644 index 3bf1e443..00000000 --- a/overlord/src/app/product/product.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { ProductDetailDialogComponent } from './product-detail/product-detail-dialog.component'; -import { ProductDetailComponent } from './product-detail/product-detail.component'; -import { ProductListComponent } from './product-list/product-list.component'; -import { ProductRoutingModule } from './product-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatCardModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - ProductRoutingModule, - MatDialogModule, - ], - declarations: [ProductListComponent, ProductDetailComponent, ProductDetailDialogComponent], -}) -export class ProductModule {} diff --git a/overlord/src/app/product/product-routing.module.ts b/overlord/src/app/product/product.routes.ts similarity index 77% rename from overlord/src/app/product/product-routing.module.ts rename to overlord/src/app/product/product.routes.ts index 4a5c1642..b7d56204 100644 --- a/overlord/src/app/product/product-routing.module.ts +++ b/overlord/src/app/product/product.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { productGroupListResolver } from '../product-group/product-group-list.resolver'; @@ -10,7 +8,7 @@ import { ProductListComponent } from './product-list/product-list.component'; import { productListResolver } from './product-list.resolver'; import { productResolver } from './product.resolver'; -const productRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ProductListComponent, @@ -47,9 +45,3 @@ const productRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(productRoutes)], - exports: [RouterModule], -}) -export class ProductRoutingModule {} diff --git a/overlord/src/app/profit-loss/profit-loss-routing.module.spec.ts b/overlord/src/app/profit-loss/profit-loss-routing.module.spec.ts deleted file mode 100644 index ac6179e8..00000000 --- a/overlord/src/app/profit-loss/profit-loss-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProfitLossRoutingModule } from './profit-loss-routing.module'; - -describe('ProfitLossRoutingModule', () => { - let profitLossRoutingModule: ProfitLossRoutingModule; - - beforeEach(() => { - profitLossRoutingModule = new ProfitLossRoutingModule(); - }); - - it('should create an instance', () => { - expect(profitLossRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/profit-loss/profit-loss.component.spec.ts b/overlord/src/app/profit-loss/profit-loss.component.spec.ts index c119894a..3a7eb621 100644 --- a/overlord/src/app/profit-loss/profit-loss.component.spec.ts +++ b/overlord/src/app/profit-loss/profit-loss.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProfitLossComponent } from './profit-loss.component'; @@ -8,14 +6,11 @@ describe('ProfitLossComponent', () => { let component: ProfitLossComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [ProfitLossComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ProfitLossComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ProfitLossComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/profit-loss/profit-loss.component.ts b/overlord/src/app/profit-loss/profit-loss.component.ts index d6f29fb3..b3a27542 100644 --- a/overlord/src/app/profit-loss/profit-loss.component.ts +++ b/overlord/src/app/profit-loss/profit-loss.component.ts @@ -1,7 +1,29 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; @@ -12,6 +34,40 @@ import { ProfitLossDataSource } from './profit-loss-datasource'; selector: 'app-profit-loss', templateUrl: './profit-loss.component.html', styleUrls: ['./profit-loss.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatPaginator, + CurrencyPipe, + ], }) export class ProfitLossComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/profit-loss/profit-loss.module.spec.ts b/overlord/src/app/profit-loss/profit-loss.module.spec.ts deleted file mode 100644 index 5d02ea14..00000000 --- a/overlord/src/app/profit-loss/profit-loss.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProfitLossModule } from './profit-loss.module'; - -describe('ProfitLossModule', () => { - let profitLossModule: ProfitLossModule; - - beforeEach(() => { - profitLossModule = new ProfitLossModule(); - }); - - it('should create an instance', () => { - expect(profitLossModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/profit-loss/profit-loss.module.ts b/overlord/src/app/profit-loss/profit-loss.module.ts deleted file mode 100644 index 23d0b426..00000000 --- a/overlord/src/app/profit-loss/profit-loss.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { ProfitLossRoutingModule } from './profit-loss-routing.module'; -import { ProfitLossComponent } from './profit-loss.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ProfitLossRoutingModule, - ], - declarations: [ProfitLossComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class ProfitLossModule {} diff --git a/overlord/src/app/profit-loss/profit-loss-routing.module.ts b/overlord/src/app/profit-loss/profit-loss.routes.ts similarity index 55% rename from overlord/src/app/profit-loss/profit-loss-routing.module.ts rename to overlord/src/app/profit-loss/profit-loss.routes.ts index ed71c217..86f7852c 100644 --- a/overlord/src/app/profit-loss/profit-loss-routing.module.ts +++ b/overlord/src/app/profit-loss/profit-loss.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { ProfitLossComponent } from './profit-loss.component'; import { profitLossResolver } from './profit-loss.resolver'; -const profitLossRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ProfitLossComponent, @@ -21,9 +19,3 @@ const profitLossRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(profitLossRoutes)], - exports: [RouterModule], -}) -export class ProfitLossRoutingModule {} diff --git a/overlord/src/app/purchase-entries/purchase-entries-routing.module.spec.ts b/overlord/src/app/purchase-entries/purchase-entries-routing.module.spec.ts deleted file mode 100644 index e95379ae..00000000 --- a/overlord/src/app/purchase-entries/purchase-entries-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchaseEntriesRoutingModule } from './purchase-entries-routing.module'; - -describe('PurchaseEntriesRoutingModule', () => { - let purchaseEntriesRoutingModule: PurchaseEntriesRoutingModule; - - beforeEach(() => { - purchaseEntriesRoutingModule = new PurchaseEntriesRoutingModule(); - }); - - it('should create an instance', () => { - expect(purchaseEntriesRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchase-entries/purchase-entries.component.spec.ts b/overlord/src/app/purchase-entries/purchase-entries.component.spec.ts index d7f495e5..132c15dd 100644 --- a/overlord/src/app/purchase-entries/purchase-entries.component.spec.ts +++ b/overlord/src/app/purchase-entries/purchase-entries.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PurchaseEntriesComponent } from './purchase-entries.component'; @@ -8,14 +6,11 @@ describe('PurchaseEntriesComponent', () => { let component: PurchaseEntriesComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [PurchaseEntriesComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PurchaseEntriesComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PurchaseEntriesComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/purchase-entries/purchase-entries.component.ts b/overlord/src/app/purchase-entries/purchase-entries.component.ts index 993a9d32..c218f1f5 100644 --- a/overlord/src/app/purchase-entries/purchase-entries.component.ts +++ b/overlord/src/app/purchase-entries/purchase-entries.component.ts @@ -1,8 +1,26 @@ +import { DecimalPipe, PercentPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { PurchaseEntries } from './purchase-entries'; @@ -12,6 +30,39 @@ import { PurchaseEntriesDataSource } from './purchase-entries-datasource'; selector: 'app-purchase-entries', templateUrl: './purchase-entries.component.html', styleUrls: ['./purchase-entries.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + DecimalPipe, + PercentPipe, + CurrencyPipe, + ], }) export class PurchaseEntriesComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/purchase-entries/purchase-entries.module.spec.ts b/overlord/src/app/purchase-entries/purchase-entries.module.spec.ts deleted file mode 100644 index 1d35b822..00000000 --- a/overlord/src/app/purchase-entries/purchase-entries.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchaseEntriesModule } from './purchase-entries.module'; - -describe('PurchaseEntriesModule', () => { - let purchaseEntriesModule: PurchaseEntriesModule; - - beforeEach(() => { - purchaseEntriesModule = new PurchaseEntriesModule(); - }); - - it('should create an instance', () => { - expect(purchaseEntriesModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchase-entries/purchase-entries.module.ts b/overlord/src/app/purchase-entries/purchase-entries.module.ts deleted file mode 100644 index 20f4ae71..00000000 --- a/overlord/src/app/purchase-entries/purchase-entries.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { PurchaseEntriesRoutingModule } from './purchase-entries-routing.module'; -import { PurchaseEntriesComponent } from './purchase-entries.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - PurchaseEntriesRoutingModule, - ], - declarations: [PurchaseEntriesComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class PurchaseEntriesModule {} diff --git a/overlord/src/app/purchase-entries/purchase-entries-routing.module.ts b/overlord/src/app/purchase-entries/purchase-entries.routes.ts similarity index 56% rename from overlord/src/app/purchase-entries/purchase-entries-routing.module.ts rename to overlord/src/app/purchase-entries/purchase-entries.routes.ts index 2bb38cc4..21dd8553 100644 --- a/overlord/src/app/purchase-entries/purchase-entries-routing.module.ts +++ b/overlord/src/app/purchase-entries/purchase-entries.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { PurchaseEntriesComponent } from './purchase-entries.component'; import { purchaseEntriesResolver } from './purchase-entries.resolver'; -const purchaseEntriesRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: PurchaseEntriesComponent, @@ -21,9 +19,3 @@ const purchaseEntriesRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(purchaseEntriesRoutes)], - exports: [RouterModule], -}) -export class PurchaseEntriesRoutingModule {} diff --git a/overlord/src/app/purchase-return/purchase-return-dialog.component.spec.ts b/overlord/src/app/purchase-return/purchase-return-dialog.component.spec.ts index 9d220723..b8944eb4 100644 --- a/overlord/src/app/purchase-return/purchase-return-dialog.component.spec.ts +++ b/overlord/src/app/purchase-return/purchase-return-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PurchaseReturnDialogComponent } from './purchase-return-dialog.component'; @@ -6,13 +6,11 @@ describe('PurchaseReturnDialogComponent', () => { let component: PurchaseReturnDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [PurchaseReturnDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PurchaseReturnDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PurchaseReturnDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/purchase-return/purchase-return-dialog.component.ts b/overlord/src/app/purchase-return/purchase-return-dialog.component.ts index 4295a715..26edc08a 100644 --- a/overlord/src/app/purchase-return/purchase-return-dialog.component.ts +++ b/overlord/src/app/purchase-return/purchase-return-dialog.component.ts @@ -1,7 +1,20 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -14,6 +27,23 @@ import { MathService } from '../shared/math.service'; selector: 'app-purchase-return-dialog', templateUrl: './purchase-return-dialog.component.html', styleUrls: ['./purchase-return-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + ], }) export class PurchaseReturnDialogComponent implements OnInit { batches: Observable; diff --git a/overlord/src/app/purchase-return/purchase-return-routing.module.spec.ts b/overlord/src/app/purchase-return/purchase-return-routing.module.spec.ts deleted file mode 100644 index 02c5b11a..00000000 --- a/overlord/src/app/purchase-return/purchase-return-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchaseReturnRoutingModule } from './purchase-return-routing.module'; - -describe('PurchaseReturnRoutingModule', () => { - let purchaseReturnRoutingModule: PurchaseReturnRoutingModule; - - beforeEach(() => { - purchaseReturnRoutingModule = new PurchaseReturnRoutingModule(); - }); - - it('should create an instance', () => { - expect(purchaseReturnRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchase-return/purchase-return.component.spec.ts b/overlord/src/app/purchase-return/purchase-return.component.spec.ts index de04e9b5..337a739c 100644 --- a/overlord/src/app/purchase-return/purchase-return.component.spec.ts +++ b/overlord/src/app/purchase-return/purchase-return.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PurchaseReturnComponent } from './purchase-return.component'; @@ -9,14 +6,11 @@ describe('PurchaseReturnComponent', () => { let component: PurchaseReturnComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [PurchaseReturnComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PurchaseReturnComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PurchaseReturnComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/purchase-return/purchase-return.component.ts b/overlord/src/app/purchase-return/purchase-return.component.ts index 38c7d60a..5badb636 100644 --- a/overlord/src/app/purchase-return/purchase-return.component.ts +++ b/overlord/src/app/purchase-return/purchase-return.component.ts @@ -1,9 +1,37 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { AsyncPipe, DecimalPipe, PercentPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatChipInputEvent, MatChipGrid, MatChipRow, MatChipRemove, MatChipInput } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel, MatHint, MatPrefix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { Hotkey, HotkeysService } from 'angular2-hotkeys'; import { round } from 'mathjs'; @@ -25,9 +53,11 @@ import { ToasterService } from '../core/toaster.service'; import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; import { ImageDialogComponent } from '../shared/image-dialog/image-dialog.component'; import { ImageService } from '../shared/image.service'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { MathService } from '../shared/math.service'; import { PurchaseReturnDataSource } from './purchase-return-datasource'; @@ -37,6 +67,52 @@ import { PurchaseReturnDialogComponent } from './purchase-return-dialog.componen selector: 'app-purchase-return', templateUrl: './purchase-return.component.html', styleUrls: ['./purchase-return.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatDatepicker, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatOption, + MatPrefix, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatChipGrid, + MatChipRow, + MatChipRemove, + MatChipInput, + MatCardActions, + AsyncPipe, + DecimalPipe, + PercentPipe, + CurrencyPipe, + AccountingPipe, + LocalTimePipe, + ], }) export class PurchaseReturnComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; @@ -282,21 +358,21 @@ export class PurchaseReturnComponent implements OnInit, AfterViewInit, OnDestroy } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -304,10 +380,10 @@ export class PurchaseReturnComponent implements OnInit, AfterViewInit, OnDestroy this.router.navigate(['/purchase-return', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -321,15 +397,15 @@ export class PurchaseReturnComponent implements OnInit, AfterViewInit, OnDestroy } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/purchase-return'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/purchase-return/purchase-return.module.spec.ts b/overlord/src/app/purchase-return/purchase-return.module.spec.ts deleted file mode 100644 index d122aef4..00000000 --- a/overlord/src/app/purchase-return/purchase-return.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchaseReturnModule } from './purchase-return.module'; - -describe('PurchaseReturnModule', () => { - let purchaseReturnModule: PurchaseReturnModule; - - beforeEach(() => { - purchaseReturnModule = new PurchaseReturnModule(); - }); - - it('should create an instance', () => { - expect(purchaseReturnModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchase-return/purchase-return.module.ts b/overlord/src/app/purchase-return/purchase-return.module.ts deleted file mode 100644 index b328c5ed..00000000 --- a/overlord/src/app/purchase-return/purchase-return.module.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { SharedModule } from '../shared/shared.module'; - -import { PurchaseReturnDialogComponent } from './purchase-return-dialog.component'; -import { PurchaseReturnRoutingModule } from './purchase-return-routing.module'; -import { PurchaseReturnComponent } from './purchase-return.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - HotkeyModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - PurchaseReturnRoutingModule, - ], - declarations: [PurchaseReturnComponent, PurchaseReturnDialogComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class PurchaseReturnModule {} diff --git a/overlord/src/app/purchase-return/purchase-return-routing.module.ts b/overlord/src/app/purchase-return/purchase-return.routes.ts similarity index 67% rename from overlord/src/app/purchase-return/purchase-return-routing.module.ts rename to overlord/src/app/purchase-return/purchase-return.routes.ts index 64324b39..e5c07563 100644 --- a/overlord/src/app/purchase-return/purchase-return-routing.module.ts +++ b/overlord/src/app/purchase-return/purchase-return.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { PurchaseReturnComponent } from './purchase-return.component'; import { purchaseReturnResolver } from './purchase-return.resolver'; -const purchaseReturnRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: PurchaseReturnComponent, @@ -33,9 +31,3 @@ const purchaseReturnRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(purchaseReturnRoutes)], - exports: [RouterModule], -}) -export class PurchaseReturnRoutingModule {} diff --git a/overlord/src/app/purchase/purchase-dialog.component.spec.ts b/overlord/src/app/purchase/purchase-dialog.component.spec.ts index 3b006d9b..c1ea4a97 100644 --- a/overlord/src/app/purchase/purchase-dialog.component.spec.ts +++ b/overlord/src/app/purchase/purchase-dialog.component.spec.ts @@ -1,5 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogModule } from '@angular/material/dialog'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PurchaseDialogComponent } from './purchase-dialog.component'; @@ -7,13 +6,11 @@ describe('PurchaseDialogComponent', () => { let component: PurchaseDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [MatDialogModule, PurchaseDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PurchaseDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PurchaseDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/purchase/purchase-dialog.component.ts b/overlord/src/app/purchase/purchase-dialog.component.ts index ce199301..362a8fed 100644 --- a/overlord/src/app/purchase/purchase-dialog.component.ts +++ b/overlord/src/app/purchase/purchase-dialog.component.ts @@ -1,7 +1,20 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { round } from 'mathjs'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -17,6 +30,23 @@ import { MathService } from '../shared/math.service'; selector: 'app-purchase-dialog', templateUrl: './purchase-dialog.component.html', styleUrls: ['./purchase-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + ], }) export class PurchaseDialogComponent implements OnInit { products: Observable; diff --git a/overlord/src/app/purchase/purchase-routing.module.spec.ts b/overlord/src/app/purchase/purchase-routing.module.spec.ts deleted file mode 100644 index ea182263..00000000 --- a/overlord/src/app/purchase/purchase-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchaseRoutingModule } from './purchase-routing.module'; - -describe('PurchaseRoutingModule', () => { - let purchaseRoutingModule: PurchaseRoutingModule; - - beforeEach(() => { - purchaseRoutingModule = new PurchaseRoutingModule(); - }); - - it('should create an instance', () => { - expect(purchaseRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchase/purchase.component.spec.ts b/overlord/src/app/purchase/purchase.component.spec.ts index 4f3cdcda..551fff88 100644 --- a/overlord/src/app/purchase/purchase.component.spec.ts +++ b/overlord/src/app/purchase/purchase.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PurchaseComponent } from './purchase.component'; @@ -9,14 +6,11 @@ describe('PurchaseComponent', () => { let component: PurchaseComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [PurchaseComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PurchaseComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PurchaseComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/purchase/purchase.component.ts b/overlord/src/app/purchase/purchase.component.ts index f0855908..0a63a8d0 100644 --- a/overlord/src/app/purchase/purchase.component.ts +++ b/overlord/src/app/purchase/purchase.component.ts @@ -1,9 +1,37 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { AsyncPipe, DecimalPipe, PercentPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatChipInputEvent, MatChipGrid, MatChipRow, MatChipRemove, MatChipInput } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel, MatHint, MatPrefix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { Hotkey, HotkeysService } from 'angular2-hotkeys'; import { round } from 'mathjs'; @@ -27,9 +55,11 @@ import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; import { ProductService } from '../product/product.service'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; import { ImageDialogComponent } from '../shared/image-dialog/image-dialog.component'; import { ImageService } from '../shared/image.service'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { MathService } from '../shared/math.service'; import { PurchaseDataSource } from './purchase-datasource'; @@ -39,6 +69,52 @@ import { PurchaseDialogComponent } from './purchase-dialog.component'; selector: 'app-purchase', templateUrl: './purchase.component.html', styleUrls: ['./purchase.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatDatepicker, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatOption, + MatPrefix, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatChipGrid, + MatChipRow, + MatChipRemove, + MatChipInput, + MatCardActions, + AsyncPipe, + DecimalPipe, + PercentPipe, + CurrencyPipe, + AccountingPipe, + LocalTimePipe, + ], }) export class PurchaseComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; @@ -308,21 +384,21 @@ export class PurchaseComponent implements OnInit, AfterViewInit, OnDestroy { } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -330,10 +406,10 @@ export class PurchaseComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate(['/purchase', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -347,15 +423,15 @@ export class PurchaseComponent implements OnInit, AfterViewInit, OnDestroy { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/purchase'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/purchase/purchase.module.spec.ts b/overlord/src/app/purchase/purchase.module.spec.ts deleted file mode 100644 index 2d118bae..00000000 --- a/overlord/src/app/purchase/purchase.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchaseModule } from './purchase.module'; - -describe('PurchaseModule', () => { - let purchaseModule: PurchaseModule; - - beforeEach(() => { - purchaseModule = new PurchaseModule(); - }); - - it('should create an instance', () => { - expect(purchaseModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchase/purchase.module.ts b/overlord/src/app/purchase/purchase.module.ts deleted file mode 100644 index 83366640..00000000 --- a/overlord/src/app/purchase/purchase.module.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { SharedModule } from '../shared/shared.module'; - -import { PurchaseDialogComponent } from './purchase-dialog.component'; -import { PurchaseRoutingModule } from './purchase-routing.module'; -import { PurchaseComponent } from './purchase.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - HotkeyModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - PurchaseRoutingModule, - ], - declarations: [PurchaseComponent, PurchaseDialogComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class PurchaseModule {} diff --git a/overlord/src/app/purchase/purchase-routing.module.ts b/overlord/src/app/purchase/purchase.routes.ts similarity index 66% rename from overlord/src/app/purchase/purchase-routing.module.ts rename to overlord/src/app/purchase/purchase.routes.ts index 848e9986..793171a1 100644 --- a/overlord/src/app/purchase/purchase-routing.module.ts +++ b/overlord/src/app/purchase/purchase.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { PurchaseComponent } from './purchase.component'; import { purchaseResolver } from './purchase.resolver'; -const purchaseRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: PurchaseComponent, @@ -33,9 +31,3 @@ const purchaseRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(purchaseRoutes)], - exports: [RouterModule], -}) -export class PurchaseRoutingModule {} diff --git a/overlord/src/app/purchases/purchases-routing.module.spec.ts b/overlord/src/app/purchases/purchases-routing.module.spec.ts deleted file mode 100644 index 68e163f1..00000000 --- a/overlord/src/app/purchases/purchases-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchasesRoutingModule } from './purchases-routing.module'; - -describe('PurchasesRoutingModule', () => { - let purchasesRoutingModule: PurchasesRoutingModule; - - beforeEach(() => { - purchasesRoutingModule = new PurchasesRoutingModule(); - }); - - it('should create an instance', () => { - expect(purchasesRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchases/purchases.component.spec.ts b/overlord/src/app/purchases/purchases.component.spec.ts index 9ee18ae3..94b54945 100644 --- a/overlord/src/app/purchases/purchases.component.spec.ts +++ b/overlord/src/app/purchases/purchases.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PurchasesComponent } from './purchases.component'; @@ -9,14 +6,11 @@ describe('PurchasesComponent', () => { let component: PurchasesComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [PurchasesComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PurchasesComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(PurchasesComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/purchases/purchases.component.ts b/overlord/src/app/purchases/purchases.component.ts index 4de4afb3..566247b5 100644 --- a/overlord/src/app/purchases/purchases.component.ts +++ b/overlord/src/app/purchases/purchases.component.ts @@ -1,8 +1,30 @@ +import { DecimalPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { Purchases } from './purchases'; @@ -13,6 +35,42 @@ import { PurchasesItem } from './purchases-item'; selector: 'app-purchases', templateUrl: './purchases.component.html', styleUrls: ['./purchases.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + RouterLink, + MatFooterCellDef, + MatFooterCell, + MatSortHeader, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatPaginator, + DecimalPipe, + CurrencyPipe, + ], }) export class PurchasesComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/purchases/purchases.module.spec.ts b/overlord/src/app/purchases/purchases.module.spec.ts deleted file mode 100644 index 271ed0cf..00000000 --- a/overlord/src/app/purchases/purchases.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PurchasesModule } from './purchases.module'; - -describe('PurchasesModule', () => { - let purchasesModule: PurchasesModule; - - beforeEach(() => { - purchasesModule = new PurchasesModule(); - }); - - it('should create an instance', () => { - expect(purchasesModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/purchases/purchases.module.ts b/overlord/src/app/purchases/purchases.module.ts deleted file mode 100644 index 2d973147..00000000 --- a/overlord/src/app/purchases/purchases.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { PurchasesRoutingModule } from './purchases-routing.module'; -import { PurchasesComponent } from './purchases.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - PurchasesRoutingModule, - ], - declarations: [PurchasesComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class PurchasesModule {} diff --git a/overlord/src/app/purchases/purchases-routing.module.ts b/overlord/src/app/purchases/purchases.routes.ts similarity index 55% rename from overlord/src/app/purchases/purchases-routing.module.ts rename to overlord/src/app/purchases/purchases.routes.ts index 5243518e..00565672 100644 --- a/overlord/src/app/purchases/purchases-routing.module.ts +++ b/overlord/src/app/purchases/purchases.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { PurchasesComponent } from './purchases.component'; import { purchasesResolver } from './purchases.resolver'; -const purchasesRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: PurchasesComponent, @@ -21,9 +19,3 @@ const purchasesRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(purchasesRoutes)], - exports: [RouterModule], -}) -export class PurchasesRoutingModule {} diff --git a/overlord/src/app/rate-contract/rate-contact.module.spec.ts b/overlord/src/app/rate-contract/rate-contact.module.spec.ts deleted file mode 100644 index 85650484..00000000 --- a/overlord/src/app/rate-contract/rate-contact.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RateContractModule } from './rate-contract.module'; - -describe('RateContractModule', () => { - let rateContractModule: RateContractModule; - - beforeEach(() => { - rateContractModule = new RateContractModule(); - }); - - it('should create an instance', () => { - expect(rateContractModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.spec.ts b/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.spec.ts index 2adbc49d..b5a7bb49 100644 --- a/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.spec.ts +++ b/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RateContractDetailComponent } from './rate-contract-detail.component'; @@ -8,14 +6,11 @@ describe('RateContractDetailComponent', () => { let component: RateContractDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [RateContractDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RateContractDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(RateContractDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.ts b/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.ts index a6420909..1927936b 100644 --- a/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.ts +++ b/overlord/src/app/rate-contract/rate-contract-detail/rate-contract-detail.component.ts @@ -1,7 +1,28 @@ +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; @@ -25,6 +46,41 @@ import { RateContractDetailDatasource } from './rate-contract-detail-datasource' selector: 'app-rate-contract-detail', templateUrl: './rate-contract-detail.component.html', styleUrls: ['./rate-contract-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + AsyncPipe, + CurrencyPipe, + ], }) export class RateContractDetailComponent implements OnInit, AfterViewInit { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; @@ -175,27 +231,27 @@ export class RateContractDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/rate-contracts'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/rate-contracts'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.spec.ts b/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.spec.ts index c096ca46..9a5d7ade 100644 --- a/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.spec.ts +++ b/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { RateContractListComponent } from './rate-contract-list.component'; @@ -9,8 +8,7 @@ describe('RateContractListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [RateContractListComponent], + imports: [RouterTestingModule, RateContractListComponent], }).compileComponents(); fixture = TestBed.createComponent(RateContractListComponent); diff --git a/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.ts b/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.ts index 75cfa916..49c13741 100644 --- a/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.ts +++ b/overlord/src/app/rate-contract/rate-contract-list/rate-contract-list.component.ts @@ -1,7 +1,23 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { RateContract } from '../rate-contract'; @@ -11,6 +27,31 @@ import { RateContractListDatasource } from './rate-contract-list-datasource'; selector: 'app-rate-contract-list', templateUrl: './rate-contract-list.component.html', styleUrls: ['./rate-contract-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + CurrencyPipe, + ], }) export class RateContractListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/rate-contract/rate-contract-routing.module.spec.ts b/overlord/src/app/rate-contract/rate-contract-routing.module.spec.ts deleted file mode 100644 index b09cb4cd..00000000 --- a/overlord/src/app/rate-contract/rate-contract-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RateContractRoutingModule } from './rate-contract-routing.module'; - -describe('RateContractRoutingModule', () => { - let rateContractRoutingModule: RateContractRoutingModule; - - beforeEach(() => { - rateContractRoutingModule = new RateContractRoutingModule(); - }); - - it('should create an instance', () => { - expect(rateContractRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/rate-contract/rate-contract.module.ts b/overlord/src/app/rate-contract/rate-contract.module.ts deleted file mode 100644 index 87ac1557..00000000 --- a/overlord/src/app/rate-contract/rate-contract.module.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { RateContractDetailComponent } from './rate-contract-detail/rate-contract-detail.component'; -import { RateContractListComponent } from './rate-contract-list/rate-contract-list.component'; -import { RateContractRoutingModule } from './rate-contract-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - RateContractRoutingModule, - MatDatepickerModule, - MatAutocompleteModule, - ], - declarations: [RateContractListComponent, RateContractDetailComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class RateContractModule {} diff --git a/overlord/src/app/rate-contract/rate-contract-routing.module.ts b/overlord/src/app/rate-contract/rate-contract.routes.ts similarity index 75% rename from overlord/src/app/rate-contract/rate-contract-routing.module.ts rename to overlord/src/app/rate-contract/rate-contract.routes.ts index 019bcd59..471d44a0 100644 --- a/overlord/src/app/rate-contract/rate-contract-routing.module.ts +++ b/overlord/src/app/rate-contract/rate-contract.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { RateContractListComponent } from './rate-contract-list/rate-contract-li import { rateContractListResolver } from './rate-contract-list.resolver'; import { rateContractResolver } from './rate-contract.resolver'; -const rateContractRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: RateContractListComponent, @@ -44,9 +42,3 @@ const rateContractRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(rateContractRoutes)], - exports: [RouterModule], -}) -export class RateContractRoutingModule {} diff --git a/overlord/src/app/raw-material-cost/raw-material-cost-routing.module.spec.ts b/overlord/src/app/raw-material-cost/raw-material-cost-routing.module.spec.ts deleted file mode 100644 index 670e0f2a..00000000 --- a/overlord/src/app/raw-material-cost/raw-material-cost-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RawMaterialCostRoutingModule } from './raw-material-cost-routing.module'; - -describe('RawMaterialCostRoutingModule', () => { - let rawMaterialCostRoutingModule: RawMaterialCostRoutingModule; - - beforeEach(() => { - rawMaterialCostRoutingModule = new RawMaterialCostRoutingModule(); - }); - - it('should create an instance', () => { - expect(rawMaterialCostRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/raw-material-cost/raw-material-cost.component.spec.ts b/overlord/src/app/raw-material-cost/raw-material-cost.component.spec.ts index e465686e..43d01458 100644 --- a/overlord/src/app/raw-material-cost/raw-material-cost.component.spec.ts +++ b/overlord/src/app/raw-material-cost/raw-material-cost.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RawMaterialCostComponent } from './raw-material-cost.component'; @@ -8,14 +6,11 @@ describe('RawMaterialCostComponent', () => { let component: RawMaterialCostComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [RawMaterialCostComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RawMaterialCostComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(RawMaterialCostComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/raw-material-cost/raw-material-cost.component.ts b/overlord/src/app/raw-material-cost/raw-material-cost.component.ts index 6fe871df..bf408b40 100644 --- a/overlord/src/app/raw-material-cost/raw-material-cost.component.ts +++ b/overlord/src/app/raw-material-cost/raw-material-cost.component.ts @@ -1,8 +1,31 @@ +import { DecimalPipe, PercentPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { ToCsvService } from '../shared/to-csv.service'; @@ -14,6 +37,46 @@ import { RawMaterialCostDataSource } from './raw-material-cost-datasource'; selector: 'app-raw-material-cost', templateUrl: './raw-material-cost.component.html', styleUrls: ['./raw-material-cost.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatPaginator, + DecimalPipe, + PercentPipe, + CurrencyPipe, + ], }) export class RawMaterialCostComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/raw-material-cost/raw-material-cost.module.spec.ts b/overlord/src/app/raw-material-cost/raw-material-cost.module.spec.ts deleted file mode 100644 index 889f29e4..00000000 --- a/overlord/src/app/raw-material-cost/raw-material-cost.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RawMaterialCostModule } from './raw-material-cost.module'; - -describe('RawMaterialCostModule', () => { - let rawMaterialCostModule: RawMaterialCostModule; - - beforeEach(() => { - rawMaterialCostModule = new RawMaterialCostModule(); - }); - - it('should create an instance', () => { - expect(rawMaterialCostModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/raw-material-cost/raw-material-cost.module.ts b/overlord/src/app/raw-material-cost/raw-material-cost.module.ts deleted file mode 100644 index 39e9d0d9..00000000 --- a/overlord/src/app/raw-material-cost/raw-material-cost.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { RawMaterialCostRoutingModule } from './raw-material-cost-routing.module'; -import { RawMaterialCostComponent } from './raw-material-cost.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - RawMaterialCostRoutingModule, - ], - declarations: [RawMaterialCostComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class RawMaterialCostModule {} diff --git a/overlord/src/app/raw-material-cost/raw-material-cost-routing.module.ts b/overlord/src/app/raw-material-cost/raw-material-cost.routes.ts similarity index 67% rename from overlord/src/app/raw-material-cost/raw-material-cost-routing.module.ts rename to overlord/src/app/raw-material-cost/raw-material-cost.routes.ts index 9cda6c2c..eb60aea5 100644 --- a/overlord/src/app/raw-material-cost/raw-material-cost-routing.module.ts +++ b/overlord/src/app/raw-material-cost/raw-material-cost.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { RawMaterialCostComponent } from './raw-material-cost.component'; import { rawMaterialCostResolver } from './raw-material-cost.resolver'; -const rawMaterialCostRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: RawMaterialCostComponent, @@ -33,9 +31,3 @@ const rawMaterialCostRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(rawMaterialCostRoutes)], - exports: [RouterModule], -}) -export class RawMaterialCostRoutingModule {} diff --git a/overlord/src/app/receipt/receipt-dialog.component.spec.ts b/overlord/src/app/receipt/receipt-dialog.component.spec.ts index d354f1cb..a24b5716 100644 --- a/overlord/src/app/receipt/receipt-dialog.component.spec.ts +++ b/overlord/src/app/receipt/receipt-dialog.component.spec.ts @@ -1,5 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogRef } from '@angular/material/dialog'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReceiptDialogComponent } from './receipt-dialog.component'; @@ -7,14 +6,11 @@ describe('ReceiptDialogComponent', () => { let component: ReceiptDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogRef], - declarations: [ReceiptDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ReceiptDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ReceiptDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/receipt/receipt-dialog.component.ts b/overlord/src/app/receipt/receipt-dialog.component.ts index 4947be1c..8c357c7d 100644 --- a/overlord/src/app/receipt/receipt-dialog.component.ts +++ b/overlord/src/app/receipt/receipt-dialog.component.ts @@ -1,7 +1,20 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatHint, MatPrefix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; @@ -9,12 +22,34 @@ import { Account } from '../core/account'; import { AccountBalance } from '../core/account-balance'; import { AccountService } from '../core/account.service'; import { Journal } from '../core/journal'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { MathService } from '../shared/math.service'; @Component({ selector: 'app-receipt-dialog', templateUrl: './receipt-dialog.component.html', styleUrls: ['./receipt-dialog.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatOption, + MatPrefix, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + ], }) export class ReceiptDialogComponent implements OnInit { accounts: Observable; diff --git a/overlord/src/app/receipt/receipt-routing.module.spec.ts b/overlord/src/app/receipt/receipt-routing.module.spec.ts deleted file mode 100644 index a58d5cda..00000000 --- a/overlord/src/app/receipt/receipt-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ReceiptRoutingModule } from './receipt-routing.module'; - -describe('ReceiptRoutingModule', () => { - let receiptRoutingModule: ReceiptRoutingModule; - - beforeEach(() => { - receiptRoutingModule = new ReceiptRoutingModule(); - }); - - it('should create an instance', () => { - expect(receiptRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/receipt/receipt.component.spec.ts b/overlord/src/app/receipt/receipt.component.spec.ts index 4cb4369a..b9794d6a 100644 --- a/overlord/src/app/receipt/receipt.component.spec.ts +++ b/overlord/src/app/receipt/receipt.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReceiptComponent } from './receipt.component'; @@ -9,14 +6,11 @@ describe('ReceiptComponent', () => { let component: ReceiptComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [ReceiptComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ReceiptComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ReceiptComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/receipt/receipt.component.ts b/overlord/src/app/receipt/receipt.component.ts index a0880fb5..d3055cee 100644 --- a/overlord/src/app/receipt/receipt.component.ts +++ b/overlord/src/app/receipt/receipt.component.ts @@ -1,9 +1,38 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatChipInputEvent, MatChipGrid, MatChipRow, MatChipRemove, MatChipInput } from '@angular/material/chips'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatSuffix, MatFormField, MatLabel, MatPrefix, MatHint } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { Hotkey, HotkeysService } from 'angular2-hotkeys'; import { round } from 'mathjs'; @@ -23,9 +52,11 @@ import { ToasterService } from '../core/toaster.service'; import { User } from '../core/user'; import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; +import { AccountingPipe } from '../shared/accounting.pipe'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; import { ImageDialogComponent } from '../shared/image-dialog/image-dialog.component'; import { ImageService } from '../shared/image.service'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { MathService } from '../shared/math.service'; import { ReceiptDataSource } from './receipt-datasource'; @@ -35,6 +66,51 @@ import { ReceiptDialogComponent } from './receipt-dialog.component'; selector: 'app-receipt', templateUrl: './receipt.component.html', styleUrls: ['./receipt.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIcon, + MatSuffix, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatDatepicker, + MatSelect, + MatOption, + MatPrefix, + MatAutocompleteTrigger, + MatHint, + MatAutocomplete, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatChipGrid, + MatChipRow, + MatChipRemove, + MatChipInput, + MatCardActions, + AsyncPipe, + CurrencyPipe, + AccountingPipe, + LocalTimePipe, + ], }) export class ReceiptComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('accountElement', { static: true }) accountElement?: ElementRef; @@ -280,21 +356,21 @@ export class ReceiptComponent implements OnInit, AfterViewInit, OnDestroy { } post() { - this.ser.post(this.voucher.id as string).subscribe( - (result) => { + this.ser.post(this.voucher.id as string).subscribe({ + next: (result) => { this.loadVoucher(result); this.toaster.show('Success', 'Voucher Posted'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } save() { const voucher: Voucher = this.getVoucher(); - this.ser.saveOrUpdate(voucher).subscribe( - (result) => { + this.ser.saveOrUpdate(voucher).subscribe({ + next: (result) => { this.toaster.show('Success', ''); if (voucher.id === result.id) { this.loadVoucher(result); @@ -302,10 +378,10 @@ export class ReceiptComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate(['/receipt', result.id]); } }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } getVoucher(): Voucher { @@ -317,15 +393,15 @@ export class ReceiptComponent implements OnInit, AfterViewInit, OnDestroy { } delete() { - this.ser.delete(this.voucher.id as string).subscribe( - () => { + this.ser.delete(this.voucher.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/receipt'], { replaceUrl: true }); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/receipt/receipt.module.spec.ts b/overlord/src/app/receipt/receipt.module.spec.ts deleted file mode 100644 index d6195641..00000000 --- a/overlord/src/app/receipt/receipt.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ReceiptModule } from './receipt.module'; - -describe('ReceiptModule', () => { - let receiptModule: ReceiptModule; - - beforeEach(() => { - receiptModule = new ReceiptModule(); - }); - - it('should create an instance', () => { - expect(receiptModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/receipt/receipt.module.ts b/overlord/src/app/receipt/receipt.module.ts deleted file mode 100644 index 19aa2583..00000000 --- a/overlord/src/app/receipt/receipt.module.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { HotkeyModule } from 'angular2-hotkeys'; - -import { SharedModule } from '../shared/shared.module'; - -import { ReceiptDialogComponent } from './receipt-dialog.component'; -import { ReceiptRoutingModule } from './receipt-routing.module'; -import { ReceiptComponent } from './receipt.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - HotkeyModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ReceiptRoutingModule, - ], - declarations: [ReceiptComponent, ReceiptDialogComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class ReceiptModule {} diff --git a/overlord/src/app/receipt/receipt-routing.module.ts b/overlord/src/app/receipt/receipt.routes.ts similarity index 71% rename from overlord/src/app/receipt/receipt-routing.module.ts rename to overlord/src/app/receipt/receipt.routes.ts index 7c943104..7bcf713b 100644 --- a/overlord/src/app/receipt/receipt-routing.module.ts +++ b/overlord/src/app/receipt/receipt.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -8,7 +6,7 @@ import { receiptAccountsResolver } from './receipt-accounts.resolver'; import { ReceiptComponent } from './receipt.component'; import { receiptResolver } from './receipt.resolver'; -const receiptRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: ReceiptComponent, @@ -36,9 +34,3 @@ const receiptRoutes: Routes = [ runGuardsAndResolvers: 'paramsChange', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(receiptRoutes)], - exports: [RouterModule], -}) -export class ReceiptRoutingModule {} diff --git a/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.spec.ts b/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.spec.ts index 6b22c93e..d34d5a60 100644 --- a/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.spec.ts +++ b/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.spec.ts @@ -1,7 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RecipeTemplateDetailComponent } from './recipe-template-detail.component'; @@ -9,14 +6,11 @@ describe('RecipeTemplateDetailComponent', () => { let component: RecipeTemplateDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [MatDialogModule, ReactiveFormsModule, RouterTestingModule], - declarations: [RecipeTemplateDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RecipeTemplateDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(RecipeTemplateDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.ts b/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.ts index dcda1839..776f3c63 100644 --- a/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.ts +++ b/overlord/src/app/recipe-template/recipe-template-detail/recipe-template-detail.component.ts @@ -1,6 +1,12 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; @@ -13,6 +19,24 @@ import { RecipeTemplateService } from '../recipe-template.service'; selector: 'app-recipe-template-detail', templateUrl: './recipe-template-detail.component.html', styleUrls: ['./recipe-template-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class RecipeTemplateDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -67,27 +91,27 @@ export class RecipeTemplateDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/recipe-templates'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id).subscribe( - () => { + this.ser.delete(this.item.id).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/recipe-templates'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.spec.ts b/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.spec.ts index 6688b089..5bf65e7d 100644 --- a/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.spec.ts +++ b/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { RecipeTemplateListComponent } from './recipe-template-list.component'; @@ -9,8 +8,7 @@ describe('RecipeTemplateListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [RecipeTemplateListComponent], + imports: [RouterTestingModule, RecipeTemplateListComponent], }).compileComponents(); fixture = TestBed.createComponent(RecipeTemplateListComponent); diff --git a/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.ts b/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.ts index 48a0791f..6f472fb5 100644 --- a/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.ts +++ b/overlord/src/app/recipe-template/recipe-template-list/recipe-template-list.component.ts @@ -1,7 +1,22 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { RecipeTemplate } from '../recipe-template'; @@ -11,6 +26,30 @@ import { RecipeTemplateListDataSource } from './recipe-template-list-datasource' selector: 'app-recipe-template-list', templateUrl: './recipe-template-list.component.html', styleUrls: ['./recipe-template-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + ], }) export class RecipeTemplateListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/recipe-template/recipe-template-routing.module.spec.ts b/overlord/src/app/recipe-template/recipe-template-routing.module.spec.ts deleted file mode 100644 index 6cdc5ab7..00000000 --- a/overlord/src/app/recipe-template/recipe-template-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RecipeTemplateRoutingModule } from './recipe-template-routing.module'; - -describe('RecipeTemplateRoutingModule', () => { - let recipeTemplateRoutingModule: RecipeTemplateRoutingModule; - - beforeEach(() => { - recipeTemplateRoutingModule = new RecipeTemplateRoutingModule(); - }); - - it('should create an instance', () => { - expect(recipeTemplateRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/recipe-template/recipe-template.module.spec.ts b/overlord/src/app/recipe-template/recipe-template.module.spec.ts deleted file mode 100644 index 27a6ca17..00000000 --- a/overlord/src/app/recipe-template/recipe-template.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RecipeTemplateModule } from './recipe-template.module'; - -describe('RecipeTemplateModule', () => { - let recipeTemplateModule: RecipeTemplateModule; - - beforeEach(() => { - recipeTemplateModule = new RecipeTemplateModule(); - }); - - it('should create an instance', () => { - expect(recipeTemplateModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/recipe-template/recipe-template.module.ts b/overlord/src/app/recipe-template/recipe-template.module.ts deleted file mode 100644 index 2c8ead43..00000000 --- a/overlord/src/app/recipe-template/recipe-template.module.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { RecipeTemplateDetailComponent } from './recipe-template-detail/recipe-template-detail.component'; -import { RecipeTemplateListComponent } from './recipe-template-list/recipe-template-list.component'; -import { RecipeTemplateRoutingModule } from './recipe-template-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - RecipeTemplateRoutingModule, - ], - declarations: [RecipeTemplateListComponent, RecipeTemplateDetailComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class RecipeTemplateModule {} diff --git a/overlord/src/app/recipe-template/recipe-template-routing.module.ts b/overlord/src/app/recipe-template/recipe-template.routes.ts similarity index 75% rename from overlord/src/app/recipe-template/recipe-template-routing.module.ts rename to overlord/src/app/recipe-template/recipe-template.routes.ts index b2db3227..4c0e47d4 100644 --- a/overlord/src/app/recipe-template/recipe-template-routing.module.ts +++ b/overlord/src/app/recipe-template/recipe-template.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { RecipeTemplateListComponent } from './recipe-template-list/recipe-templ import { recipeTemplateListResolver } from './recipe-template-list.resolver'; import { recipeTemplateResolver } from './recipe-template.resolver'; -const recipeTemplateRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: RecipeTemplateListComponent, @@ -44,9 +42,3 @@ const recipeTemplateRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(recipeTemplateRoutes)], - exports: [RouterModule], -}) -export class RecipeTemplateRoutingModule {} diff --git a/overlord/src/app/recipe/recipe-detail/recipe-detail.component.spec.ts b/overlord/src/app/recipe/recipe-detail/recipe-detail.component.spec.ts index 6685784e..dd36d4b3 100644 --- a/overlord/src/app/recipe/recipe-detail/recipe-detail.component.spec.ts +++ b/overlord/src/app/recipe/recipe-detail/recipe-detail.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RecipeDetailComponent } from './recipe-detail.component'; @@ -8,14 +6,11 @@ describe('ProductGroupDetailComponent', () => { let component: RecipeDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [RecipeDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RecipeDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(RecipeDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/recipe/recipe-detail/recipe-detail.component.ts b/overlord/src/app/recipe/recipe-detail/recipe-detail.component.ts index 27d45969..98bc0d68 100644 --- a/overlord/src/app/recipe/recipe-detail/recipe-detail.component.ts +++ b/overlord/src/app/recipe/recipe-detail/recipe-detail.component.ts @@ -1,7 +1,28 @@ +import { AsyncPipe, DecimalPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; @@ -24,6 +45,41 @@ import { RecipeDetailDatasource } from './recipe-detail-datasource'; selector: 'app-product-group-detail', templateUrl: './recipe-detail.component.html', styleUrls: ['./recipe-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + AsyncPipe, + DecimalPipe, + ], }) export class RecipeDetailComponent implements OnInit, AfterViewInit { @ViewChild('productElement', { static: true }) productElement?: ElementRef; @@ -196,27 +252,27 @@ export class RecipeDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/recipes'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/recipes']); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/recipe/recipe-list/recipe-list.component.spec.ts b/overlord/src/app/recipe/recipe-list/recipe-list.component.spec.ts index f0099ede..32d2b92f 100644 --- a/overlord/src/app/recipe/recipe-list/recipe-list.component.spec.ts +++ b/overlord/src/app/recipe/recipe-list/recipe-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { RecipeListComponent } from './recipe-list.component'; @@ -9,8 +8,7 @@ describe('RoleListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [RecipeListComponent], + imports: [RouterTestingModule, RecipeListComponent], }).compileComponents(); fixture = TestBed.createComponent(RecipeListComponent); diff --git a/overlord/src/app/recipe/recipe-list/recipe-list.component.ts b/overlord/src/app/recipe/recipe-list/recipe-list.component.ts index d5ddd227..2e2f7d6b 100644 --- a/overlord/src/app/recipe/recipe-list/recipe-list.component.ts +++ b/overlord/src/app/recipe/recipe-list/recipe-list.component.ts @@ -1,8 +1,26 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconAnchor, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSelect } from '@angular/material/select'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { Period } from 'src/app/period/period'; @@ -15,6 +33,36 @@ import { RecipeListDatasource } from './recipe-list-datasource'; selector: 'app-role-list', templateUrl: './recipe-list.component.html', styleUrls: ['./recipe-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconAnchor, + MatIcon, + MatAnchor, + RouterLink, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatSelect, + MatOption, + MatLabel, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + ], }) export class RecipeListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/recipe/recipe-routing.module.spec.ts b/overlord/src/app/recipe/recipe-routing.module.spec.ts deleted file mode 100644 index 091eac3e..00000000 --- a/overlord/src/app/recipe/recipe-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RecipeRoutingModule } from './recipe-routing.module'; - -describe('RecipeRoutingModule', () => { - let recipeRoutingModule: RecipeRoutingModule; - - beforeEach(() => { - recipeRoutingModule = new RecipeRoutingModule(); - }); - - it('should create an instance', () => { - expect(recipeRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/recipe/recipe.module.spec.ts b/overlord/src/app/recipe/recipe.module.spec.ts deleted file mode 100644 index 330822ca..00000000 --- a/overlord/src/app/recipe/recipe.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RecipeModule } from './recipe.module'; - -describe('RoleModule', () => { - let roleModule: RecipeModule; - - beforeEach(() => { - roleModule = new RecipeModule(); - }); - - it('should create an instance', () => { - expect(roleModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/recipe/recipe.module.ts b/overlord/src/app/recipe/recipe.module.ts deleted file mode 100644 index 99b4aa9e..00000000 --- a/overlord/src/app/recipe/recipe.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { RecipeDetailComponent } from './recipe-detail/recipe-detail.component'; -import { RecipeListComponent } from './recipe-list/recipe-list.component'; -import { RecipeRoutingModule } from './recipe-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - RecipeRoutingModule, - MatAutocompleteModule, - MatDatepickerModule, - MatSelectModule, - ], - declarations: [RecipeListComponent, RecipeDetailComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class RecipeModule {} diff --git a/overlord/src/app/recipe/recipe-routing.module.ts b/overlord/src/app/recipe/recipe.routes.ts similarity index 79% rename from overlord/src/app/recipe/recipe-routing.module.ts rename to overlord/src/app/recipe/recipe.routes.ts index 56586770..48329a1a 100644 --- a/overlord/src/app/recipe/recipe-routing.module.ts +++ b/overlord/src/app/recipe/recipe.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { periodListResolver } from '../period/period-list.resolver'; @@ -11,7 +9,7 @@ import { RecipeListComponent } from './recipe-list/recipe-list.component'; import { recipeListResolver } from './recipe-list.resolver'; import { recipeResolver } from './recipe.resolver'; -const recipeRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: RecipeListComponent, @@ -51,9 +49,3 @@ const recipeRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(recipeRoutes)], - exports: [RouterModule], -}) -export class RecipeRoutingModule {} diff --git a/overlord/src/app/role/role-detail/role-detail.component.spec.ts b/overlord/src/app/role/role-detail/role-detail.component.spec.ts index f90227ca..f408a35f 100644 --- a/overlord/src/app/role/role-detail/role-detail.component.spec.ts +++ b/overlord/src/app/role/role-detail/role-detail.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RoleDetailComponent } from './role-detail.component'; @@ -8,14 +6,11 @@ describe('RoleDetailComponent', () => { let component: RoleDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [RoleDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RoleDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(RoleDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/role/role-detail/role-detail.component.ts b/overlord/src/app/role/role-detail/role-detail.component.ts index e3677742..633cf6a1 100644 --- a/overlord/src/app/role/role-detail/role-detail.component.ts +++ b/overlord/src/app/role/role-detail/role-detail.component.ts @@ -1,6 +1,12 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -12,6 +18,21 @@ import { RoleService } from '../role.service'; selector: 'app-role-detail', templateUrl: './role-detail.component.html', styleUrls: ['./role-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDivider, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class RoleDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -65,27 +86,27 @@ export class RoleDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/roles'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/roles'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/role/role-list/role-list.component.spec.ts b/overlord/src/app/role/role-list/role-list.component.spec.ts index ef7f4b74..460b7aec 100644 --- a/overlord/src/app/role/role-list/role-list.component.spec.ts +++ b/overlord/src/app/role/role-list/role-list.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; import { RoleListComponent } from './role-list.component'; @@ -9,8 +8,7 @@ describe('RoleListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [RoleListComponent], + imports: [RouterTestingModule, RoleListComponent], }).compileComponents(); fixture = TestBed.createComponent(RoleListComponent); diff --git a/overlord/src/app/role/role-list/role-list.component.ts b/overlord/src/app/role/role-list/role-list.component.ts index 23952c1a..97371cf5 100644 --- a/overlord/src/app/role/role-list/role-list.component.ts +++ b/overlord/src/app/role/role-list/role-list.component.ts @@ -1,7 +1,22 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Role } from '../role'; @@ -11,6 +26,30 @@ import { RoleListDatasource } from './role-list-datasource'; selector: 'app-role-list', templateUrl: './role-list.component.html', styleUrls: ['./role-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + ], }) export class RoleListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/role/role-routing.module.spec.ts b/overlord/src/app/role/role-routing.module.spec.ts deleted file mode 100644 index 2cce2eef..00000000 --- a/overlord/src/app/role/role-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RoleRoutingModule } from './role-routing.module'; - -describe('RoleRoutingModule', () => { - let roleRoutingModule: RoleRoutingModule; - - beforeEach(() => { - roleRoutingModule = new RoleRoutingModule(); - }); - - it('should create an instance', () => { - expect(roleRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/role/role.module.spec.ts b/overlord/src/app/role/role.module.spec.ts deleted file mode 100644 index 615f2603..00000000 --- a/overlord/src/app/role/role.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RoleModule } from './role.module'; - -describe('RoleModule', () => { - let roleModule: RoleModule; - - beforeEach(() => { - roleModule = new RoleModule(); - }); - - it('should create an instance', () => { - expect(roleModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/role/role.module.ts b/overlord/src/app/role/role.module.ts deleted file mode 100644 index 7615d2be..00000000 --- a/overlord/src/app/role/role.module.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { RoleDetailComponent } from './role-detail/role-detail.component'; -import { RoleListComponent } from './role-list/role-list.component'; -import { RoleRoutingModule } from './role-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - RoleRoutingModule, - ], - declarations: [RoleListComponent, RoleDetailComponent], -}) -export class RoleModule {} diff --git a/overlord/src/app/role/role-routing.module.ts b/overlord/src/app/role/role.routes.ts similarity index 73% rename from overlord/src/app/role/role-routing.module.ts rename to overlord/src/app/role/role.routes.ts index e58b4fe9..47f65093 100644 --- a/overlord/src/app/role/role-routing.module.ts +++ b/overlord/src/app/role/role.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { RoleListComponent } from './role-list/role-list.component'; import { roleListResolver } from './role-list.resolver'; import { roleResolver } from './role.resolver'; -const roleRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: RoleListComponent, @@ -44,9 +42,3 @@ const roleRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(roleRoutes)], - exports: [RouterModule], -}) -export class RoleRoutingModule {} diff --git a/overlord/src/app/settings/settings.component.ts b/overlord/src/app/settings/settings.component.ts index 7915cef6..fa2b5ffe 100644 --- a/overlord/src/app/settings/settings.component.ts +++ b/overlord/src/app/settings/settings.component.ts @@ -1,11 +1,32 @@ import { Component, OnInit } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatCard, MatCardContent, MatCardSubtitle } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSort } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { MatTabGroup, MatTab } from '@angular/material/tabs'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { BehaviorSubject } from 'rxjs'; -import { environment } from '../../environments/environment'; +import { environment } from '../app.environment'; import { AuthService } from '../auth/auth.service'; import { AccountType } from '../core/account-type'; import { ToasterService } from '../core/toaster.service'; @@ -19,6 +40,37 @@ import { SettingsService } from './settings.service'; selector: 'app-settings', templateUrl: './settings.component.html', styleUrls: ['./settings.component.css'], + standalone: true, + imports: [ + MatTabGroup, + MatTab, + MatCard, + MatCardContent, + ReactiveFormsModule, + MatCheckbox, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardSubtitle, + ], }) export class SettingsComponent implements OnInit { public lockObservable = new BehaviorSubject([]); @@ -188,15 +240,15 @@ export class SettingsComponent implements OnInit { } item.index = this.lockInfoForm.value.index ?? 0; - this.ser.setLockInformation(item).subscribe( - (result) => { + this.ser.setLockInformation(item).subscribe({ + next: (result) => { this.showLockInformation(result); this.toaster.show('Success', 'Lock information Updated'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } deleteLock(row: LockInfo) { @@ -223,14 +275,14 @@ export class SettingsComponent implements OnInit { } rebaseData(rebaseDate: string) { - this.ser.rebaseDatabase(rebaseDate).subscribe( - () => { + this.ser.rebaseDatabase(rebaseDate).subscribe({ + next: () => { this.toaster.show('Success', 'Data has been rebased!'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } toggleMaintenance() { diff --git a/overlord/src/app/settings/settings.module.ts b/overlord/src/app/settings/settings.module.ts deleted file mode 100644 index 7356b026..00000000 --- a/overlord/src/app/settings/settings.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { SettingsRoutingModule } from './settings-routing.module'; -import { SettingsComponent } from './settings.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - MatTabsModule, - ReactiveFormsModule, - SharedModule, - SettingsRoutingModule, - ], - declarations: [SettingsComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class SettingsModule {} diff --git a/overlord/src/app/settings/settings-routing.module.ts b/overlord/src/app/settings/settings.routes.ts similarity index 70% rename from overlord/src/app/settings/settings-routing.module.ts rename to overlord/src/app/settings/settings.routes.ts index 3626700c..01694ac0 100644 --- a/overlord/src/app/settings/settings-routing.module.ts +++ b/overlord/src/app/settings/settings.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { accountTypeResolver } from '../account/account-type.resolver'; import { authGuard } from '../auth/auth-guard.service'; @@ -10,7 +8,7 @@ import { maintenanceResolver } from './maintenance.resolver'; import { SettingsComponent } from './settings.component'; import { voucherTypeResolver } from './voucher-type.resolver'; -const settingsRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: SettingsComponent, @@ -27,9 +25,3 @@ const settingsRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(settingsRoutes)], - exports: [RouterModule], -}) -export class SettingsRoutingModule {} diff --git a/overlord/src/app/shared/accounting.pipe.ts b/overlord/src/app/shared/accounting.pipe.ts index be29e6c0..5023d998 100644 --- a/overlord/src/app/shared/accounting.pipe.ts +++ b/overlord/src/app/shared/accounting.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'accounting', + standalone: true, }) export class AccountingPipe implements PipeTransform { transform(value: string | null): string { diff --git a/overlord/src/app/shared/clear.pipe.ts b/overlord/src/app/shared/clear.pipe.ts index ce5855af..07ac6023 100644 --- a/overlord/src/app/shared/clear.pipe.ts +++ b/overlord/src/app/shared/clear.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'clear', + standalone: true, }) export class ClearPipe implements PipeTransform { transform(value: string | null): string { diff --git a/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts b/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts index ad57d9b1..dc7f324e 100644 --- a/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts +++ b/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ConfirmDialogComponent } from './confirm-dialog.component'; @@ -6,13 +6,11 @@ describe('ConfirmDialogComponent', () => { let component: ConfirmDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ConfirmDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ConfirmDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ConfirmDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.ts b/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.ts index a22e1b98..4b422270 100644 --- a/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.ts +++ b/overlord/src/app/shared/confirm-dialog/confirm-dialog.component.ts @@ -1,10 +1,21 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; @Component({ selector: 'app-confirm-dialog', templateUrl: './confirm-dialog.component.html', styleUrls: ['./confirm-dialog.component.css'], + standalone: true, + imports: [MatDialogTitle, CdkScrollable, MatDialogContent, MatDialogActions, MatButton, MatDialogClose], }) export class ConfirmDialogComponent { constructor( diff --git a/overlord/src/app/shared/image-dialog/image-dialog.component.spec.ts b/overlord/src/app/shared/image-dialog/image-dialog.component.spec.ts index a718757c..a91eba48 100644 --- a/overlord/src/app/shared/image-dialog/image-dialog.component.spec.ts +++ b/overlord/src/app/shared/image-dialog/image-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ImageDialogComponent } from './image-dialog.component'; @@ -6,13 +6,11 @@ describe('ImageDialogComponent', () => { let component: ImageDialogComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ImageDialogComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ImageDialogComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(ImageDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/shared/image-dialog/image-dialog.component.ts b/overlord/src/app/shared/image-dialog/image-dialog.component.ts index 3878fc27..a89b2bdc 100644 --- a/overlord/src/app/shared/image-dialog/image-dialog.component.ts +++ b/overlord/src/app/shared/image-dialog/image-dialog.component.ts @@ -5,6 +5,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; selector: 'app-image-dialog', templateUrl: './image-dialog.component.html', styleUrls: ['./image-dialog.component.css'], + standalone: true, }) export class ImageDialogComponent { constructor( diff --git a/overlord/src/app/shared/local-time.pipe.ts b/overlord/src/app/shared/local-time.pipe.ts index c6109e6f..61108a5e 100644 --- a/overlord/src/app/shared/local-time.pipe.ts +++ b/overlord/src/app/shared/local-time.pipe.ts @@ -3,6 +3,7 @@ import moment from 'moment'; @Pipe({ name: 'localTime', + standalone: true, }) export class LocalTimePipe implements PipeTransform { transform(value: string): string { diff --git a/overlord/src/app/shared/shared.module.spec.ts b/overlord/src/app/shared/shared.module.spec.ts deleted file mode 100644 index 3ecb6260..00000000 --- a/overlord/src/app/shared/shared.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SharedModule } from './shared.module'; - -describe('SharedModule', () => { - let sharedModule: SharedModule; - - beforeEach(() => { - sharedModule = new SharedModule(); - }); - - it('should create an instance', () => { - expect(sharedModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/shared/shared.module.ts b/overlord/src/app/shared/shared.module.ts deleted file mode 100644 index 645ef3d9..00000000 --- a/overlord/src/app/shared/shared.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; - -import { AccountingPipe } from './accounting.pipe'; -import { ClearPipe } from './clear.pipe'; -import { ConfirmDialogComponent } from './confirm-dialog/confirm-dialog.component'; -import { ImageDialogComponent } from './image-dialog/image-dialog.component'; -import { LocalTimePipe } from './local-time.pipe'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, MatDialogModule], - declarations: [ConfirmDialogComponent, ImageDialogComponent, AccountingPipe, ClearPipe, LocalTimePipe], - exports: [AccountingPipe, ClearPipe, LocalTimePipe], -}) -export class SharedModule {} diff --git a/overlord/src/app/stock-movement/stock-movement-routing.module.spec.ts b/overlord/src/app/stock-movement/stock-movement-routing.module.spec.ts deleted file mode 100644 index e60bea60..00000000 --- a/overlord/src/app/stock-movement/stock-movement-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { StockMovementRoutingModule } from './stock-movement-routing.module'; - -describe('StockMovementRoutingModule', () => { - let stockMovementRoutingModule: StockMovementRoutingModule; - - beforeEach(() => { - stockMovementRoutingModule = new StockMovementRoutingModule(); - }); - - it('should create an instance', () => { - expect(stockMovementRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/stock-movement/stock-movement.component.spec.ts b/overlord/src/app/stock-movement/stock-movement.component.spec.ts index 15f9cd73..ebd7cff4 100644 --- a/overlord/src/app/stock-movement/stock-movement.component.spec.ts +++ b/overlord/src/app/stock-movement/stock-movement.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { StockMovementComponent } from './stock-movement.component'; @@ -8,14 +6,11 @@ describe('StockMovementComponent', () => { let component: StockMovementComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [StockMovementComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [StockMovementComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(StockMovementComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/stock-movement/stock-movement.component.ts b/overlord/src/app/stock-movement/stock-movement.component.ts index 51cfd769..8afa7c5d 100644 --- a/overlord/src/app/stock-movement/stock-movement.component.ts +++ b/overlord/src/app/stock-movement/stock-movement.component.ts @@ -1,8 +1,26 @@ +import { DecimalPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import moment from 'moment'; import { StockMovement } from './stock-movement'; @@ -12,6 +30,37 @@ import { StockMovementDataSource } from './stock-movement-datasource'; selector: 'app-stock-movement', templateUrl: './stock-movement.component.html', styleUrls: ['./stock-movement.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + DecimalPipe, + ], }) export class StockMovementComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/stock-movement/stock-movement.module.spec.ts b/overlord/src/app/stock-movement/stock-movement.module.spec.ts deleted file mode 100644 index 636af786..00000000 --- a/overlord/src/app/stock-movement/stock-movement.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { StockMovementModule } from './stock-movement.module'; - -describe('StockMovementModule', () => { - let stockMovementModule: StockMovementModule; - - beforeEach(() => { - stockMovementModule = new StockMovementModule(); - }); - - it('should create an instance', () => { - expect(stockMovementModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/stock-movement/stock-movement.module.ts b/overlord/src/app/stock-movement/stock-movement.module.ts deleted file mode 100644 index 1757a4a5..00000000 --- a/overlord/src/app/stock-movement/stock-movement.module.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { StockMovementRoutingModule } from './stock-movement-routing.module'; -import { StockMovementComponent } from './stock-movement.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - StockMovementRoutingModule, - ], - declarations: [StockMovementComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class StockMovementModule {} diff --git a/overlord/src/app/stock-movement/stock-movement-routing.module.ts b/overlord/src/app/stock-movement/stock-movement.routes.ts similarity index 56% rename from overlord/src/app/stock-movement/stock-movement-routing.module.ts rename to overlord/src/app/stock-movement/stock-movement.routes.ts index 4eb43e7c..6b25011c 100644 --- a/overlord/src/app/stock-movement/stock-movement-routing.module.ts +++ b/overlord/src/app/stock-movement/stock-movement.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { StockMovementComponent } from './stock-movement.component'; import { stockMovementResolver } from './stock-movement.resolver'; -const stockMovementRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: StockMovementComponent, @@ -21,9 +19,3 @@ const stockMovementRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(stockMovementRoutes)], - exports: [RouterModule], -}) -export class StockMovementRoutingModule {} diff --git a/overlord/src/app/trial-balance/trial-balance-routing.module.spec.ts b/overlord/src/app/trial-balance/trial-balance-routing.module.spec.ts deleted file mode 100644 index 450e2203..00000000 --- a/overlord/src/app/trial-balance/trial-balance-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TrialBalanceRoutingModule } from './trial-balance-routing.module'; - -describe('TrialBalanceRoutingModule', () => { - let trialBalanceRoutingModule: TrialBalanceRoutingModule; - - beforeEach(() => { - trialBalanceRoutingModule = new TrialBalanceRoutingModule(); - }); - - it('should create an instance', () => { - expect(trialBalanceRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/trial-balance/trial-balance.component.spec.ts b/overlord/src/app/trial-balance/trial-balance.component.spec.ts index ee255890..22a24d58 100644 --- a/overlord/src/app/trial-balance/trial-balance.component.spec.ts +++ b/overlord/src/app/trial-balance/trial-balance.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { TrialBalanceComponent } from './trial-balance.component'; @@ -8,14 +6,11 @@ describe('TrialBalanceComponent', () => { let component: TrialBalanceComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [TrialBalanceComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TrialBalanceComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(TrialBalanceComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/trial-balance/trial-balance.component.ts b/overlord/src/app/trial-balance/trial-balance.component.ts index f362f382..e763de05 100644 --- a/overlord/src/app/trial-balance/trial-balance.component.ts +++ b/overlord/src/app/trial-balance/trial-balance.component.ts @@ -1,10 +1,30 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; +import { AccountingPipe } from '../shared/accounting.pipe'; + import { TrialBalance } from './trial-balance'; import { TrialBalanceDataSource } from './trial-balance-datasource'; @@ -12,6 +32,37 @@ import { TrialBalanceDataSource } from './trial-balance-datasource'; selector: 'app-trial-balance', templateUrl: './trial-balance.component.html', styleUrls: ['./trial-balance.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + CurrencyPipe, + AccountingPipe, + ], }) export class TrialBalanceComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; diff --git a/overlord/src/app/trial-balance/trial-balance.module.spec.ts b/overlord/src/app/trial-balance/trial-balance.module.spec.ts deleted file mode 100644 index 010697b8..00000000 --- a/overlord/src/app/trial-balance/trial-balance.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TrialBalanceModule } from './trial-balance.module'; - -describe('TrialBalanceModule', () => { - let trialBalanceModule: TrialBalanceModule; - - beforeEach(() => { - trialBalanceModule = new TrialBalanceModule(); - }); - - it('should create an instance', () => { - expect(trialBalanceModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/trial-balance/trial-balance.module.ts b/overlord/src/app/trial-balance/trial-balance.module.ts deleted file mode 100644 index 1c28433f..00000000 --- a/overlord/src/app/trial-balance/trial-balance.module.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { TrialBalanceRoutingModule } from './trial-balance-routing.module'; -import { TrialBalanceComponent } from './trial-balance.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - TrialBalanceRoutingModule, - ], - declarations: [TrialBalanceComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class TrialBalanceModule {} diff --git a/overlord/src/app/trial-balance/trial-balance-routing.module.ts b/overlord/src/app/trial-balance/trial-balance.routes.ts similarity index 66% rename from overlord/src/app/trial-balance/trial-balance-routing.module.ts rename to overlord/src/app/trial-balance/trial-balance.routes.ts index cdd3470d..0a979750 100644 --- a/overlord/src/app/trial-balance/trial-balance-routing.module.ts +++ b/overlord/src/app/trial-balance/trial-balance.routes.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; import { TrialBalanceComponent } from './trial-balance.component'; import { trialBalanceResolver } from './trial-balance.resolver'; -const trialBalanceRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: TrialBalanceComponent, @@ -33,9 +31,3 @@ const trialBalanceRoutes: Routes = [ runGuardsAndResolvers: 'always', }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(trialBalanceRoutes)], - exports: [RouterModule], -}) -export class TrialBalanceRoutingModule {} diff --git a/overlord/src/app/user/user-detail/user-detail.component.spec.ts b/overlord/src/app/user/user-detail/user-detail.component.spec.ts index 6f918161..69560bd0 100644 --- a/overlord/src/app/user/user-detail/user-detail.component.spec.ts +++ b/overlord/src/app/user/user-detail/user-detail.component.spec.ts @@ -1,6 +1,4 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { UserDetailComponent } from './user-detail.component'; @@ -8,14 +6,11 @@ describe('UserDetailComponent', () => { let component: UserDetailComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ReactiveFormsModule, RouterTestingModule], - declarations: [UserDetailComponent], + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserDetailComponent], }).compileComponents(); - })); - beforeEach(() => { fixture = TestBed.createComponent(UserDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/overlord/src/app/user/user-detail/user-detail.component.ts b/overlord/src/app/user/user-detail/user-detail.component.ts index abac3bc2..06898825 100644 --- a/overlord/src/app/user/user-detail/user-detail.component.ts +++ b/overlord/src/app/user/user-detail/user-detail.component.ts @@ -1,6 +1,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -12,6 +19,23 @@ import { UserService } from '../user.service'; selector: 'app-user-detail', templateUrl: './user-detail.component.html', styleUrls: ['./user-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatIcon, + MatSuffix, + MatCheckbox, + MatDivider, + MatCardActions, + MatButton, + ], }) export class UserDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -78,38 +102,38 @@ export class UserDetailComponent implements OnInit, AfterViewInit { save() { if (this.route.snapshot.paramMap.get('id') === 'me') { - this.ser.updateMe(this.getItem()).subscribe( - () => { + this.ser.updateMe(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } else { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/users'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/users'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } confirmDelete(): void { diff --git a/overlord/src/app/user/user-list/user-list.component.ts b/overlord/src/app/user/user-list/user-list.component.ts index 68e1cb4b..b25a9992 100644 --- a/overlord/src/app/user/user-list/user-list.component.ts +++ b/overlord/src/app/user/user-list/user-list.component.ts @@ -1,9 +1,25 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { ActivatedRoute } from '@angular/router'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { User } from '../../core/user'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { UserListDataSource } from './user-list-datasource'; @@ -11,6 +27,31 @@ import { UserListDataSource } from './user-list-datasource'; selector: 'app-user-list', templateUrl: './user-list.component.html', styleUrls: ['./user-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + LocalTimePipe, + ], }) export class UserListComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator = undefined; diff --git a/overlord/src/app/user/user-routing.module.spec.ts b/overlord/src/app/user/user-routing.module.spec.ts deleted file mode 100644 index 7c55c662..00000000 --- a/overlord/src/app/user/user-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UserRoutingModule } from './user-routing.module'; - -describe('UserRoutingModule', () => { - let userRoutingModule: UserRoutingModule; - - beforeEach(() => { - userRoutingModule = new UserRoutingModule(); - }); - - it('should create an instance', () => { - expect(userRoutingModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/user/user.module.spec.ts b/overlord/src/app/user/user.module.spec.ts deleted file mode 100644 index 5fd5f9ff..00000000 --- a/overlord/src/app/user/user.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UserModule } from './user.module'; - -describe('UserModule', () => { - let userModule: UserModule; - - beforeEach(() => { - userModule = new UserModule(); - }); - - it('should create an instance', () => { - expect(userModule).toBeTruthy(); - }); -}); diff --git a/overlord/src/app/user/user.module.ts b/overlord/src/app/user/user.module.ts deleted file mode 100644 index 61f5fca9..00000000 --- a/overlord/src/app/user/user.module.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { UserDetailComponent } from './user-detail/user-detail.component'; -import { UserListComponent } from './user-list/user-list.component'; -import { UserRoutingModule } from './user-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - UserRoutingModule, - ], - declarations: [UserListComponent, UserDetailComponent], -}) -export class UserModule {} diff --git a/overlord/src/app/user/user-routing.module.ts b/overlord/src/app/user/user.routes.ts similarity index 72% rename from overlord/src/app/user/user-routing.module.ts rename to overlord/src/app/user/user.routes.ts index 83b50ee9..65cfbb4f 100644 --- a/overlord/src/app/user/user-routing.module.ts +++ b/overlord/src/app/user/user.routes.ts @@ -1,6 +1,4 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { authGuard } from '../auth/auth-guard.service'; @@ -9,7 +7,7 @@ import { UserListComponent } from './user-list/user-list.component'; import { userListResolver } from './user-list.resolver'; import { userResolver } from './user.resolver'; -const userRoutes: Routes = [ +export const routes: Routes = [ { path: '', component: UserListComponent, @@ -41,9 +39,3 @@ const userRoutes: Routes = [ }, }, ]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(userRoutes)], - exports: [RouterModule], -}) -export class UserRoutingModule {} diff --git a/overlord/src/environments/environment.prod.ts b/overlord/src/environments/environment.prod.ts deleted file mode 100644 index 4c561b75..00000000 --- a/overlord/src/environments/environment.prod.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const environment = { - production: true, - // eslint-disable-next-line @typescript-eslint/naming-convention - ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry - version: '12.1.1', - title: 'HnG / TGB', -}; diff --git a/overlord/src/environments/environment.ts b/overlord/src/environments/environment.ts deleted file mode 100644 index a325d115..00000000 --- a/overlord/src/environments/environment.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, - // eslint-disable-next-line @typescript-eslint/naming-convention - ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry - version: '12.1.1', - title: 'HnG / TGB', -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/overlord/src/main.ts b/overlord/src/main.ts index d9a2e7e4..6278520e 100644 --- a/overlord/src/main.ts +++ b/overlord/src/main.ts @@ -1,13 +1,9 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { bootstrapApplication } from '@angular/platform-browser'; -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; +import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic() - .bootstrapModule(AppModule) +bootstrapApplication(AppComponent, appConfig) .catch((err) => console.error(err)); + + \ No newline at end of file diff --git a/overlord/src/test.ts b/overlord/src/test.ts deleted file mode 100644 index 79ce8c50..00000000 --- a/overlord/src/test.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/testing'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting, -} from '@angular/platform-browser-dynamic/testing'; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { - teardown: { destroyAfterEach: false } -}); diff --git a/version_bump.sh b/version_bump.sh index 07869b3b..77951449 100755 --- a/version_bump.sh +++ b/version_bump.sh @@ -11,10 +11,8 @@ then git add brewman/brewman/__version__.py sed --in-place --regexp-extended 's/version = "([0-9]*.[0-9].[0-9])"/version = "'"$1"'"/g' brewman/pyproject.toml git add brewman/pyproject.toml - sed --in-place --regexp-extended 's/version: '\''([0-9]*.[0-9].[0-9])'\''/version: '\'"$1"\''/g' overlord/src/environments/environment.prod.ts - git add overlord/src/environments/environment.prod.ts - sed --in-place --regexp-extended 's/version: '\''([0-9]*.[0-9].[0-9])'\''/version: '\'"$1"\''/g' overlord/src/environments/environment.ts - git add overlord/src/environments/environment.ts + sed --in-place --regexp-extended 's/version: '\''([0-9]*.[0-9].[0-9])'\''/version: '\'"$1"\''/g' overlord/src/app/app.environment.ts + git add overlord/src/app/app.environment.ts sed --in-place --regexp-extended 's/"version": "([0-9]*.[0-9].[0-9])"/"version": "'"$1"'"/g' overlord/package.json git add overlord/package.json git commit -m "Version Bump v$1"