From 024e8365774413735fee0cb4022603429223d774 Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Thu, 14 Mar 2024 11:56:33 +0530 Subject: [PATCH 01/80] Commit for Develop --- .github/dependabot.yml | 11 + .github/workflows/build-on-pull-request.yml | 36 + .github/workflows/codeql.yml | 84 ++ .github/workflows/package-prod.yml | 51 + .github/workflows/package.yml | 50 + angular.json | 11 +- package-lock.json | 1310 +++++++++++++++-- package.json | 4 + .../app-footer/app-footer.component.css | 54 + .../app-footer/app-footer.component.html | 58 + .../app-footer/app-footer.component.spec.ts | 45 + .../app-footer/app-footer.component.ts | 61 + .../app-header/app-header.component.css | 202 +++ .../app-header/app-header.component.html | 153 ++ .../app-header/app-header.component.spec.ts | 183 +++ .../app-header/app-header.component.ts | 394 +++++ .../batch-adjustment.component.css | 53 + .../batch-adjustment.component.html | 228 +++ .../batch-adjustment.component.spec.ts | 45 + .../batch-adjustment.component.ts | 110 ++ .../batch-search/batch-search.component.css | 50 + .../batch-search/batch-search.component.html | 226 +++ .../batch-search.component.spec.ts | 45 + .../batch-search/batch-search.component.ts | 110 ++ .../beneficiary-details.component.css | 15 + .../beneficiary-details.component.html | 104 ++ .../beneficiary-details.component.spec.ts | 45 + .../beneficiary-details.component.ts | 99 ++ .../common-dialog/common-dialog.component.ts | 9 +- .../indent-item-list.component.css | 39 + .../indent-item-list.component.html | 149 ++ .../indent-item-list.component.spec.ts | 45 + .../indent-item-list.component.ts | 104 ++ .../item-dispense/item-dispense.component.css | 44 + .../item-dispense.component.html | 174 +++ .../item-dispense.component.spec.ts | 45 + .../item-dispense/item-dispense.component.ts | 102 ++ .../item-search/item-search.component.css | 44 + .../item-search/item-search.component.html | 140 ++ .../item-search/item-search.component.spec.ts | 45 + .../item-search/item-search.component.ts | 92 ++ .../rx-batch-view/rx-batch-view.component.css | 75 + .../rx-batch-view.component.html | 190 +++ .../rx-batch-view.component.spec.ts | 45 + .../rx-batch-view/rx-batch-view.component.ts | 182 +++ .../components/search/search.component.css | 57 + .../components/search/search.component.html | 268 ++++ .../search/search.component.spec.ts | 45 + .../components/search/search.component.ts | 261 ++++ .../core/components/set-language.component.ts | 48 + ...w-commit-and-version-details.component.css | 24 + ...-commit-and-version-details.component.html | 33 + ...mmit-and-version-details.component.spec.ts | 45 + ...ow-commit-and-version-details.component.ts | 57 + .../components/spinner/spinner.component.css | 35 + .../components/spinner/spinner.component.html | 5 + .../spinner/spinner.component.spec.ts | 45 + .../components/spinner/spinner.component.ts | 36 + .../textarea-dialog.component.css | 3 + .../textarea-dialog.component.html | 16 + .../textarea-dialog.component.spec.ts | 45 + .../textarea-dialog.component.ts | 60 + .../textarea-dialog.service.ts | 37 + .../transfer-search.component.css | 48 + .../transfer-search.component.html | 174 +++ .../transfer-search.component.spec.ts | 45 + .../transfer-search.component.ts | 122 ++ src/app/app-modules/core/core.module.ts | 75 +- .../directives/batch-adjustment.directive.ts | 71 +- .../core/directives/batch-search.directive.ts | 71 +- .../directives/item-dispense.directive.ts | 31 +- .../core/directives/item-search.directive.ts | 39 +- .../directives/item-transfer.directive.ts | 71 +- .../core/services/auth-guard.service.ts | 13 +- .../services/beneficiary-details.service.ts | 4 +- .../core/services/http-interceptor.service.ts | 99 +- .../core/services/rx-batchview.service.ts | 27 +- .../dashboard/dashboard.component.css | 3 + .../dashboard/dashboard.component.html | 5 + .../dashboard/dashboard.component.spec.ts | 45 + .../dashboard/dashboard.component.ts | 31 + .../dynamic-print/dynamic-print.component.css | 54 + .../dynamic-print.component.html | 98 ++ .../dynamic-print.component.spec.ts | 45 + .../dynamic-print/dynamic-print.component.ts | 91 ++ .../inventory/inventory-routing.module.ts | 236 +++ .../app-modules/inventory/inventory.module.ts | 251 ++++ .../manual-medicine-dispense.component.css | 40 + .../manual-medicine-dispense.component.html | 264 ++++ ...manual-medicine-dispense.component.spec.ts | 45 + .../manual-medicine-dispense.component.ts | 417 ++++++ .../select-batch/select-batch.component.css | 63 + .../select-batch/select-batch.component.html | 267 ++++ .../select-batch.component.spec.ts | 45 + .../select-batch/select-batch.component.ts | 292 ++++ .../medicine-dispense.component.css | 52 + .../medicine-dispense.component.html | 216 +++ .../medicine-dispense.component.spec.ts | 45 + .../medicine-dispense.component.ts | 312 ++++ .../show-batch-item.component.css | 43 + .../show-batch-item.component.html | 133 ++ .../show-batch-item.component.spec.ts | 45 + .../show-batch-item.component.ts | 130 ++ .../system-medicine-dispense.component.css | 31 + .../system-medicine-dispense.component.html | 165 +++ ...system-medicine-dispense.component.spec.ts | 45 + .../system-medicine-dispense.component.ts | 427 ++++++ ...ew-medicine-dispense-details.component.css | 43 + ...w-medicine-dispense-details.component.html | 191 +++ ...edicine-dispense-details.component.spec.ts | 45 + ...iew-medicine-dispense-details.component.ts | 234 +++ .../view-medicine-dispense.component.css | 56 + .../view-medicine-dispense.component.html | 244 +++ .../view-medicine-dispense.component.spec.ts | 45 + .../view-medicine-dispense.component.ts | 216 +++ .../benificiary-details.component.css | 42 + .../benificiary-details.component.html | 104 ++ .../benificiary-details.component.spec.ts | 45 + .../benificiary-details.component.ts | 75 + ...h-details-for-patient-return.component.css | 88 ++ ...-details-for-patient-return.component.html | 176 +++ ...tails-for-patient-return.component.spec.ts | 47 + ...ch-details-for-patient-return.component.ts | 272 ++++ ...patient-return-batch-details.component.css | 43 + ...atient-return-batch-details.component.html | 215 +++ ...ent-return-batch-details.component.spec.ts | 45 + .../patient-return-batch-details.component.ts | 308 ++++ ...tient-return-previous-record.component.css | 40 + ...ient-return-previous-record.component.html | 231 +++ ...t-return-previous-record.component.spec.ts | 45 + ...atient-return-previous-record.component.ts | 159 ++ .../patient-return.component.css | 88 ++ .../patient-return.component.html | 122 ++ .../patient-return.component.spec.ts | 45 + .../patient-return.component.ts | 222 +++ .../e-aushadha/e-aushadha.component.css | 36 + .../e-aushadha/e-aushadha.component.html | 90 ++ .../e-aushadha/e-aushadha.component.spec.ts | 25 + .../e-aushadha/e-aushadha.component.ts | 108 ++ .../physical-stock-entry.component.css | 52 + .../physical-stock-entry.component.html | 300 ++++ .../physical-stock-entry.component.spec.ts | 45 + .../physical-stock-entry.component.ts | 330 +++++ .../view-physical-stock-details.component.css | 39 + ...view-physical-stock-details.component.html | 196 +++ ...w-physical-stock-details.component.spec.ts | 45 + .../view-physical-stock-details.component.ts | 138 ++ .../view-physical-stock.component.css | 26 + .../view-physical-stock.component.html | 249 ++++ .../view-physical-stock.component.spec.ts | 45 + .../view-physical-stock.component.ts | 321 ++++ ...eneficiary-drug-issue-report.component.css | 5 + ...neficiary-drug-issue-report.component.html | 62 + ...iciary-drug-issue-report.component.spec.ts | 45 + ...beneficiary-drug-issue-report.component.ts | 304 ++++ .../consumption-report.component.css | 1 + .../consumption-report.component.html | 81 + .../consumption-report.component.spec.ts | 45 + .../consumption-report.component.ts | 324 ++++ .../daily-stock-details-report.component.css | 1 + .../daily-stock-details-report.component.html | 82 ++ ...ily-stock-details-report.component.spec.ts | 45 + .../daily-stock-details-report.component.ts | 324 ++++ .../daily-stock-summary-report.component.css | 1 + .../daily-stock-summary-report.component.html | 82 ++ ...ily-stock-summary-report.component.spec.ts | 45 + .../daily-stock-summary-report.component.ts | 324 ++++ .../expiry-report/expiry-report.component.css | 1 + .../expiry-report.component.html | 69 + .../expiry-report.component.spec.ts | 45 + .../expiry-report/expiry-report.component.ts | 289 ++++ .../inward-stock-report.component.css | 1 + .../inward-stock-report.component.html | 81 + .../inward-stock-report.component.spec.ts | 45 + .../inward-stock-report.component.ts | 319 ++++ .../monthly-report.component.css | 51 + .../monthly-report.component.html | 64 + .../monthly-report.component.spec.ts | 45 + .../monthly-report.component.ts | 319 ++++ .../short-expiry-report.component.css | 1 + .../short-expiry-report.component.html | 44 + .../short-expiry-report.component.spec.ts | 45 + .../short-expiry-report.component.ts | 261 ++++ .../transit-report.component.css | 1 + .../transit-report.component.html | 69 + .../transit-report.component.spec.ts | 45 + .../transit-report.component.ts | 291 ++++ .../yearly-report/yearly-report.component.css | 56 + .../yearly-report.component.html | 57 + .../yearly-report.component.spec.ts | 45 + .../yearly-report/yearly-report.component.ts | 289 ++++ .../service/data-storage.service.spec.ts | 39 + .../shared/service/data-storage.service.ts | 34 + .../shared/service/indent-dispense.service.ts | 42 + .../service/inventory-master.service.spec.ts | 39 + .../service/inventory-master.service.ts | 25 + .../shared/service/inventory.service.spec.ts | 39 + .../shared/service/inventory.service.ts | 381 +++++ .../service/prescribed-drug.service.spec.ts | 39 + .../shared/service/prescribed-drug.service.ts | 69 + .../store-self-consumption.component.css | 58 + .../store-self-consumption.component.html | 268 ++++ .../store-self-consumption.component.spec.ts | 45 + .../store-self-consumption.component.ts | 278 ++++ ...ore-self-consumption-details.component.css | 38 + ...re-self-consumption-details.component.html | 175 +++ ...self-consumption-details.component.spec.ts | 45 + ...tore-self-consumption-details.component.ts | 142 ++ .../view-store-self-consumption.component.css | 36 + ...view-store-self-consumption.component.html | 224 +++ ...w-store-self-consumption.component.spec.ts | 45 + .../view-store-self-consumption.component.ts | 335 +++++ .../store-stock-adjustment.component.css | 79 + .../store-stock-adjustment.component.html | 422 ++++++ .../store-stock-adjustment.component.spec.ts | 45 + .../store-stock-adjustment.component.ts | 438 ++++++ ...iew-stock-adjustment-details.component.css | 34 + ...ew-stock-adjustment-details.component.html | 178 +++ ...stock-adjustment-details.component.spec.ts | 45 + ...view-stock-adjustment-details.component.ts | 153 ++ ...ock-adjustment-draft-details.component.css | 38 + ...ck-adjustment-draft-details.component.html | 178 +++ ...adjustment-draft-details.component.spec.ts | 45 + ...tock-adjustment-draft-details.component.ts | 150 ++ ...store-stock-adjustment-draft.component.css | 36 + ...tore-stock-adjustment-draft.component.html | 217 +++ ...e-stock-adjustment-draft.component.spec.ts | 45 + ...-store-stock-adjustment-draft.component.ts | 286 ++++ .../view-store-stock-adjustment.component.css | 47 + ...view-store-stock-adjustment.component.html | 198 +++ ...w-store-stock-adjustment.component.spec.ts | 45 + .../view-store-stock-adjustment.component.ts | 288 ++++ .../store-stock-transfer.component.css | 56 + .../store-stock-transfer.component.html | 237 +++ .../store-stock-transfer.component.spec.ts | 45 + .../store-stock-transfer.component.ts | 319 ++++ ...store-stock-transfer-details.component.css | 34 + ...tore-stock-transfer-details.component.html | 214 +++ ...e-stock-transfer-details.component.spec.ts | 45 + ...-store-stock-transfer-details.component.ts | 124 ++ .../view-store-stock-transfer.component.css | 88 ++ .../view-store-stock-transfer.component.html | 295 ++++ ...iew-store-stock-transfer.component.spec.ts | 45 + .../view-store-stock-transfer.component.ts | 349 +++++ .../app-modules/inventory/utc-date.pipe.ts | 46 + .../inventory/workarea/workarea.component.css | 13 + .../workarea/workarea.component.html | 1 + .../workarea/workarea.component.spec.ts | 45 + .../inventory/workarea/workarea.component.ts | 44 + .../rx-dashboard/rx-dashboard.component.css | 82 ++ .../rx-dashboard/rx-dashboard.component.html | 83 ++ .../rx-dashboard.component.spec.ts | 45 + .../rx/rx-dashboard/rx-dashboard.component.ts | 223 +++ .../rx-item-dispense.component.css | 78 + .../rx-item-dispense.component.html | 307 ++++ .../rx-item-dispense.component.spec.ts | 45 + .../rx-item-dispense.component.ts | 305 ++++ src/app/app-modules/rx/rx-routing.module.ts | 37 + src/app/app-modules/rx/rx.module.ts | 86 ++ .../service/prescribed-drug.service.spec.ts | 39 + .../shared/service/prescribed-drug.service.ts | 92 ++ .../app-modules/rx/shared/utility/index.ts | 22 + .../shared/utility/prescribed-drug.utility.ts | 87 ++ src/app/app-routing.module.ts | 97 +- src/app/app.component.ts | 11 +- src/app/app.module.ts | 25 +- src/app/custom-route-reuse-strategy.ts | 19 +- .../facility-selection.component.css | 30 + .../facility-selection.component.html | 88 ++ .../facility-selection.component.spec.ts | 25 + .../facility-selection.component.ts | 220 +++ .../facilty-resolve.service.ts | 25 + src/app/facility-selection/facilty.service.ts | 43 + .../load-store-details.component.css | 35 + .../load-store-details.component.html | 5 + .../load-store-details.component.spec.ts | 45 + .../load-store-details.component.ts | 35 + src/app/login/login.component.ts | 2 +- src/app/redir-in/redir-in.component.css | 16 + src/app/redir-in/redir-in.component.html | 5 + src/app/redir-in/redir-in.component.spec.ts | 45 + src/app/redir-in/redir-in.component.ts | 338 +++++ .../reset-password.component.css | 39 + .../reset-password.component.html | 134 ++ .../reset-password.component.spec.ts | 45 + .../reset-password.component.ts | 169 +++ src/app/service/service.component.css | 52 + src/app/service/service.component.html | 29 + src/app/service/service.component.spec.ts | 45 + src/app/service/service.component.ts | 52 + .../set-password/set-password.component.css | 31 + .../set-password/set-password.component.html | 98 ++ .../set-password.component.spec.ts | 45 + .../set-password/set-password.component.ts | 156 ++ .../set-security-questions.component.css | 23 + .../set-security-questions.component.html | 218 +++ .../set-security-questions.component.spec.ts | 45 + .../set-security-questions.component.ts | 333 +++++ src/environments/environment.ts | 20 +- src/styles.css | 38 +- tsconfig.app.json | 2 +- tsconfig.json | 4 +- 302 files changed, 32293 insertions(+), 430 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build-on-pull-request.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 .github/workflows/package-prod.yml create mode 100644 .github/workflows/package.yml create mode 100644 src/app/app-modules/core/components/app-footer/app-footer.component.css create mode 100644 src/app/app-modules/core/components/app-footer/app-footer.component.html create mode 100644 src/app/app-modules/core/components/app-footer/app-footer.component.spec.ts create mode 100644 src/app/app-modules/core/components/app-footer/app-footer.component.ts create mode 100644 src/app/app-modules/core/components/app-header/app-header.component.css create mode 100644 src/app/app-modules/core/components/app-header/app-header.component.html create mode 100644 src/app/app-modules/core/components/app-header/app-header.component.spec.ts create mode 100644 src/app/app-modules/core/components/app-header/app-header.component.ts create mode 100644 src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css create mode 100644 src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html create mode 100644 src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.spec.ts create mode 100644 src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts create mode 100644 src/app/app-modules/core/components/batch-search/batch-search.component.css create mode 100644 src/app/app-modules/core/components/batch-search/batch-search.component.html create mode 100644 src/app/app-modules/core/components/batch-search/batch-search.component.spec.ts create mode 100644 src/app/app-modules/core/components/batch-search/batch-search.component.ts create mode 100644 src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.css create mode 100644 src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.html create mode 100644 src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.spec.ts create mode 100644 src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts create mode 100644 src/app/app-modules/core/components/indent-item-list/indent-item-list.component.css create mode 100644 src/app/app-modules/core/components/indent-item-list/indent-item-list.component.html create mode 100644 src/app/app-modules/core/components/indent-item-list/indent-item-list.component.spec.ts create mode 100644 src/app/app-modules/core/components/indent-item-list/indent-item-list.component.ts create mode 100644 src/app/app-modules/core/components/item-dispense/item-dispense.component.css create mode 100644 src/app/app-modules/core/components/item-dispense/item-dispense.component.html create mode 100644 src/app/app-modules/core/components/item-dispense/item-dispense.component.spec.ts create mode 100644 src/app/app-modules/core/components/item-dispense/item-dispense.component.ts create mode 100644 src/app/app-modules/core/components/item-search/item-search.component.css create mode 100644 src/app/app-modules/core/components/item-search/item-search.component.html create mode 100644 src/app/app-modules/core/components/item-search/item-search.component.spec.ts create mode 100644 src/app/app-modules/core/components/item-search/item-search.component.ts create mode 100644 src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.css create mode 100644 src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html create mode 100644 src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.spec.ts create mode 100644 src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts create mode 100644 src/app/app-modules/core/components/search/search.component.css create mode 100644 src/app/app-modules/core/components/search/search.component.html create mode 100644 src/app/app-modules/core/components/search/search.component.spec.ts create mode 100644 src/app/app-modules/core/components/search/search.component.ts create mode 100644 src/app/app-modules/core/components/set-language.component.ts create mode 100644 src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.css create mode 100644 src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.html create mode 100644 src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.spec.ts create mode 100644 src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.ts create mode 100644 src/app/app-modules/core/components/spinner/spinner.component.css create mode 100644 src/app/app-modules/core/components/spinner/spinner.component.html create mode 100644 src/app/app-modules/core/components/spinner/spinner.component.spec.ts create mode 100644 src/app/app-modules/core/components/spinner/spinner.component.ts create mode 100644 src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.css create mode 100644 src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.html create mode 100644 src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.spec.ts create mode 100644 src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.ts create mode 100644 src/app/app-modules/core/components/textarea-dialog/textarea-dialog.service.ts create mode 100644 src/app/app-modules/core/components/transfer-search/transfer-search.component.css create mode 100644 src/app/app-modules/core/components/transfer-search/transfer-search.component.html create mode 100644 src/app/app-modules/core/components/transfer-search/transfer-search.component.spec.ts create mode 100644 src/app/app-modules/core/components/transfer-search/transfer-search.component.ts create mode 100644 src/app/app-modules/inventory/dashboard/dashboard.component.css create mode 100644 src/app/app-modules/inventory/dashboard/dashboard.component.html create mode 100644 src/app/app-modules/inventory/dashboard/dashboard.component.spec.ts create mode 100644 src/app/app-modules/inventory/dashboard/dashboard.component.ts create mode 100644 src/app/app-modules/inventory/dynamic-print/dynamic-print.component.css create mode 100644 src/app/app-modules/inventory/dynamic-print/dynamic-print.component.html create mode 100644 src/app/app-modules/inventory/dynamic-print/dynamic-print.component.spec.ts create mode 100644 src/app/app-modules/inventory/dynamic-print/dynamic-print.component.ts create mode 100644 src/app/app-modules/inventory/inventory-routing.module.ts create mode 100644 src/app/app-modules/inventory/inventory.module.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.css create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.html create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.spec.ts create mode 100644 src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts create mode 100644 src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.css create mode 100644 src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.html create mode 100644 src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.ts create mode 100644 src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css create mode 100644 src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.html create mode 100644 src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.spec.ts create mode 100644 src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.css create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.html create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.ts create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.css create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.html create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.spec.ts create mode 100644 src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts create mode 100644 src/app/app-modules/inventory/patient-return/patient-return.component.css create mode 100644 src/app/app-modules/inventory/patient-return/patient-return.component.html create mode 100644 src/app/app-modules/inventory/patient-return/patient-return.component.spec.ts create mode 100644 src/app/app-modules/inventory/patient-return/patient-return.component.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.css create mode 100644 src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.html create mode 100644 src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.spec.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.css create mode 100644 src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.html create mode 100644 src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.spec.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.css create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.html create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.css create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.html create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.spec.ts create mode 100644 src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts create mode 100644 src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css create mode 100644 src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.html create mode 100644 src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css create mode 100644 src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html create mode 100644 src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css create mode 100644 src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html create mode 100644 src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css create mode 100644 src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html create mode 100644 src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css create mode 100644 src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html create mode 100644 src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css create mode 100644 src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html create mode 100644 src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css create mode 100644 src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html create mode 100644 src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css create mode 100644 src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html create mode 100644 src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/transit-report/transit-report.component.css create mode 100644 src/app/app-modules/inventory/reports/transit-report/transit-report.component.html create mode 100644 src/app/app-modules/inventory/reports/transit-report/transit-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/transit-report/transit-report.component.ts create mode 100644 src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css create mode 100644 src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html create mode 100644 src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.spec.ts create mode 100644 src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts create mode 100644 src/app/app-modules/inventory/shared/service/data-storage.service.spec.ts create mode 100644 src/app/app-modules/inventory/shared/service/data-storage.service.ts create mode 100644 src/app/app-modules/inventory/shared/service/indent-dispense.service.ts create mode 100644 src/app/app-modules/inventory/shared/service/inventory-master.service.spec.ts create mode 100644 src/app/app-modules/inventory/shared/service/inventory-master.service.ts create mode 100644 src/app/app-modules/inventory/shared/service/inventory.service.spec.ts create mode 100644 src/app/app-modules/inventory/shared/service/inventory.service.ts create mode 100644 src/app/app-modules/inventory/shared/service/prescribed-drug.service.spec.ts create mode 100644 src/app/app-modules/inventory/shared/service/prescribed-drug.service.ts create mode 100644 src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css create mode 100644 src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html create mode 100644 src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.css create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.html create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.ts create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.css create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.html create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.css create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.html create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.css create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css create mode 100644 src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html create mode 100644 src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.css create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.html create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.ts create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.spec.ts create mode 100644 src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts create mode 100644 src/app/app-modules/inventory/utc-date.pipe.ts create mode 100644 src/app/app-modules/inventory/workarea/workarea.component.css create mode 100644 src/app/app-modules/inventory/workarea/workarea.component.html create mode 100644 src/app/app-modules/inventory/workarea/workarea.component.spec.ts create mode 100644 src/app/app-modules/inventory/workarea/workarea.component.ts create mode 100644 src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css create mode 100644 src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html create mode 100644 src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.spec.ts create mode 100644 src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts create mode 100644 src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css create mode 100644 src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html create mode 100644 src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.spec.ts create mode 100644 src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts create mode 100644 src/app/app-modules/rx/rx-routing.module.ts create mode 100644 src/app/app-modules/rx/rx.module.ts create mode 100644 src/app/app-modules/rx/shared/service/prescribed-drug.service.spec.ts create mode 100644 src/app/app-modules/rx/shared/service/prescribed-drug.service.ts create mode 100644 src/app/app-modules/rx/shared/utility/index.ts create mode 100644 src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts create mode 100644 src/app/facility-selection/facility-selection.component.css create mode 100644 src/app/facility-selection/facility-selection.component.html create mode 100644 src/app/facility-selection/facility-selection.component.spec.ts create mode 100644 src/app/facility-selection/facility-selection.component.ts create mode 100644 src/app/facility-selection/facilty-resolve.service.ts create mode 100644 src/app/facility-selection/facilty.service.ts create mode 100644 src/app/load-store-details/load-store-details.component.css create mode 100644 src/app/load-store-details/load-store-details.component.html create mode 100644 src/app/load-store-details/load-store-details.component.spec.ts create mode 100644 src/app/load-store-details/load-store-details.component.ts create mode 100644 src/app/redir-in/redir-in.component.css create mode 100644 src/app/redir-in/redir-in.component.html create mode 100644 src/app/redir-in/redir-in.component.spec.ts create mode 100644 src/app/redir-in/redir-in.component.ts create mode 100644 src/app/reset-password/reset-password.component.css create mode 100644 src/app/reset-password/reset-password.component.html create mode 100644 src/app/reset-password/reset-password.component.spec.ts create mode 100644 src/app/reset-password/reset-password.component.ts create mode 100644 src/app/service/service.component.css create mode 100644 src/app/service/service.component.html create mode 100644 src/app/service/service.component.spec.ts create mode 100644 src/app/service/service.component.ts create mode 100644 src/app/set-password/set-password.component.css create mode 100644 src/app/set-password/set-password.component.html create mode 100644 src/app/set-password/set-password.component.spec.ts create mode 100644 src/app/set-password/set-password.component.ts create mode 100644 src/app/set-security-questions/set-security-questions.component.css create mode 100644 src/app/set-security-questions/set-security-questions.component.html create mode 100644 src/app/set-security-questions/set-security-questions.component.spec.ts create mode 100644 src/app/set-security-questions/set-security-questions.component.ts diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..3a3cce5 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml new file mode 100644 index 0000000..a42d53a --- /dev/null +++ b/.github/workflows/build-on-pull-request.yml @@ -0,0 +1,36 @@ +name: Build On Pull Request + +on: + pull_request: + branches: [ "master", "develop" ] + +jobs: + Build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + + - name: Setup JDK 17 + uses: actions/setup-java@v2 + with: + java-version: 17 + distribution: 'adopt' + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: 18 + + - name: Build with NPM and Maven + run: | + npm config set legacy-peer-deps true + npm install -g @angular/cli + npm install typescript@5.1.3 --save-dev + npm install ng2-smart-table@1.2.1 + npm install node-sass + npm install --force + npm run build diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..65a311e --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,84 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: '34 16 * * 1' + +jobs: + analyze: + name: Analyze + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners + # Consider using larger runners for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + # required for all workflows + security-events: write + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + language: [ 'javascript-typescript' ] + # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] + # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/package-prod.yml b/.github/workflows/package-prod.yml new file mode 100644 index 0000000..1cf24ab --- /dev/null +++ b/.github/workflows/package-prod.yml @@ -0,0 +1,51 @@ +name: Package Prod +on: + push: + branches: [ "master"] + +jobs: + Package: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + steps: + + - name: Checkout code + uses: actions/checkout@v3 + + + - name: Set up Java + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'adopt' + + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: 18 + + + - name: Build with NPM and Create WAR file + run: | + npm config set legacy-peer-deps true + npm install -g @angular/cli + npm install -g grunt-cli + npm install typescript@5.1.3 --save-dev + npm install ng2-smart-table@1.2.1 + npm install node-sass --force + npm install --force + ng build --configuration production + + + - name: Upload WAR file as artifact + uses: actions/upload-artifact@v2 + with: + name: HWC-Inventory-UI + path: dist/hwc-inventory-ui-next/hwc-inventory-ui-next.war diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml new file mode 100644 index 0000000..50e099f --- /dev/null +++ b/.github/workflows/package.yml @@ -0,0 +1,50 @@ +name: Package +on: + push: + branches: [ "develop" ] + +jobs: + Package: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + steps: + + - name: Checkout code + uses: actions/checkout@v3 + + + - name: Set up Java + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'adopt' + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: 18 + + - name: Build with NPM and Maven + run: | + npm config set legacy-peer-deps true + npm install -g @angular/cli + npm install typescript@5.1.3 --save-dev + npm install ng2-smart-table@1.2.1 + npm install node-sass + npm install --force + npm run build + + - name: Create WAR file + run: jar -cvf hwc-inventory-ui-next.war -C dist . + + - name: Upload WAR file as artifact + uses: actions/upload-artifact@v2 + with: + name: HWC-Inventory-UI + path: hwc-inventory-ui-next.war diff --git a/angular.json b/angular.json index df9e6f7..368921e 100644 --- a/angular.json +++ b/angular.json @@ -38,16 +38,17 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "maximumWarning": "5mb", + "maximumError": "6mb" }, { "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "maximumWarning": "1mb", + "maximumError": "2mb" } ], - "outputHashing": "all" + "outputHashing": "all", + "optimization": true }, "development": { "buildOptimizer": false, diff --git a/package-lock.json b/package-lock.json index f19673a..40e43ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,8 +19,11 @@ "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", "angular": "^1.8.3", + "angular-moment": "^1.3.0", "bootstrap": "^5.3.3", "crypto-js": "^4.2.0", + "exceljs": "^4.4.0", + "file-saver": "^2.0.5", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -35,6 +38,7 @@ "@angular/cli": "^16.2.10", "@angular/compiler-cli": "^16.2.0", "@types/crypto-js": "^4.2.2", + "@types/file-saver": "^2.0.7", "@types/jasmine": "~4.3.0", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", @@ -3170,6 +3174,43 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/format/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@fast-csv/parse/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -5017,6 +5058,12 @@ "@types/send": "*" } }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -5865,6 +5912,17 @@ "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==", "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." }, + "node_modules/angular-moment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz", + "integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==", + "dependencies": { + "moment": ">=2.8.0 <3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -5941,6 +5999,70 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -5990,8 +6112,7 @@ "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -6166,14 +6287,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -6204,6 +6323,14 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -6213,6 +6340,18 @@ "node": "*" } }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -6226,13 +6365,17 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -6310,7 +6453,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6370,7 +6512,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -6390,12 +6531,36 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -6558,6 +6723,17 @@ } ] }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6831,6 +7007,20 @@ "node": ">=4.0.0" } }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6894,8 +7084,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect": { "version": "3.7.0", @@ -7048,8 +7237,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -7108,6 +7296,29 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/critters": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", @@ -7346,6 +7557,11 @@ "node": ">=4.0" } }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -7626,6 +7842,41 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7710,7 +7961,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -8460,6 +8710,33 @@ "node": ">=0.8.x" } }, + "node_modules/exceljs": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/exceljs/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "engines": { + "node": ">=14.14" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -8641,6 +8918,18 @@ "node": ">=4" } }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8729,6 +9018,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -8970,8 +9264,7 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { "version": "8.1.0", @@ -9017,8 +9310,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -9034,6 +9326,31 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -9136,7 +9453,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9213,8 +9529,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -9626,7 +9941,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -9700,6 +10014,11 @@ "node": ">=0.10.0" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", @@ -9759,7 +10078,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9768,8 +10086,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "4.1.1", @@ -10087,8 +10404,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isbinaryfile": { "version": "4.0.10", @@ -10524,6 +10840,44 @@ "node >= 0.2.0" ] }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/karma": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", @@ -10719,6 +11073,44 @@ "shell-quote": "^1.8.1" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/less": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", @@ -10842,6 +11234,14 @@ } } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", @@ -11039,7 +11439,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2": { + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, + "node_modules/listr2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", @@ -11183,12 +11588,77 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -11946,7 +12416,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11958,7 +12427,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12190,7 +12658,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -12198,6 +12665,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -12428,7 +12903,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13037,7 +13511,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -13301,8 +13774,7 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/parent-module": { "version": "1.0.1", @@ -13421,7 +13893,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14038,8 +14509,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -14295,7 +14765,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14305,6 +14774,33 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -14608,7 +15104,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -14700,7 +15195,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -14961,6 +15455,11 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -15485,7 +15984,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15685,7 +16183,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -15968,6 +16465,14 @@ "node": ">=8" } }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -16294,6 +16799,50 @@ "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -16346,8 +16895,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -16362,7 +16910,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -17023,8 +17570,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "7.5.9", @@ -17056,8 +17602,7 @@ "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/y18n": { "version": "5.0.8", @@ -17122,6 +17667,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/zone.js": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", @@ -19205,6 +19783,47 @@ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + } + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + } + } + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -20747,6 +21366,12 @@ "@types/send": "*" } }, + "@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true + }, "@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -21410,6 +22035,14 @@ "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz", "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==" }, + "angular-moment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz", + "integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==", + "requires": { + "moment": ">=2.8.0 <3.0.0" + } + }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -21462,6 +22095,66 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -21505,8 +22198,7 @@ "async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "asynckit": { "version": "0.4.0", @@ -21640,14 +22332,12 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "base64id": { "version": "2.0.0", @@ -21661,12 +22351,26 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, + "big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==" + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -21677,13 +22381,17 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -21747,7 +22455,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -21784,18 +22491,32 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -21907,6 +22628,14 @@ "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -22105,6 +22834,17 @@ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true }, + "compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -22161,8 +22901,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "connect": { "version": "3.7.0", @@ -22284,8 +23023,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cors": { "version": "2.8.5", @@ -22326,6 +23064,20 @@ } } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, "critters": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", @@ -22506,6 +23258,11 @@ "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -22715,6 +23472,43 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -22786,7 +23580,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -23307,6 +24100,29 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, + "exceljs": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "dependencies": { + "tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==" + } + } + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -23462,6 +24278,15 @@ "tmp": "^0.0.33" } }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -23535,6 +24360,11 @@ "flat-cache": "^3.0.4" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -23713,8 +24543,7 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { "version": "8.1.0", @@ -23753,8 +24582,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.3", @@ -23763,6 +24591,27 @@ "dev": true, "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -23832,7 +24681,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -23888,8 +24736,7 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graphemer": { "version": "1.4.0", @@ -24206,8 +25053,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.3.1", @@ -24251,6 +25097,11 @@ "dev": true, "optional": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", @@ -24297,7 +25148,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -24306,8 +25156,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "4.1.1", @@ -24539,8 +25388,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isbinaryfile": { "version": "4.0.10", @@ -24871,6 +25719,46 @@ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "karma": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", @@ -25031,6 +25919,43 @@ "shell-quote": "^1.8.1" } }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "less": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", @@ -25111,6 +26036,14 @@ "webpack-sources": "^3.0.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lilconfig": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", @@ -25232,6 +26165,11 @@ } } }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, "listr2": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", @@ -25336,12 +26274,77 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -25886,7 +26889,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -25894,8 +26896,7 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { "version": "5.0.0", @@ -26094,11 +27095,15 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "requires": { "minimist": "^1.2.6" } }, + "moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, "mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -26269,8 +27274,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -26734,7 +27738,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -26927,8 +27930,7 @@ "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "parent-module": { "version": "1.0.1", @@ -27020,8 +28022,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -27406,8 +28407,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -27601,13 +28601,38 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -27835,8 +28860,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -27880,7 +28904,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, "requires": { "xmlchars": "^2.2.0" } @@ -28100,6 +29123,11 @@ "has-property-descriptors": "^1.0.1" } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -28502,7 +29530,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -28677,7 +29704,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -28849,6 +29875,11 @@ "punycode": "^2.1.1" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -29081,6 +30112,52 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, + "unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -29113,8 +30190,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", @@ -29125,8 +30201,7 @@ "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -29568,8 +30643,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { "version": "7.5.9", @@ -29587,8 +30661,7 @@ "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "y18n": { "version": "5.0.8", @@ -29635,6 +30708,35 @@ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true }, + "zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "requires": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "requires": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + } + } + }, "zone.js": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", diff --git a/package.json b/package.json index e91eb05..f60c179 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,11 @@ "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", "angular": "^1.8.3", + "angular-moment": "^1.3.0", "bootstrap": "^5.3.3", "crypto-js": "^4.2.0", + "exceljs": "^4.4.0", + "file-saver": "^2.0.5", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -44,6 +47,7 @@ "@angular/cli": "^16.2.10", "@angular/compiler-cli": "^16.2.0", "@types/crypto-js": "^4.2.2", + "@types/file-saver": "^2.0.7", "@types/jasmine": "~4.3.0", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", diff --git a/src/app/app-modules/core/components/app-footer/app-footer.component.css b/src/app/app-modules/core/components/app-footer/app-footer.component.css new file mode 100644 index 0000000..6303735 --- /dev/null +++ b/src/app/app-modules/core/components/app-footer/app-footer.component.css @@ -0,0 +1,54 @@ +footer { + background: rgb(37, 55, 70); + height: 30px; + padding: 3px; + color: white; +} + + .footer-text { + margin: 0px; + } + + .online { + background: green; + display: inline-block; + height: 10px; + width: 10px; + border-radius: 50%; + } + + .offline { + background: red; + display: inline-block; + height: 10px; + width: 10px; + border-radius: 50%; + } + + .spec { + margin-top: -6px; + } + + .netstate { + margin-top: 8px; + } + + .swymed-btn { + background: #354f64 + } + + .footer-text-year { + text-align: center; + } + + .footer-text-status { + text-align: right; + } + + .footerAlign { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 5px; + margin-right: 10px; + } \ No newline at end of file diff --git a/src/app/app-modules/core/components/app-footer/app-footer.component.html b/src/app/app-modules/core/components/app-footer/app-footer.component.html new file mode 100644 index 0000000..5f4fa4d --- /dev/null +++ b/src/app/app-modules/core/components/app-footer/app-footer.component.html @@ -0,0 +1,58 @@ + diff --git a/src/app/app-modules/core/components/app-footer/app-footer.component.spec.ts b/src/app/app-modules/core/components/app-footer/app-footer.component.spec.ts new file mode 100644 index 0000000..da8b059 --- /dev/null +++ b/src/app/app-modules/core/components/app-footer/app-footer.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AppFooterComponent } from './app-footer.component'; + +describe('AppFooterComponent', () => { + let component: AppFooterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AppFooterComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AppFooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/app-footer/app-footer.component.ts b/src/app/app-modules/core/components/app-footer/app-footer.component.ts new file mode 100644 index 0000000..b896904 --- /dev/null +++ b/src/app/app-modules/core/components/app-footer/app-footer.component.ts @@ -0,0 +1,61 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { LanguageService } from '../../services/language.service'; +import { SetLanguageComponent } from '../set-language.component'; +// import { SetLanguageComponent } from '../set-language.component'; + +@Component({ + selector: 'app-footer', + templateUrl: './app-footer.component.html', + styleUrls: ['./app-footer.component.css'], +}) +export class AppFooterComponent implements OnInit, DoCheck { + today!: Date; + year: any; + status!: boolean; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor(public http_service: LanguageService) {} + + ngOnInit() { + this.today = new Date(); + this.year = this.today.getFullYear(); + setInterval(() => { + this.status = navigator.onLine; + }, 1000); + this.fetchLanguageResponse(); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/app-header/app-header.component.css b/src/app/app-modules/core/components/app-header/app-header.component.css new file mode 100644 index 0000000..508ce85 --- /dev/null +++ b/src/app/app-modules/core/components/app-header/app-header.component.css @@ -0,0 +1,202 @@ +.navbar-iemr { + /* background-color: #253746; */ + background: #336CFB; + color: white; + border-radius: 0px; + margin-bottom: 5px; + min-height: unset; + padding: 3px 0px; +} + +.icon-bar { + background-color: white; +} + +.navbar-brand { + padding: 0px 15px; + height: unset; +} + +li a { + outline: none; +} + +.navbar-iemr li { + float: right !important; +} + +.navbar-iemr li a:hover { + background: unset; +} + +.navbar-iemr .nav li a { + padding: 6px 8px; +} + +li.logout a span.logoutIcon { + height: 21px; + width: 24px; + display: inline-block; + vertical-align: middle; + background: url(../../../../../assets/images/logoutIcon.png) no-repeat; +} + +li.telemed a img { + height: 24px; + width: 24px; +} + +li.logout a span.logoutIcon:hover { + background-position-y: -21px; +} + +/* #main-navbar { + padding: 5px 15px; + font-weight: bold; */ + /* background-color: rgba(37, 55, 70, 0.2); */ + /* box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, 0.1); */ +/* } */ + +/* .active { + background: rgba(37, 55, 70, 0.1); +} */ + +button.mat-button { + font-weight: bold; + width: 100%; +} + +.role-menu { + width: 100%; +} + +.helpAlign { + font-size: 26px; + vertical-align: middle; + text-align: center; + padding: 0px; + color: rgba(245, 245, 245, 0.877); + margin-top: 4px; +} + +@media (max-width: 500px) { + .container-fluid .navbar-collapse, + .container-fluid .navbar-header { + margin-left: 0px; + margin-right: 0px; + } +} + +@media (max-width: 760px) { + .navbar-brand { + padding: 5px 15px; + } +} + +.userInfo-btn { + width: 200px; + display: flex; + align-items: center; +} + +.userInfo-btn span { + margin-left: 10px; +} + +.alignDropDown { + margin-top: 3px; +} +.alignWord { + margin: 8px 10px; + +} + +/* .navigatorlist ul.nav.navbar-nav { + float: none; + text-align: center; +} + +.navigatorlist li { + border-radius: 30px; + border: 1px solid white; + background-color: white; + margin: 10px; + text-align: center; + float: none; + display: inline-block; +} + +.navigatorlist li { + border-radius: 30px; + border: 1px solid white; + background-color: white; + margin: 10px; + text-align: center; + float: none; + display: inline-block; +} */ + +@media (min-width: 768px) { + .navbar-nav>li { + /* float: left; */ + text-align: center; + } +} + +#main-navbar { + padding: 5px 15px; + font-weight: bold; + /* background-color: rgba(37, 55, 70, 0.2); */ + background-color: transparent; + /* box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, 0.1); */ + box-shadow: none; + text-align: center; +} + +@media (min-width: 768px) { + + #main-navbar ul.navbar-nav:focus ul.navbar-nav:hover ul.navbar-nav>span:focus ul.navbar-nav>span:hover { + /* float: left; */ + margin: 0; + border: 1px solid #336CFB; + background-color: #336CFB !important; + color: #ffffff; + margin-right: 10px; + display: inline-block; + border-radius: 50px; + margin-top: 20px; + margin-bottom: 20px; + text-align: center; + float: none; + } +} + +@media (min-width: 768px) { + + #main-navbar ul.navbar-nav { + /* float: left; */ + margin: 0; + border: 1px solid white; + background-color: white !important; + color: gray; + margin-right: 10px; + display: inline-block; + border-radius: 30px; + margin-top: 20px; + margin-bottom: 20px; + text-align: center; + float: none; + } +} + +.active { + background: #336CFB !important; + border-radius: 30px; + color: white; +} + +@media (min-width: 1200px) { + .hidden-lg { + display: inline-block !important; + } + } diff --git a/src/app/app-modules/core/components/app-header/app-header.component.html b/src/app/app-modules/core/components/app-header/app-header.component.html new file mode 100644 index 0000000..4df7729 --- /dev/null +++ b/src/app/app-modules/core/components/app-header/app-header.component.html @@ -0,0 +1,153 @@ + +
+ +
+
+ +
diff --git a/src/app/app-modules/core/components/app-header/app-header.component.spec.ts b/src/app/app-modules/core/components/app-header/app-header.component.spec.ts new file mode 100644 index 0000000..9a1b619 --- /dev/null +++ b/src/app/app-modules/core/components/app-header/app-header.component.spec.ts @@ -0,0 +1,183 @@ +import { async, ComponentFixture, tick, inject, fakeAsync, TestBed } from '@angular/core/testing'; +import { AuthService } from '../../services/auth.service'; +import { AppHeaderComponent } from './app-header.component'; +import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/from'; +import 'rxjs/add/observable/empty'; +import 'rxjs/add/observable/throw'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { Router, ActivatedRoute } from '@angular/router'; +import { MaterialModule } from '../../../core/material.module'; + + +class RouterStub { + navigate(something) { + + } +} +class MockActivatedRoute { + + snapshot = { + params: [null] + } +} +class authServiceMock { + + logoutUser() { + + } +} + + +describe('AppHeaderComponent', () => { + let component: AppHeaderComponent; + let fixture: ComponentFixture; + let authService: AuthService; + let router: Router; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], + imports: [ MaterialModule, NoopAnimationsModule], + declarations: [ AppHeaderComponent ], + providers: [{ provide: Router, useClass: RouterStub }, + { provide: ActivatedRoute, useClass: MockActivatedRoute }, + {provide: AuthService, useClass: authServiceMock}] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AppHeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + component.showRoles = false; + authService = TestBed.get(AuthService); + router = TestBed.get(Router); + window.localStorage.setItem('servicePointName', 'Barpeta SP'); + window.localStorage.setItem('userName', 'Prabhsimran Singh'); + window.sessionStorage.setItem('isAuthenticated', 'true'); + }); + + + it('should create app header component', () => { + expect(component).toBeTruthy(); + }); + + it('should get servicePointName from localstorage when init', () => { + fixture.autoDetectChanges(); + expect(component.servicePoint).toEqual(window.localStorage.getItem('servicePointName')); + }) + + it('should get userName from localstorage when init', () => { + fixture.autoDetectChanges(); + expect(component.userName).toEqual(window.localStorage.getItem('userName')); + }) + + it('should get isAuthenticated from localstorage when init', () => { + fixture.autoDetectChanges(); + expect((component.isAuthenticated).toString()).toBe(window.sessionStorage.getItem('isAuthenticated')); + }) + + it('should keep roles as undefined as we\'ve kept showroles as no', () => { + fixture.autoDetectChanges(); + expect(component.roles).toBe(undefined); + }) + + it('should keep filteredNavigation as undefined as we\'ve kept showroles as no', () => { + fixture.autoDetectChanges(); + expect(component.filteredNavigation).toBe(undefined); + }) + + + it('should set roles as per save in localstorage when we have showRoles set to true', () => { + component.showRoles = true; + const role = '["Registrar","Nurse","Doctor","TC Specialist","Oncologist","Lab Technician","Pharmacist"]'; + window.localStorage.setItem('role', role); + component.ngOnInit(); + fixture.detectChanges(); + expect(component.roles).toBeTruthy(); + }) + + it('should not set roles as per save in localstorage when we don\'t have showRoles set to true', () => { + const role = '["Registrar","Nurse","Doctor","TC Specialist","Oncologist","Lab Technician","Pharmacist"]'; + window.localStorage.setItem('role', role); + component.ngOnInit(); + fixture.detectChanges(); + expect(component.roles).not.toBeTruthy(); + }) + + it('should filteredNavigation as per save in localstorage when we have showRoles set to true', () => { + component.showRoles = true; + const role = '["Registrar","Nurse","Doctor","TC Specialist","Oncologist","Lab Technician","Pharmacist"]'; + window.localStorage.setItem('role', role); + component.ngOnInit(); + fixture.detectChanges(); + expect(component.filteredNavigation).toBeTruthy(); + }) + + it('should call logout method on click of logout tag', fakeAsync(() => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of(1)); + component.ngOnInit(); + fixture.detectChanges(); + const el = fixture.debugElement.query(By.css('#logoutButton')); + el.triggerEventHandler('click', null); + tick(); + fixture.detectChanges(); + expect(spy).toHaveBeenCalled(); + })); + + it('should not clear local storage asresponse is not correct', () => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of({ statusCode: 401})); + component.ngOnInit(); + component.logout(); + + expect(localStorage.length).not.toEqual(0); + }); + + it('should not clear session storage asresponse is not correct', () => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of({ statusCode: 401 })); + component.ngOnInit(); + component.logout(); + + expect(sessionStorage.length).not.toEqual(0); + }); + + it('should clear local storage as response is correct', () => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of({ statusCode: 200 })); + component.ngOnInit(); + component.logout(); + + expect(localStorage.length).toEqual(0); + }); + + it('should clear local storage as response is correct', () => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of({ statusCode: 200 })); + component.ngOnInit(); + component.logout(); + + expect(sessionStorage.length).toEqual(0); + }); + + it('should call to navigate to other component', () => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of({ statusCode: 200 })); + const spier = spyOn(router, 'navigate'); + component.ngOnInit(); + component.logout(); + expect(spier).toHaveBeenCalled(); + }); + + it('should call to navigate to login component', () => { + const spy = spyOn(authService, 'logoutUser').and.returnValue(Observable.of({ statusCode: 200 })); + const spier = spyOn(router, 'navigate'); + component.ngOnInit(); + component.logout(); + expect(spier).toHaveBeenCalledWith(['/login']); + }); + + +}); diff --git a/src/app/app-modules/core/components/app-header/app-header.component.ts b/src/app/app-modules/core/components/app-header/app-header.component.ts new file mode 100644 index 0000000..2596cd7 --- /dev/null +++ b/src/app/app-modules/core/components/app-header/app-header.component.ts @@ -0,0 +1,394 @@ +import { + Component, + OnInit, + Input, + Output, + Optional, + EventEmitter, + OnChanges, + ViewChild, + AfterContentChecked +} from "@angular/core"; +import { Router, ActivatedRoute, RouterLinkActive } from "@angular/router"; +import { AuthService } from "../../services/auth.service"; +import { ConfirmationService } from "../../services/confirmation.service"; +// import { environment } from "environments/environment"; +// import { MdDialog, MdDialogRef } from "@angular/material"; +// import { ShowCommitAndVersionDetailsComponent } from "./../show-commit-and-version-details/show-commit-and-version-details.component"; +import { LanguageService } from "../../services/language.service"; +import { MatDialog } from "@angular/material/dialog"; +import { environment } from "src/environments/environment"; +import { ShowCommitAndVersionDetailsComponent } from "../show-commit-and-version-details/show-commit-and-version-details.component"; +@Component({ + selector: "app-header", + templateUrl: "./app-header.component.html", + styleUrls: ["./app-header.component.css"] +}) +export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecked { + + @ViewChild('activePharmacist') + private activePharmacist!: RouterLinkActive; + + @Input() + showRoles!: boolean; + storeName: any; + facility: any; + userName!: string; + designation!: string; + providerServiceID!: string; + isAuthenticated!: boolean; + isExternal!: boolean; + filteredNavigation: any; + roles: any; + parent_app: any; + parent_url = sessionStorage.getItem("return"); + reportsList:any = []; + languageArray: any; + language_file_path: any = "./assets/"; + language: any = "English"; + currentLanguageSet: any; + navigation: any; + updateCSSToShowActivePharmacist= false; + + constructor( + private router: Router, + private auth: AuthService, + private dialog: MatDialog, + private http_service: LanguageService, + private confirmationService: ConfirmationService + ) {} + license: any; + ngOnInit() { + // this.changeLanguage(this.language); + this.getUIVersionAndCommitDetails(); + // this.servicePoint = localStorage.getItem('servicePointName'); + const userName = localStorage.getItem('userName'); + if (userName != null) { + this.userName = userName; + } + const designation = localStorage.getItem('designation'); + if (designation != null) { + this.designation = designation; + } + this.isExternal = sessionStorage.getItem('isExternal') == 'true'; + this.parent_app = sessionStorage.getItem('host'); + const providerServiceID = localStorage.getItem('providerServiceID'); + if (providerServiceID != null) { + this.providerServiceID = providerServiceID; + } + + this.isAuthenticated = + sessionStorage.getItem("isAuthenticated") == "true" ? true : false; + // if (this.showRoles) { + // this.roles = JSON.parse(localStorage.getItem("role")); + // this.filteredNavigation = this.navigation.filter(item => { + // return this.roles.includes(item.role); + // }); + // console.log("filteredNavigation", this.filteredNavigation); + // } + this.license = environment.licenseUrl; + this.reportsList = [ + "Inward stock Report", + "Consumption Report", + "Expiry Report", + "Beneficiary drug issue Report" + ]; + // if (localStorage.getItem("currentLanguage") == "undefined") { + // this.language = "English"; + // } else { + // this.language = localStorage.getItem("currentLanguage"); + // } + if (this.isAuthenticated) { + this.fetchLanguageSet(); + } + + } + + ngAfterContentChecked(): void { + if (this.activePharmacist !== undefined && this.activePharmacist.isActive) { + console.log('isActive'); + this.updateCSSToShowActivePharmacist = true; + } + } + + fetchLanguageSet() { + this.http_service.fetchLanguageSet().subscribe((languageRes: any) => { + if (languageRes && Array.isArray(languageRes.data)) { + this.languageArray = languageRes.data; + this.getLanguage(); + } + }); + } + + getLanguage() { + if (localStorage.getItem('currentLanguage') != null) { + this.changeLanguage(localStorage.getItem('currentLanguage')); + } else { + this.changeLanguage(this.language); + } + } + changeLanguage(language: any) { + this.http_service + .getLanguage(this.language_file_path + language + '.json') + .subscribe( + (response) => { + if (response !== undefined && response !== null) { + this.languageSuccessHandler(response, language); + } else { + alert(this.currentLanguageSet.alerts.langNotDefinesd); + } + }, + (error) => { + alert( + this.currentLanguageSet.alerts.comingUpWithThisLang + + ' ' + + language, + ); + }, + ); + } + languageSuccessHandler(response: any, language: any) { + console.log('language is ', response); + if (response == undefined) { + alert(this.currentLanguageSet.alerts.langNotDefinesd); + } + if (response[language] != undefined) { + this.currentLanguageSet = response[language]; + localStorage.setItem('currentLanguage', language); + if (this.currentLanguageSet) { + this.languageArray.forEach((item: any) => { + if (item.languageName == language) { + this.language = language; + } + }); + } else { + this.language = language; + } + this.http_service.getCurrentLanguage(response[language]); + this.roleNavigation(); + } else { + alert( + this.currentLanguageSet.alerts.info.comingUpWithThisLang + + ' ' + + language, + ); + } + } + + + // fetchLanguageSet() { + // this.http_service.fetchLanguageSet().subscribe(languageRes => { + // if (languageRes !== undefined && languageRes !== null) { + // this.languageArray = languageRes; + // this.getLanguage(); + // } + // }); + // } + // getLanguage() { + // if (localStorage.getItem('currentLanguage') != null) { + // this.changeLanguage(localStorage.getItem('currentLanguage')); + // } else { + // this.changeLanguage(this.language); + // } + // } + // changeLanguage(language: any) { + + // this.http_service + // .getLanguage(this.language_file_path + language + ".json") + // .subscribe( + // response => { + // if(response !== undefined && response !== null){ + // this.languageSuccessHandler(response, language); + // } else { + // alert(this.currentLanguageSet.alerts.langNotDefinesd); + // } + // }, + // error => { + // alert( + // this.currentLanguageSet.alerts.comingUpWithThisLang + + // " " + + // language + // ); + // } + // ); + // } + // languageSuccessHandler(response: any, language: any) { + // console.log("language is ", response); + // if (response == undefined) { + // alert(this.currentLanguageSet.alerts.langNotDefinesd) + // } + // if (response[language] != undefined) { + // this.currentLanguageSet = response[language]; + // localStorage.setItem('currentLanguage', language); + // if (this.currentLanguageSet) { + // this.languageArray.forEach((item: any) => { + // if (item.languageName == language) { + // this.language = language; + // } + // }); + // } else { + // this.language = language; + // } + // this.http_service.getCurrentLanguage(response[language]); + // this.roleNavigation(); + // } else { + // alert(this.currentLanguageSet.alerts.comingUpWithThisLang + " " + language); + // } + // } + + ngOnChanges() { + + const facility = localStorage.getItem('facilityDetail'); + if (facility != null) { + this.facility = JSON.parse(facility); + } + if (this.facility) { + this.storeName = this.facility.facilityName; + } + } + + roleNavigation() { + this.navigation = [ + { + role: this.currentLanguageSet.itemDispense.pharmacist, + work: [ + { + link: "/inventory/medicineDispense", + label: this.currentLanguageSet.inventory.patientIssueWithoutRx + }, + { + link: "/inventory/physicalStockEntry", + label: this.currentLanguageSet.inventory.physicalStockEntry + }, + { link: "/inventory/storeStockAdjustment", label: this.currentLanguageSet.inventory.stockAdjustment }, + { link: "/inventory/storeSelfConsumption", label: this.currentLanguageSet.inventory.storeConsumption }, + { link: "/inventory/storeStockTransfer", label: this.currentLanguageSet.inventory.stockTransfer }, + { link: "/inventory/patientReturn", label: this.currentLanguageSet.inventory.patientReturns }, + { link: "/inventory/indentOrderWorklist", label: this.currentLanguageSet.inventory.indent } + ] + }, + { + role: this.currentLanguageSet.inventory.reports, + work: [ + { link: "/inventory/inwardStockReport", label: this.currentLanguageSet.inventory.inwardStockReport }, + { link: "/inventory/consumptionReport", label: this.currentLanguageSet.inventory.consumptionReport }, + { link: "/inventory/expiryReport", label: this.currentLanguageSet.inventory.expiryReport }, + { + link: "/inventory/beneficiaryDrugIssueReport", + label: this.currentLanguageSet.inventory.beneficiaryDrugIssueReport + }, + { + link: "/inventory/dailyStockReportDetails", + label: this.currentLanguageSet.inventory.dailyStockReportDetails + }, + { + link: "/inventory/dailyStockReportSummary", + label: this.currentLanguageSet.inventory.dailyStockReportSummary + }, + { link: "/inventory/monthlyReport", label: this.currentLanguageSet.inventory.monthlyReport }, + { link: "/inventory/yearlyReport", label: this.currentLanguageSet.inventory.yearlyReport }, + { link: "/inventory/shortExpiryReport", label: this.currentLanguageSet.inventory.shortExpiryReport }, + { link: "/inventory/transitReport", label: this.currentLanguageSet.inventory.transitReport} + ] + } + ]; +} + + + // navigation1 = [{ + // roleSup: 'Supervisor', + // workSup: [ + // { link: '/inventory/inwardStockReport', label: 'Inward Stock Report' }, + // { link: '/inventory/consumptionReport', label: 'Consumption Report' }, + // { link: '/inventory/expiryReport', label: 'Expiry Report' }, + // { link: '/inventory/beneficiaryDrugIssueReport', label: 'Beneficiary drug issue Report' }, + // { link: '/inventory/dailyStockReportDetails ', label: 'Daily Stock Report Details ' }, + // { link: '/inventory/dailyStockReportSummary ', label: 'Daily Stock Report Summary ' }, + // { link: '/inventory/monthlyReport ', label: 'Monthly Report ' }, + // { link: '/inventory/yearlyReport ', label: 'Yearly Report ' }, + + // ] + // }, + // ]; + + logout() { + this.auth.logoutUser().subscribe((res: any) => { + if (res && res.statusCode == 200) { + this.router.navigate(["/login"]); + this.changeLanguage('English'); + localStorage.clear(); + sessionStorage.clear(); + } + }); + } + commitDetailsUI: any; + versionUI: any; + getUIVersionAndCommitDetails() { + const commitDetailsPath: any = "assets/git-version.json"; + this.auth.getUIVersionAndCommitDetails(commitDetailsPath).subscribe( + res => { + console.log("res", res); + this.commitDetailsUI = res; + this.versionUI = this.commitDetailsUI["version"]; + }, + err => { + console.log("err", err); + } + ); + } + showVersionAndCommitDetails() { + this.auth.getAPIVersionAndCommitDetails().subscribe( + (res: any) => { + if (res.statusCode == 200) { + this.constructAPIAndUIDetails(res.data); + } + }, + err => {} + ); + } + constructAPIAndUIDetails(apiVersionAndCommitDetails: any) { + const data = { + commitDetailsUI: { + version: this.commitDetailsUI["version"], + commit: this.commitDetailsUI["commit"] + }, + commitDetailsAPI: { + version: apiVersionAndCommitDetails["git.build.version"] || "NA", + commit: apiVersionAndCommitDetails["git.commit.id"] || "NA" + } + }; + if (data) { + this.showData(data); + } + } + showData(versionData: any) { + const dialogRef = this.dialog.open(ShowCommitAndVersionDetailsComponent, { + data: versionData + }); + } + + backToParent() { + // this.confirmationService.confirm('Info', `Go Back to ${this.parent_app} ? please confirm.`) + // .subscribe((res) => { + // if (res) { + // sessionStorage.clear(); + // localStorage.clear(); + sessionStorage.removeItem("parentBen"); + sessionStorage.removeItem("parentBenVisit"); + sessionStorage.removeItem("isExternal"); + sessionStorage.removeItem("host"); + sessionStorage.removeItem("fallback"); + sessionStorage.removeItem("return"); + localStorage.removeItem("facilityDetail"); + let language: any; + if (localStorage.getItem("currentLanguage") == "undefined") { + language = "English"; + } else { + language = localStorage.getItem("currentLanguage"); + } + window.location.href = `${this.parent_url}?currentLanguage=${language}`; + localStorage.removeItem("currentLanguage"); + // } + // }) + } +} diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css new file mode 100644 index 0000000..be91fd2 --- /dev/null +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css @@ -0,0 +1,53 @@ +.dialog-container { + height: 100%; + overflow-x: hidden; +} + +.dialog-title { + margin: 0px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + + +/* mat-checkbox--selected { + --mat-option-selected-state-label-text-color: #336CFB !important; +} */ + +.dialog-title h4 { + display: inline-block; +} + +.dialog-title .exit { + cursor: pointer; +} + +.scrolling-content { + max-height: 75vh; + overflow-y: hidden; + overflow-x: hidden; +} + +.input-full-width { + width: 100%; +} + +.m-b-20 { + margin-bottom: 20px; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + +@media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } +} + +.enableScroll { height: 250px; flex: auto; } \ No newline at end of file diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html new file mode 100644 index 0000000..c95bc17 --- /dev/null +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html @@ -0,0 +1,228 @@ +
+
+

{{ currentLanguageSet?.inventory?.batchSelection }}

+ +
+ +
+
+
+
+ + + +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemCode }} + + {{ batch?.item?.itemCode }} + + {{ currentLanguageSet?.inventory?.itemName }} + + {{ batch?.item?.itemName }} + + {{ currentLanguageSet?.inventory?.batchNo }} + {{ batch?.batchNo }} + {{ currentLanguageSet?.inventory?.itemCategory }} + + {{ batch?.item?.itemCategory?.itemCategoryName }} + + {{ currentLanguageSet?.inventory?.itemForm }} + + {{ batch?.item?.itemForm?.itemForm }} + + {{ currentLanguageSet?.inventory?.pharmacologicalCategory }} + + {{ batch?.item?.pharmacologyCategory?.pharmCategoryName }} + + {{ currentLanguageSet?.inventory?.strength }} + + {{ + batch?.item?.strength + ? batch?.item?.strength + + " " + + (batch?.item?.uom?.uOMName || "") + : "" + }} + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + {{ batch?.quantityInHand }} + + {{ currentLanguageSet?.inventory?.expiryDate }} + + {{ batch?.expiryDate | date: "dd-MM-yyyy" }} + + {{ currentLanguageSet?.inventory?.action }} + + +
+
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.spec.ts b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.spec.ts new file mode 100644 index 0000000..407529d --- /dev/null +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BatchAdjustmentComponent } from './batch-adjustment.component'; + +describe('BatchAdjustmentComponent', () => { + let component: BatchAdjustmentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BatchAdjustmentComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BatchAdjustmentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts new file mode 100644 index 0000000..5626234 --- /dev/null +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts @@ -0,0 +1,110 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { BatchSearchService } from '../../services/batch-search.service'; +import { ConfirmationService } from '../../services/confirmation.service'; + +import { Observable, Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-batch-adjustment', + templateUrl: './batch-adjustment.component.html', + styleUrls: ['./batch-adjustment.component.css'], +}) +export class BatchAdjustmentComponent implements OnInit, DoCheck { + searchTerms!: string; + noRecordsFlag = false; + items$!: Observable; + selectedBatchList: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + private confirmationService: ConfirmationService, + public dialogRef: MatDialogRef, + public http_service: LanguageService, + private batchSearchService: BatchSearchService, + ) {} + + ngOnInit() { + this.search(this.input.searchTerm); + this.fetchLanguageResponse(); + } + + search(term: string): void { + this.items$ = this.batchSearchService.searchAdjustmentBatch(term); + this.items$.subscribe((data) => { + if (data) { + this.dataSource.data = data.data; + this.dataSource.paginator = this.paginator; + this.noRecordsFlag = true; + } else { + this.noRecordsFlag = false; + } + }); + } + + selectBatch(event: any, batch: any) { + if (event.checked) { + batch.selected = true; + this.selectedBatchList.push(batch); + } else { + const index = this.selectedBatchList.indexOf(batch); + this.selectedBatchList.splice(index, 1); + batch.selected = false; + } + } + + disableSelection(batch: any) { + const addedStock = this.input.addedStock; + const temp = addedStock.filter( + (stock: any) => stock.itemStockEntryID == batch.itemStockEntryID, + ); + if (temp.length > 0) return true; + else return false; + } + + submitBatch() { + this.dialogRef.close(this.selectedBatchList); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/batch-search/batch-search.component.css b/src/app/app-modules/core/components/batch-search/batch-search.component.css new file mode 100644 index 0000000..c6113ad --- /dev/null +++ b/src/app/app-modules/core/components/batch-search/batch-search.component.css @@ -0,0 +1,50 @@ +.dialog-container { + height: 100%; + overflow-x: hidden; +} + +.dialog-title { + margin: 0px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + +.dialog-title h4 { + display: inline-block; +} + +.dialog-title .exit { + cursor: pointer; +} + +.scrolling-content { + max-height: 75vh; + overflow-y: auto; + overflow-x: hidden; +} + +.input-full-width { + width: 100%; +} + +.m-b-20 { + margin-bottom: 20px; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} +.greenBttn { + background: #43a047 !important; + color: white; +} + +@media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/batch-search/batch-search.component.html b/src/app/app-modules/core/components/batch-search/batch-search.component.html new file mode 100644 index 0000000..c60a1db --- /dev/null +++ b/src/app/app-modules/core/components/batch-search/batch-search.component.html @@ -0,0 +1,226 @@ +
+
+

{{ currentLanguageSet?.inventory?.batchSelection }}

+ +
+ +
+
+
+
+ + + +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemCode }} + + {{ batch?.item?.itemCode }} + + {{ currentLanguageSet?.inventory?.itemName }} + + {{ batch?.item?.itemName }} + + {{ currentLanguageSet?.inventory?.batchNo }} + {{ batch?.batchNo }} + {{ currentLanguageSet?.inventory?.itemCategory }} + + {{ batch?.item?.itemCategory?.itemCategoryName }} + + {{ currentLanguageSet?.inventory?.itemForm }} + + {{ batch?.item?.itemForm?.itemForm }} + + {{ currentLanguageSet?.inventory?.pharmacologicalCategory }} + + {{ batch?.item?.pharmacologyCategory?.pharmCategoryName }} + + {{ currentLanguageSet?.inventory?.strength }} + + {{ + batch?.item?.strength + ? batch?.item?.strength + + " " + + (batch?.item?.uom?.uOMName || "") + : "" + }} + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + {{ batch?.quantityInHand }} + + {{ currentLanguageSet?.inventory?.expiryDate }} + + {{ batch?.expiryDate | date: "dd-MM-yyyy" }} + + {{ currentLanguageSet?.inventory?.action }} + + +
+
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
+
+
+
+ +
+
+
+
diff --git a/src/app/app-modules/core/components/batch-search/batch-search.component.spec.ts b/src/app/app-modules/core/components/batch-search/batch-search.component.spec.ts new file mode 100644 index 0000000..137163d --- /dev/null +++ b/src/app/app-modules/core/components/batch-search/batch-search.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BatchSearchComponent } from './batch-search.component'; + +describe('BatchSearchComponent', () => { + let component: BatchSearchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BatchSearchComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BatchSearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/batch-search/batch-search.component.ts b/src/app/app-modules/core/components/batch-search/batch-search.component.ts new file mode 100644 index 0000000..62121d5 --- /dev/null +++ b/src/app/app-modules/core/components/batch-search/batch-search.component.ts @@ -0,0 +1,110 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { BatchSearchService } from '../../services/batch-search.service'; +import { ConfirmationService } from '../../services/confirmation.service'; + +import { Observable, Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-batch-search', + templateUrl: './batch-search.component.html', + styleUrls: ['./batch-search.component.css'], +}) +export class BatchSearchComponent implements OnInit, DoCheck { + searchTerms!: string; + items$!: Observable; + selectedBatchList: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + noRecordsFlag = false; + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + private confirmationService: ConfirmationService, + public http_service: LanguageService, + public dialogRef: MatDialogRef, + private batchSearchService: BatchSearchService, + ) {} + + ngOnInit() { + this.search(this.input.searchTerm); + this.fetchLanguageResponse(); + } + + search(term: string): void { + this.items$ = this.batchSearchService.searchItemBatch(term); + this.items$.subscribe((data) => { + if (data) { + this.dataSource.data = data.data; + this.dataSource.paginator = this.paginator; + this.noRecordsFlag = true; + } else { + this.noRecordsFlag = false; + } + }); + } + + selectBatch(event: any, batch: any) { + if (event.checked) { + batch.selected = true; + this.selectedBatchList.push(batch); + } else { + const index = this.selectedBatchList.indexOf(batch); + this.selectedBatchList.splice(index, 1); + batch.selected = false; + } + } + + disableSelection(batch: any) { + const addedStock = this.input.addedStock; + const temp = addedStock.filter( + (stock: any) => stock.itemStockEntryID == batch.itemStockEntryID, + ); + if (temp.length > 0) return true; + else return false; + } + + submitBatch() { + this.dialogRef.close(this.selectedBatchList); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.css b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.css new file mode 100644 index 0000000..a9f0e63 --- /dev/null +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.css @@ -0,0 +1,15 @@ +.profileData tr td span { + font-weight: bold; +} + +img { + border-radius: 50%; + width: 100px; + height: 100px; +} + +.table>tbody>tr>td, .table>tbody>tr>th { + padding: 4px; + border-top: none; + vertical-align: middle; +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.html b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.html new file mode 100644 index 0000000..703aae7 --- /dev/null +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.html @@ -0,0 +1,104 @@ +
+
+ Default Patient Image + Patient Image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.bendetails?.beneficiaryName }}: + {{ row?.beneficiaryName }} + {{ currentLanguageSet?.bendetails?.gender }} / + {{ currentLanguageSet?.bendetails?.age }}: + + {{ row?.genderName }} / {{ row?.age }}  {{ row?.ageUnit }} + + {{ currentLanguageSet?.bendetails?.beneficiaryID }} : + {{ row?.beneficiaryID }} + {{ currentLanguageSet?.healthId }}: + + {{ healthIDValue }} + + {{ currentLanguageSet?.bendetails?.registrationDate }}: + + {{ row?.createdDate | date: "dd/MM/yyyy, h:mm a" }} + + {{ currentLanguageSet?.bendetails?.visitDate }}: + + {{ today | date: "dd/MM/yyyy, h:mm a" }} + + {{ currentLanguageSet?.bendetails?.district }}: + + {{ row?.districtName }} / {{ beneficiary?.villageName }} +
+
+
diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.spec.ts b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.spec.ts new file mode 100644 index 0000000..485b11f --- /dev/null +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BeneficiaryDetailsComponent } from './beneficiary-details.component'; + +describe('BeneficiaryDetailsComponent', () => { + let component: BeneficiaryDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BeneficiaryDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BeneficiaryDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts new file mode 100644 index 0000000..99d5d8a --- /dev/null +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts @@ -0,0 +1,99 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnDestroy, OnInit } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; + +import { BeneficiaryDetailsService } from '../../services/beneficiary-details.service'; +import { LanguageService } from '../../services/language.service'; +import { SetLanguageComponent } from '../set-language.component'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-beneficiary-details', + templateUrl: './beneficiary-details.component.html', + styleUrls: ['./beneficiary-details.component.css'], +}) +export class BeneficiaryDetailsComponent implements OnInit, DoCheck, OnDestroy { + beneficiary: any; + today: any; + beneficiaryDetailsSubscription: any; + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + healthIDValue!: string; + dataList = new MatTableDataSource(); + + constructor( + private router: Router, + private route: ActivatedRoute, + private http_service: LanguageService, + private beneficiaryDetailsService: BeneficiaryDetailsService, + ) {} + + ngOnInit() { + this.today = new Date(); + const healthIDValue: any = localStorage.getItem('healthID'); + this.healthIDValue = healthIDValue; + this.route.params.subscribe((param) => { + const benFlowId: any = localStorage.getItem('benFlowID'); + this.beneficiaryDetailsService.getBeneficiaryDetails( + param['beneficiaryRegID'], + benFlowId, + ); + this.beneficiaryDetailsSubscription = + this.beneficiaryDetailsService.beneficiaryDetails$.subscribe((res) => { + if (res != null) { + this.beneficiary = res; + this.dataList.data = this.beneficiary; + if (res.serviceDate) { + this.today = res.serviceDate; + } + } + }); + + this.beneficiaryDetailsService + .getBeneficiaryImage(param['beneficiaryRegID']) + .subscribe((data) => { + if (data && data.benImage) { + this.beneficiary.benImage = data.benImage; + } + }); + }); + this.fetchLanguageResponse(); + } + + ngOnDestroy() { + if (this.beneficiaryDetailsSubscription) + this.beneficiaryDetailsSubscription.unsubscribe(); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/common-dialog/common-dialog.component.ts b/src/app/app-modules/core/components/common-dialog/common-dialog.component.ts index d4ad221..ac6e805 100644 --- a/src/app/app-modules/core/components/common-dialog/common-dialog.component.ts +++ b/src/app/app-modules/core/components/common-dialog/common-dialog.component.ts @@ -29,6 +29,7 @@ import { import { LanguageService } from '../../services/language.service'; // import { SetLanguageComponent } from '../set-language.component'; import { MatDialogRef } from '@angular/material/dialog'; +import { SetLanguageComponent } from '../set-language.component'; @Component({ selector: 'app-common-dialog', @@ -60,7 +61,7 @@ export class CommonDialogComponent implements OnInit { public selectedValue: any; // Choose from Radio Button Ends - // languageComponent!: SetLanguageComponent; + languageComponent!: SetLanguageComponent; currentLanguageSet: any; constructor( @@ -117,9 +118,9 @@ export class CommonDialogComponent implements OnInit { } fetchLanguageResponse() { - // this.languageComponent = new SetLanguageComponent(this.http_service); - // this.languageComponent.setLanguage(); - // this.currentLanguageSet = this.languageComponent.currentLanguageObject; + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; } // -----End------ } diff --git a/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.css b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.css new file mode 100644 index 0000000..4aa6034 --- /dev/null +++ b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.css @@ -0,0 +1,39 @@ +.input-full-width { + width: 100%; +} + +.m-t-30 { + margin-top: 30px; +} + +.container-fluid { + padding: 24px !important; +} + +.title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + +@media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.html b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.html new file mode 100644 index 0000000..9ba49e6 --- /dev/null +++ b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.html @@ -0,0 +1,149 @@ +
+

{{ currentLanguageSet?.inventory?.itemForIndentRequest }}

+ +
+ +
+
+
+ + + +
+
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemCode }} + {{ row.itemCode }} + {{ currentLanguageSet?.inventory?.itemName }} + {{ row.itemName }} + {{ currentLanguageSet?.inventory?.itemCategory }} + {{ row.itemCategory }} + {{ currentLanguageSet?.inventory?.itemForm }} + {{ row.itemForm }} + {{ currentLanguageSet?.inventory?.strength }} + + {{ row.strength ? row.strength : " " }} + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + {{ row.qoh }} + {{ currentLanguageSet?.inventory?.action }} + + +
+
+ {{ currentLanguageSet?.inventory?.norecordsfound }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
+
+ +
+
+
diff --git a/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.spec.ts b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.spec.ts new file mode 100644 index 0000000..0be8f33 --- /dev/null +++ b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { IndentItemListComponent } from './indent-item-list.component'; + +describe('IndentItemListComponent', () => { + let component: IndentItemListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [IndentItemListComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IndentItemListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.ts b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.ts new file mode 100644 index 0000000..bfa8b47 --- /dev/null +++ b/src/app/app-modules/core/components/indent-item-list/indent-item-list.component.ts @@ -0,0 +1,104 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { ConfirmationService } from '../../services/confirmation.service'; +import { Observable, Subject } from 'rxjs'; +import { BatchSearchService } from '../../services/batch-search.service'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-indent-item-list', + templateUrl: './indent-item-list.component.html', + styleUrls: ['./indent-item-list.component.css'], +}) +export class IndentItemListComponent implements OnInit, DoCheck { + searchTerms!: string; + items!: Observable; + selectedItemList: any = []; + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + noRecordsFlag = false; + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + private confirmationService: ConfirmationService, + public dialogRef: MatDialogRef, + public http_service: LanguageService, + private batchSearchService: BatchSearchService, + ) {} + + ngOnInit() { + this.search(this.input.searchTerm); + this.fetchLanguageResponse(); + } + + search(term: string): void { + this.items = this.batchSearchService.searchItem(term); + this.items.subscribe((data) => { + if (data) { + this.dataSource.data = data.data; + this.dataSource.paginator = this.paginator; + this.noRecordsFlag = true; + } else { + this.noRecordsFlag = false; + } + }); + } + selectItem(event: any, item: any) { + if (event.checked) { + item.selected = true; + this.selectedItemList.push(item); + } else { + const index = this.selectedItemList.indexOf(item); + this.selectedItemList.splice(index, 1); + item.selected = false; + } + } + disableSelection(item: any) { + const addedIndent = this.input.addedIndent; + const temp = addedIndent.filter( + (indent: any) => indent.itemName == item.itemName, + ); + if (temp.length > 0) return true; + else return false; + } + submitIndentList() { + this.dialogRef.close(this.selectedItemList); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/item-dispense/item-dispense.component.css b/src/app/app-modules/core/components/item-dispense/item-dispense.component.css new file mode 100644 index 0000000..5f5f3dc --- /dev/null +++ b/src/app/app-modules/core/components/item-dispense/item-dispense.component.css @@ -0,0 +1,44 @@ +.input-full-width { + width: 100%; +} + +.m-t-30 { + margin-top: 30px; +} + +.container-fluid { + padding: 24px !important; +} + +.green-button{ + background: #43a047 !important; +} + +.title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; + overflow-y: hidden; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + +@media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/item-dispense/item-dispense.component.html b/src/app/app-modules/core/components/item-dispense/item-dispense.component.html new file mode 100644 index 0000000..6513fbf --- /dev/null +++ b/src/app/app-modules/core/components/item-dispense/item-dispense.component.html @@ -0,0 +1,174 @@ +
+

{{ currentLanguageSet?.inventory?.itemSelection }}

+ +
+ +
+
+
+ + + +
+
+ +
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemCode }} + + {{ selectedItem?.item?.itemCode }} + + {{ currentLanguageSet?.inventory?.itemName }} + + {{ selectedItem?.item?.itemName }} + + {{ currentLanguageSet?.inventory?.batchNo }} + + {{ selectedItem?.quantityInHand }} + + {{ currentLanguageSet?.inventory?.itemCategory }} + + {{ selectedItem?.item?.itemCategory?.itemCategoryName }} + + {{ currentLanguageSet?.inventory?.itemForm }} + + {{ selectedItem?.item?.itemForm?.itemForm }} + + {{ currentLanguageSet?.inventory?.pharmacologicalCategory }} + + {{ selectedItem?.item?.pharmacologyCategory?.pharmCategoryName }} + + {{ currentLanguageSet?.inventory?.strength }} + + {{ selectedItem?.item?.strength }} + {{ selectedItem?.item.uom?.uOMName }} + + {{ currentLanguageSet?.inventory?.action }} + + +
+
+ {{ currentLanguageSet?.inventory?.norecordsfound }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
diff --git a/src/app/app-modules/core/components/item-dispense/item-dispense.component.spec.ts b/src/app/app-modules/core/components/item-dispense/item-dispense.component.spec.ts new file mode 100644 index 0000000..925a8fc --- /dev/null +++ b/src/app/app-modules/core/components/item-dispense/item-dispense.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemDispenseComponent } from './item-dispense.component'; + +describe('ItemDispenseComponent', () => { + let component: ItemDispenseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ItemDispenseComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemDispenseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/item-dispense/item-dispense.component.ts b/src/app/app-modules/core/components/item-dispense/item-dispense.component.ts new file mode 100644 index 0000000..04ff05f --- /dev/null +++ b/src/app/app-modules/core/components/item-dispense/item-dispense.component.ts @@ -0,0 +1,102 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { ItemSearchService } from '../../services/item-search.service'; +import { ConfirmationService } from '../../services/confirmation.service'; + +import { Observable, Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-item-dispense', + templateUrl: './item-dispense.component.html', + styleUrls: ['./item-dispense.component.css'], +}) +export class ItemDispenseComponent implements OnInit, DoCheck { + searchTerms!: string; + items$!: Observable; + selectedItem = null; + + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + dataSource = new MatTableDataSource(); + noRecordsFlag = false; + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + private itemSearchService: ItemSearchService, + public http_service: LanguageService, + public dialogRef: MatDialogRef, + private confirmationService: ConfirmationService, + ) {} + + ngOnInit() { + this.search(this.input.searchTerm); + this.fetchLanguageResponse(); + } + + search(term: string): void { + this.items$ = this.itemSearchService.getItemDetailsByName(term); + this.items$.subscribe((data) => { + if (data) { + this.dataSource.data = data.data; + this.dataSource.paginator = this.paginator; + this.noRecordsFlag = true; + } else { + this.noRecordsFlag = false; + } + }); + } + + selectSelectedItem(selectedItem: any) { + const dispenseItemList = this.input.dispenseItemList.data; + console.log('dispenseItemList', dispenseItemList); + + const temp = dispenseItemList.filter( + (item: any) => item.itemID == selectedItem.item.itemID, + ); + + if (temp.length <= 0) this.dialogRef.close(selectedItem); + else + this.confirmationService.alert( + this.currentLanguageSet.inventory.itemAdded, + ); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/item-search/item-search.component.css b/src/app/app-modules/core/components/item-search/item-search.component.css new file mode 100644 index 0000000..733b10a --- /dev/null +++ b/src/app/app-modules/core/components/item-search/item-search.component.css @@ -0,0 +1,44 @@ +.input-full-width { + width: 100%; +} + +.m-t-30 { + margin-top: 30px; +} + +.container-fluid { + padding: 24px !important; +} + +.title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB !important; + overflow-y: hidden; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} +.blueBttn { + background: #336CFB !important; + color: white; +} + +@media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/item-search/item-search.component.html b/src/app/app-modules/core/components/item-search/item-search.component.html new file mode 100644 index 0000000..b346db3 --- /dev/null +++ b/src/app/app-modules/core/components/item-search/item-search.component.html @@ -0,0 +1,140 @@ +
+

{{ currentLanguageSet?.inventory?.itemSelection }}

+ +
+ +
+
+
+ + + +
+
+ +
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemCode }} + {{ item?.itemCode }} + {{ currentLanguageSet?.inventory?.itemName }} + {{ item?.itemName }} + {{ currentLanguageSet?.inventory?.itemCategory }} + + {{ item?.itemCategory?.itemCategoryName }} + + {{ currentLanguageSet?.inventory?.itemForm }} + + {{ item?.itemForm?.itemForm }} + + {{ currentLanguageSet?.inventory?.pharmacologicalCategory }} + + {{ item?.pharmacologyCategory?.pharmCategoryName }} + + {{ currentLanguageSet?.inventory?.strength }} + + {{ item?.strength ? item?.strength : " " }} + {{ item?.uom?.uOMName ? item?.uom?.uOMName : " " }} + + {{ currentLanguageSet?.inventory?.action }} + + +
+
+ {{ currentLanguageSet?.inventory?.norecordsfound }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
diff --git a/src/app/app-modules/core/components/item-search/item-search.component.spec.ts b/src/app/app-modules/core/components/item-search/item-search.component.spec.ts new file mode 100644 index 0000000..8f1b0cd --- /dev/null +++ b/src/app/app-modules/core/components/item-search/item-search.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemSearchComponent } from './item-search.component'; + +describe('ItemSearchComponent', () => { + let component: ItemSearchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ItemSearchComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemSearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/item-search/item-search.component.ts b/src/app/app-modules/core/components/item-search/item-search.component.ts new file mode 100644 index 0000000..93915bf --- /dev/null +++ b/src/app/app-modules/core/components/item-search/item-search.component.ts @@ -0,0 +1,92 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { ItemSearchService } from '../../services/item-search.service'; + +import { Observable, Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-item-search', + templateUrl: './item-search.component.html', + styleUrls: ['./item-search.component.css'], +}) +export class ItemSearchComponent implements OnInit, DoCheck { + searchTerms!: string; + items$!: Observable; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + noRecordsFlag = false; + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + + displayedColumns: string[] = [ + 'itemCode', + 'itemName', + 'itemCategory', + 'itemForm', + 'pharmacologicalCategory', + 'strength', + 'action', + ]; + // dataSource!: MatTableDataSource; + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + public http_service: LanguageService, + private itemSearchService: ItemSearchService, + ) {} + + ngOnInit() { + this.search(this.input.searchTerm); + this.fetchLanguageResponse(); + } + + search(term: string): void { + this.items$ = this.itemSearchService.searchDrugItem(term); + this.items$.subscribe((data) => { + if (data) { + this.dataSource.data = data.data; + this.dataSource.paginator = this.paginator; + this.noRecordsFlag = true; + } else { + this.noRecordsFlag = false; + } + }); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.css b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.css new file mode 100644 index 0000000..bfbaa68 --- /dev/null +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.css @@ -0,0 +1,75 @@ +.title { + margin: 0px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; +} + + + +.input-full-width { + width: 100%; +} +.action { + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + padding: 8px; + width: 100%; + text-align: right; + border-top: 1px solid lightgrey; +} + +::ng-deep.md2-datepicker-disabled .md2-datepicker-button { + display:none !important; +} + +.action button { + border: 1px solid lightgray; +} + +.success { + background: #43a047; +} + +.info { + background: #336CFB; +} + +.warn, +.error { + background: #F44336; +} + +.center-btn { + justify-content: center !important; + display: flex !important; +} + +.checkbox-fix { + height: 50px; + display: flex; + justify-content: center; + align-items: center; +} +.p-5 { + padding: 5px; +} + +.alert-border { + border: 1px solid #F44336; +} + +.row-shade:nth-child(odd) { +background-color: rgba(240, 245, 245, 0.5); +} + +@media only screen and (min-width: 980px) { + .right-padding-remove-desktop { + padding-right: 0 !important; + } + .left-padding-remove-desktop { + padding-left: 0 !important; + } +} diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html new file mode 100644 index 0000000..5bf1dc5 --- /dev/null +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html @@ -0,0 +1,190 @@ +
+

+ {{ currentLanguageSet?.itemDispense?.batchSelection }} +

+
+
+
+ + {{ + currentLanguageSet?.itemDispense?.prescribedQuantity + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.dispenseQuantity + }} + + +
+
+
+
+
+
+
+ +
+
+ + +
+
+ + {{ + currentLanguageSet?.itemDispense?.batchNo + }} + + +
+ +
+ + {{ + currentLanguageSet?.itemDispense?.quantityinHand + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.dispenseQuantity + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.expiryDate + }} + + + + +
+
+
+
+
+
+
+
+ + +
+
diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.spec.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.spec.ts new file mode 100644 index 0000000..c32ddde --- /dev/null +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RxBatchViewComponent } from './rx-batch-view.component'; + +describe('RxBatchViewComponent', () => { + let component: RxBatchViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RxBatchViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RxBatchViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts new file mode 100644 index 0000000..be677b7 --- /dev/null +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts @@ -0,0 +1,182 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { + FormBuilder, + FormArray, + FormControl, + FormGroup, + AbstractControl, +} from '@angular/forms'; +import { ConfirmationService } from './../../services/confirmation.service'; +import { LanguageService } from '../../services/language.service'; +import { SetLanguageComponent } from '../set-language.component'; +import { MatDialogRef } from '@angular/material/dialog'; +@Component({ + selector: 'app-rx-batch-view', + templateUrl: './rx-batch-view.component.html', + styleUrls: ['./rx-batch-view.component.css'], +}) +export class RxBatchViewComponent implements OnInit, DoCheck { + public items: any; + public prescribed: any; + public editSelection!: number; + dispensed: any; + itemsForm!: FormGroup; + alertDays = 30; + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + constructor( + private fb: FormBuilder, + private confirmationService: ConfirmationService, + public dialogRef: MatDialogRef, + private http_service: LanguageService, + ) {} + ngOnInit() { + this.fetchLanguageResponse(); + console.log(this.items); + this.itemsForm = this.fb.group({}); + this.loadtoForm(this.items); + } + + loadtoForm(items: any) { + const formArray = this.initBatchListArray(items, this.editSelection); + this.itemsForm?.addControl('formArray', formArray); + this.setDispensed(formArray.value); + } + setDispensed(formArray: any, index = -1) { + this.checkQuant(formArray, index); + let quantity = 0; + formArray.map((arr: any) => (quantity += +arr.quantity)); + console.log(quantity, ' quant'); + console.log(formArray); + if (quantity <= this.prescribed) { + this.dispensed = quantity; + } else if (index >= 0) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.dispenseQuantityPrescribed, + 'warn', + ); + const formItems = this.itemsForm?.controls['formArray']; + const currentGroup: FormGroup = formItems?.at(index); + currentGroup.patchValue({ + quantity: null, + }); + } + } + + checkQuant(formArrayVals: any, index: any) { + console.log(formArrayVals, index); + if (index != -1) { + if ( + formArrayVals[index].quantity === '' || + formArrayVals[index].quantity === null || + formArrayVals[index].quantity === 0 || + formArrayVals[index].quantity === '0' || + formArrayVals[index].quantity === undefined + ) { + const formItems = this.itemsForm.controls['formArray']; + formItems.at(index).patchValue({ selection: false }); + } + } + } + + save() { + const formItems = this.itemsForm.controls['formArray']; + + if (!formItems.invalid) { + this.dialogRef.close({ + selectionBatchList: formItems.value, + batchList: formItems.value.filter( + (item: any) => item.selection == true, + ), + dispensed: this.dispensed > 0 ? this.dispensed : null, + }); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.detailsRequired, + 'warn', + ); + } + } + + enableBatch(val: any, index: any) { + console.log(val); + const selection = val.selection; + this.setEnable(index); + } + + setEnable(index: any) { + const formItems = this.itemsForm.controls['formArray']; + formItems.at(index).patchValue({ + selection: true, + }); + } + + checkboxChange(event: any, index: any) { + if (!event.checked) { + const formItems = this.itemsForm.controls['formArray']; + const currentGroup: FormGroup = formItems.at(index); + currentGroup.patchValue({ + quantity: null, + }); + this.setDispensed(formItems.value, index); + } + } + + initBatchListElement(batch: any, selection: any): FormGroup { + return this.fb.group({ + expiryDate: batch.expiryDate, + batchNo: batch.batchNo, + quantity: batch.quantity, + quantityInHand: batch.qty || batch.quantityInHand, + expiresIn: batch.expiresIn, + itemStockEntryID: batch.itemStockEntryID, + selection: batch.selection || selection == '1' ? true : false, + }); + } + + initBatchListArray(batchList: any, selection: any): FormArray { + const batches: FormArray = this.fb.array([]); + batchList.forEach((element: any) => { + batches.push(this.initBatchListElement(element, selection)); + }); + return batches; + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + + getRxBatch(): AbstractControl[] | null { + const getRxBatch = this.itemsForm.get('formArray'); + return getRxBatch instanceof FormArray ? getRxBatch.controls : null; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/search/search.component.css b/src/app/app-modules/core/components/search/search.component.css new file mode 100644 index 0000000..1e4e116 --- /dev/null +++ b/src/app/app-modules/core/components/search/search.component.css @@ -0,0 +1,57 @@ +.input-full-width { + width: 100%; +} + +.m-b-30 { + margin-bottom: 30px; +} + +.mat-form-field { + line-height: unset !important; +} + +.vertical-align-middle { + vertical-align: middle; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + +.title { + margin: 0px 0px 10px; + padding: 5px 24px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; + overflow-x: hidden; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} + +.box { + height: 65px; +} + +.m-r-5{ + margin-right: 5px; +} + +/* .scrolling-content{ + overflow: auto; + max-height: 80vh; +} */ \ No newline at end of file diff --git a/src/app/app-modules/core/components/search/search.component.html b/src/app/app-modules/core/components/search/search.component.html new file mode 100644 index 0000000..ecf2b53 --- /dev/null +++ b/src/app/app-modules/core/components/search/search.component.html @@ -0,0 +1,268 @@ +
+

{{ currentLanguageSet?.inventory?.advanceBeneficiarySearch }}

+ +
+ +
+
+
+
+
+ + + {{ + currentLanguageSet?.inventory?.firstNameIsRequired + }} + {{ + currentLanguageSet?.inventory?.minimumLength + }} + +
+ +
+ + + +
+
+ +
+
+ + {{ gender.genderName }} + + +
+
+ + {{ state.stateName | titlecase }} + + +
+
+ + {{ district.districtName | titlecase }} + + +
+
+
+ + +
+
+
+
+ +
+
+
+ + + + {{ + i + 1 + }} + + + + {{ + currentLanguageSet?.bendetails?.beneficiaryID + }} + {{ element?.beneficiaryID }} + + + + {{ + currentLanguageSet?.bendetails?.beneficiaryName + }} + {{ element?.benName | titlecase }} + + + + {{ + currentLanguageSet?.bendetails?.gender + }} + {{ element?.benName | titlecase }} + + + + {{ currentLanguageSet?.inventory?.dOB }} + + {{ element?.benName | titlecase }} + + + + {{ + currentLanguageSet?.inventory?.fatherName + }} + {{ element?.benName | titlecase }} + + + + {{ currentLanguageSet?.bendetails?.district }} + + {{ element?.benName | titlecase }} + + + + {{ + currentLanguageSet?.bendetails?.phoneNo + }} + {{ element?.benName | titlecase }} + + + + {{ + currentLanguageSet?.bendetails?.regDate + }} + {{ element?.benName | titlecase }} + + + + + + +
+ {{ currentLanguageSet?.inventory?.norecordsfound }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ filteredBeneficiaryList.data.length }} +
+
+
+
+
+
diff --git a/src/app/app-modules/core/components/search/search.component.spec.ts b/src/app/app-modules/core/components/search/search.component.spec.ts new file mode 100644 index 0000000..d442615 --- /dev/null +++ b/src/app/app-modules/core/components/search/search.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchComponent } from './search.component'; + +describe('SearchComponent', () => { + let component: SearchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SearchComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/search/search.component.ts b/src/app/app-modules/core/components/search/search.component.ts new file mode 100644 index 0000000..09d4a68 --- /dev/null +++ b/src/app/app-modules/core/components/search/search.component.ts @@ -0,0 +1,261 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + ViewChild, + ChangeDetectorRef, + AfterViewChecked, + DoCheck, +} from '@angular/core'; +import { ConfirmationService } from '../../services/confirmation.service'; +import { CommonService } from '../../services/common-services.service'; +import { InventoryService } from '../../../inventory/shared/service/inventory.service'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { environment } from 'src/environments/environment'; +import { MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; + +interface Beneficary { + firstName: string; + lastName: string; + gender: string; + stateID: string; + districtID: string | null; +} + +@Component({ + selector: 'app-search', + templateUrl: './search.component.html', + styleUrls: ['./search.component.css'], +}) +export class SearchComponent implements OnInit, DoCheck { + beneficiary!: Beneficary; + genders: any = []; + states: any = []; + districts: any = []; + stateID: any; + districtID: any; + countryId = environment.countryId; + searched = false; + beneficiaryList: any = []; + // filteredBeneficiaryList: any = []; + filteredBeneficiaryList = new MatTableDataSource(); + blankTable = [{}, {}, {}, {}, {}]; + displayedColumns: string[] = [ + 'beneficiaryID', + 'benName', + 'genderName', + 'age', + 'fatherName', + 'districtVillage', + 'phoneNo', + 'registeredOn', + ]; + + @ViewChild('newSearchForm') form: any; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private confirmationService: ConfirmationService, + public mdDialogRef: MatDialogRef, + private commonService: CommonService, + public http_service: LanguageService, + private changeDetectorRef: ChangeDetectorRef, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.createBeneficiaryForm(); + this.callForMasterData(); + this.fetchLanguageResponse(); + } + + AfterViewChecked() { + this.changeDetectorRef.detectChanges(); + } + + callForMasterData() { + this.commonService.getRegistrationData().subscribe((res) => { + if (res && res.statusCode == 200 && res.data) { + console.log(res); + this.genders = res.data.m_genders; + this.states = res.data.states; + } else { + this.mdDialogRef.close(false); + } + }); + } + + onStateChange() { + this.beneficiary.districtID = null; + + this.commonService + .getStateDistricts(this.beneficiary.stateID) + .subscribe((res) => { + if (res && res.data && res.statusCode == 200) { + console.log(res); + this.districts = res.data; + } else { + this.mdDialogRef.close(false); + } + }); + } + + createBeneficiaryForm() { + this.beneficiary = { + firstName: '', + lastName: '', + gender: '', + stateID: '', + districtID: '', + }; + } + + resetBeneficiaryForm() { + this.form.reset(); + this.beneficiaryList = []; + this.filteredBeneficiaryList.data = []; + this.searched = false; + // this.getStatesData() + } + + getSearchResult() { + const dataObj = { + firstName: this.beneficiary.firstName, + lastName: this.beneficiary.lastName, + genderID: this.beneficiary.gender, + providerServiceMapID: localStorage.getItem('providerServiceID'), + i_bendemographics: { + stateID: this.beneficiary.stateID, + districtID: this.beneficiary.districtID, + }, + }; + + this.commonService.searchBeneficiary(dataObj).subscribe( + (beneficiaryList) => { + if ( + !beneficiaryList || + !beneficiaryList.data || + beneficiaryList.data.length <= 0 + ) { + this.beneficiaryList = []; + this.filteredBeneficiaryList.data = []; + this.searched = true; + } else { + this.beneficiaryList = this.searchRestruct(beneficiaryList.data, {}); + this.filteredBeneficiaryList.data = this.beneficiaryList; + this.searched = true; + console.log(this.beneficiaryList, this.filteredBeneficiaryList.data); + } + }, + (error) => { + this.confirmationService.alert(error, 'error'); + }, + ); + } + + /** + * ReStruct the response object of Identity Search to be as per search table requirements + */ + searchRestruct(benList: any, benObject: any) { + const requiredBenData: any = []; + benList.forEach((element: any, i: any) => { + requiredBenData.push({ + beneficiaryID: element.beneficiaryID, + beneficiaryRegID: element.beneficiaryRegID, + benName: `${element.firstName} ${element.lastName || ''}`, + genderName: `${element.m_gender.genderName || 'Not Available'}`, + fatherName: `${element.fatherName || 'Not Available'}`, + districtName: `${element.i_bendemographics.districtName || 'Not Available'}`, + villageName: `${element.i_bendemographics.districtBranchName || 'Not Available'}`, + phoneNo: this.getCorrectPhoneNo(element.benPhoneMaps, benObject), + age: element.dOB, + registeredOn: element.createdDate, + }); + }); + console.log(JSON.stringify(requiredBenData, null, 4), 'yoooo!'); + + return requiredBenData; + } + + getCorrectPhoneNo(phoneMaps: any, benObject: any) { + let phone; + if (benObject && !benObject.phoneNo) { + return phoneMaps.length > 0 ? phoneMaps[0].phoneNo : 'Not Available'; + } else if (benObject && benObject.phoneNo && phoneMaps.length > 0) { + phoneMaps.forEach((element: any) => { + if (element.phoneNo == benObject.phoneNo) { + phone = element.phoneNo; + } + }); + return phone || 'Not Available'; + } else if (phoneMaps.length > 0) { + return phoneMaps[0].phoneNo; + } else { + return 'Not Available'; + } + } + + checkVisit(benID: any) { + if (benID) { + this.inventoryService + .getBeneficaryVisitDetail({ + providerServiceMapID: localStorage.getItem('providerServiceID'), + beneficiaryID: benID, + }) + .subscribe((res) => { + if (res && res.statusCode == 200 && res.data) { + if (res.data.benVisitDetail && res.data.benVisitDetail.length) { + this.mdDialogRef.close(benID); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory + .NoVisitRecordFoundForThisBeneficiary, + 'info', + ); + } + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory + .NoVisitRecordFoundForThisBeneficiary, + 'info', + ); + } + }); + } + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/set-language.component.ts b/src/app/app-modules/core/components/set-language.component.ts new file mode 100644 index 0000000..6e702bb --- /dev/null +++ b/src/app/app-modules/core/components/set-language.component.ts @@ -0,0 +1,48 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +/* + * JA354063 - Created on 21-07-21 + */ +import { Component } from '@angular/core'; +import { LanguageService } from '../services/language.service'; + +@Component({ + template: '', +}) +export class SetLanguageComponent { + currentLanguageObject: any; + constructor(private httpServices: LanguageService) {} + setLanguage() { + const languageSubscription = this.httpServices.currentLangugae$.subscribe( + (languageResponse) => { + this.currentLanguageObject = languageResponse; + }, + (err) => { + console.log(err); + }, + () => { + console.log('completed'); + }, + ); + languageSubscription.unsubscribe(); + } +} diff --git a/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.css b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.css new file mode 100644 index 0000000..8d7ac9a --- /dev/null +++ b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.css @@ -0,0 +1,24 @@ +.title .exit { + cursor: pointer; +} + +.title { + padding: 10px 24px 10px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #0277bd; +} + +.title h4 { + display: inline-block; +} + +.width20 { + width: 20%; +} + +.width40 { + width: 40%; +} diff --git a/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.html b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.html new file mode 100644 index 0000000..4812eb6 --- /dev/null +++ b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.html @@ -0,0 +1,33 @@ +
+

{{ currentLanguageSet?.inventory?.versionDetails }}

+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
APIUI
{{ currentLanguageSet?.inventory?.version }}{{ input.commitDetailsAPI.version }}{{ input.commitDetailsUI.version }}
{{ currentLanguageSet?.inventory?.commit }}{{ input.commitDetailsAPI.commit }}{{ input.commitDetailsUI.commit }}
+
+
+
diff --git a/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.spec.ts b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.spec.ts new file mode 100644 index 0000000..76bf782 --- /dev/null +++ b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShowCommitAndVersionDetailsComponent } from './show-commit-and-version-details.component'; + +describe('ShowCommitAndVersionDetailsComponent', () => { + let component: ShowCommitAndVersionDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ShowCommitAndVersionDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ShowCommitAndVersionDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.ts b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.ts new file mode 100644 index 0000000..8471571 --- /dev/null +++ b/src/app/app-modules/core/components/show-commit-and-version-details/show-commit-and-version-details.component.ts @@ -0,0 +1,57 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck } from '@angular/core'; +import { LanguageService } from '../../services/language.service'; +import { SetLanguageComponent } from '../set-language.component'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-show-commit-and-version-details', + templateUrl: './show-commit-and-version-details.component.html', + styleUrls: ['./show-commit-and-version-details.component.css'], +}) +export class ShowCommitAndVersionDetailsComponent implements OnInit, DoCheck { + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + public http_service: LanguageService, + public dialogRef: MatDialogRef, + ) {} + + ngOnInit() { + this.fetchLanguageResponse(); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/spinner/spinner.component.css b/src/app/app-modules/core/components/spinner/spinner.component.css new file mode 100644 index 0000000..6b3b0ab --- /dev/null +++ b/src/app/app-modules/core/components/spinner/spinner.component.css @@ -0,0 +1,35 @@ +.overlay { + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + position: fixed; + z-index: 1001; + /* Sit on top */ + left: 0; + top: 0; + background-color: rgb(0, 0, 0); + /* Black fallback color */ + background-color: rgba(0, 0, 0, 0.3); + /* Black w/opacity */ +} + + +/* Position the content inside the overlay */ + + +/* .overlay-content { */ + /* position: relative; */ + /* top: 42%; 25% fro/m the top */ + /* left: 46%; */ + /* width: 100%; 100% width */ +/* } */ + +.overlay:root { + padding: 0px; +} + +.loader-hidden { + display: none; +} diff --git a/src/app/app-modules/core/components/spinner/spinner.component.html b/src/app/app-modules/core/components/spinner/spinner.component.html new file mode 100644 index 0000000..8899986 --- /dev/null +++ b/src/app/app-modules/core/components/spinner/spinner.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/src/app/app-modules/core/components/spinner/spinner.component.spec.ts b/src/app/app-modules/core/components/spinner/spinner.component.spec.ts new file mode 100644 index 0000000..887a38c --- /dev/null +++ b/src/app/app-modules/core/components/spinner/spinner.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SpinnerComponent } from './spinner.component'; + +describe('SpinnerComponent', () => { + let component: SpinnerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SpinnerComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SpinnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/spinner/spinner.component.ts b/src/app/app-modules/core/components/spinner/spinner.component.ts new file mode 100644 index 0000000..25148ee --- /dev/null +++ b/src/app/app-modules/core/components/spinner/spinner.component.ts @@ -0,0 +1,36 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { SpinnerState, SpinnerService } from '../../services/spinner.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-spinner', + templateUrl: './spinner.component.html', + styleUrls: ['./spinner.component.css'], +}) +export class SpinnerComponent implements OnInit { + constructor(public spinnerService: SpinnerService) {} + ngOnInit(): void { + throw new Error('Method not implemented.'); + } +} diff --git a/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.css b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.css new file mode 100644 index 0000000..b641a58 --- /dev/null +++ b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.css @@ -0,0 +1,3 @@ +.textarea-full-width { + width: 100%; +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.html b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.html new file mode 100644 index 0000000..8b40b2b --- /dev/null +++ b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.html @@ -0,0 +1,16 @@ +
+ + + {{ message.value.length }} / {{ data.length }} + +
diff --git a/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.spec.ts b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.spec.ts new file mode 100644 index 0000000..ded39cb --- /dev/null +++ b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TextareaDialogComponent } from './textarea-dialog.component'; + +describe('TextareaDialogComponent', () => { + let component: TextareaDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [TextareaDialogComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TextareaDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.ts b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.ts new file mode 100644 index 0000000..905d546 --- /dev/null +++ b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.component.ts @@ -0,0 +1,60 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck } from '@angular/core'; +import { LanguageService } from '../../services/language.service'; +import { SetLanguageComponent } from '../set-language.component'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-textarea-dialog', + templateUrl: './textarea-dialog.component.html', + styleUrls: ['./textarea-dialog.component.css'], +}) +export class TextareaDialogComponent implements OnInit, DoCheck { + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + public dialogRef: MatDialogRef, + public http_service: LanguageService, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + ngOnInit() { + this.dialogRef.backdropClick().subscribe((result) => { + this.dialogRef.close(this.data.observations); + }); + this.fetchLanguageResponse(); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.service.ts b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.service.ts new file mode 100644 index 0000000..116722b --- /dev/null +++ b/src/app/app-modules/core/components/textarea-dialog/textarea-dialog.service.ts @@ -0,0 +1,37 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Injectable } from '@angular/core'; +import { TextareaDialogComponent } from './textarea-dialog.component'; +import { MatDialog } from '@angular/material/dialog'; +import { Observable } from 'rxjs'; +@Injectable() +export class TextareaDialog { + constructor(public dialog: MatDialog) {} + + open(observations: string, length = 500): Observable { + const dialogRef = this.dialog.open(TextareaDialogComponent, { + width: '500px', + data: { observations: observations, length: length }, + }); + return dialogRef.afterClosed(); + } +} diff --git a/src/app/app-modules/core/components/transfer-search/transfer-search.component.css b/src/app/app-modules/core/components/transfer-search/transfer-search.component.css new file mode 100644 index 0000000..2319bdf --- /dev/null +++ b/src/app/app-modules/core/components/transfer-search/transfer-search.component.css @@ -0,0 +1,48 @@ +.dialog-container { + height: 100%; + overflow-x: hidden; +} + +.dialog-title { + margin: 0px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + +.dialog-title h4 { + display: inline-block; +} + +.dialog-title .exit { + cursor: pointer; +} + +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + + +.scrolling-content { + max-height: 75vh; + overflow-y: auto; + overflow-x: hidden; +} + +.input-full-width { + width: 100%; +} + +.m-b-20 { + margin-bottom: 20px; +} + +@media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/core/components/transfer-search/transfer-search.component.html b/src/app/app-modules/core/components/transfer-search/transfer-search.component.html new file mode 100644 index 0000000..ede4f77 --- /dev/null +++ b/src/app/app-modules/core/components/transfer-search/transfer-search.component.html @@ -0,0 +1,174 @@ +
+

{{ currentLanguageSet?.inventory?.batchSelection }}

+ +
+
+
+
+
+ + + +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemCode }} + {{ item?.item.itemCode }} + {{ currentLanguageSet?.inventory?.itemName }} + {{ item?.item.itemName }} + {{ currentLanguageSet?.inventory?.batchNo }} + + {{ item?.batchNo }} + + {{ currentLanguageSet?.inventory?.itemCategory }} + + {{ item?.item.itemCategory.itemCategoryName }} + + {{ currentLanguageSet?.inventory?.itemForm }} + + {{ item?.item?.itemForm.itemForm }} + + {{ currentLanguageSet?.inventory?.pharmacologicalCategory }} + + {{ item?.pharmacologyCategory?.pharmCategoryName }} + + {{ currentLanguageSet?.inventory?.strength }} + + {{ item?.item?.strength }} + {{ item?.item.uom?.uOMName }} + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + {{ item?.quantityInHand }} + + {{ currentLanguageSet?.inventory?.expiryDate }} + + {{ item.expiryDate | date: "dd-MM-yyyy" }} + + {{ currentLanguageSet?.inventory?.action }} + + +
+
+ {{ currentLanguageSet?.inventory?.norecordsfound }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
+
+
+
+ +
+
+
diff --git a/src/app/app-modules/core/components/transfer-search/transfer-search.component.spec.ts b/src/app/app-modules/core/components/transfer-search/transfer-search.component.spec.ts new file mode 100644 index 0000000..7077ccd --- /dev/null +++ b/src/app/app-modules/core/components/transfer-search/transfer-search.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransferSearchComponent } from './transfer-search.component'; + +describe('TransferSearchComponent', () => { + let component: TransferSearchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [TransferSearchComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransferSearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/core/components/transfer-search/transfer-search.component.ts b/src/app/app-modules/core/components/transfer-search/transfer-search.component.ts new file mode 100644 index 0000000..970ae20 --- /dev/null +++ b/src/app/app-modules/core/components/transfer-search/transfer-search.component.ts @@ -0,0 +1,122 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { ItemSearchService } from '../../services/item-search.service'; +import { Observable, Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { SetLanguageComponent } from '../set-language.component'; +import { LanguageService } from '../../services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-transfer-search', + templateUrl: './transfer-search.component.html', + styleUrls: ['./transfer-search.component.css'], +}) +export class TransferSearchComponent implements OnInit, DoCheck { + private searchTerms!: string; + items$!: Observable; + selectedBatchList: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + noRecordsFlag = false; + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'itemCode', + 'itemName', + 'batchNo', + 'itemCategory', + 'itemForm', + 'pharmacologicalCategory', + 'strength', + 'quantityOnHand', + 'expiryDate', + 'action', + ]; + + constructor( + @Inject(MAT_DIALOG_DATA) public input: any, + public dialogRef: MatDialogRef, + public http_service: LanguageService, + private itemSearchService: ItemSearchService, + ) {} + + ngOnInit() { + this.search(this.input.searchTerm); + this.fetchLanguageResponse(); + } + + search(term: string): void { + this.items$ = this.itemSearchService.searchDrugItemforTransfer( + term, + this.input.transferTo, + ); + this.items$.subscribe((data) => { + if (data) { + this.dataSource.data = data.data; + this.dataSource.paginator = this.paginator; + this.noRecordsFlag = true; + } else { + this.noRecordsFlag = false; + } + }); + } + + selectBatch(event: any, batch: any) { + if (event.checked) { + this.selectedBatchList.push(batch); + batch.selected = true; + } else { + const index = this.selectedBatchList.indexOf(batch); + this.selectedBatchList.splice(index, 1); + batch.selected = false; + } + } + + disableSelection(batch: any) { + const addedStock = this.input.addedStock; + const temp = addedStock.filter( + (stock: any) => stock.itemStockEntryID == batch.itemStockEntryID, + ); + if (temp.length > 0) return true; + else return false; + } + + submitBatch() { + this.dialogRef.close(this.selectedBatchList); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/core/core.module.ts b/src/app/app-modules/core/core.module.ts index 8544fb6..ad28022 100644 --- a/src/app/app-modules/core/core.module.ts +++ b/src/app/app-modules/core/core.module.ts @@ -113,6 +113,22 @@ import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatGridListModule } from '@angular/material/grid-list'; import { CommonDialogComponent } from './components/common-dialog/common-dialog.component'; +import { AppFooterComponent } from './components/app-footer/app-footer.component'; +import { SpinnerComponent } from './components/spinner/spinner.component'; +import { SetLanguageComponent } from './components/set-language.component'; +import { AppHeaderComponent } from './components/app-header/app-header.component'; +import { ShowCommitAndVersionDetailsComponent } from './components/show-commit-and-version-details/show-commit-and-version-details.component'; +import { ItemSearchComponent } from './components/item-search/item-search.component'; +import { BatchAdjustmentComponent } from './components/batch-adjustment/batch-adjustment.component'; +import { BatchSearchComponent } from './components/batch-search/batch-search.component'; +import { BeneficiaryDetailsComponent } from './components/beneficiary-details/beneficiary-details.component'; +import { IndentItemListComponent } from './components/indent-item-list/indent-item-list.component'; +import { ItemDispenseComponent } from './components/item-dispense/item-dispense.component'; +import { SearchComponent } from './components/search/search.component'; +import { TextareaDialogComponent } from './components/textarea-dialog/textarea-dialog.component'; +import { TransferSearchComponent } from './components/transfer-search/transfer-search.component'; +import { TextareaDialog } from './components/textarea-dialog/textarea-dialog.service'; +import { RxBatchViewComponent } from './components/rx-batch-view/rx-batch-view.component'; @@ -148,53 +164,52 @@ import { CommonDialogComponent } from './components/common-dialog/common-dialog. ], declarations: [ CommonDialogComponent, - // TextareaDialogComponent, - // SpinnerComponent, - // AppFooterComponent, - // AppHeaderComponent, + TextareaDialogComponent, + SpinnerComponent, + AppFooterComponent, + AppHeaderComponent, myEmailDirective, myMobileNumberDirective, - // SetLanguageComponent, + SetLanguageComponent, myNameDirective, myPasswordDirective, StringValidatorDirective, NullDefaultValueDirective, NumberValidatorDirective, DisableFormControlDirective, - // ItemSearchComponent, + ItemSearchComponent, ItemSearchDirective, MinNumberValidatorDirective, - // TransferSearchComponent, + TransferSearchComponent, ItemTransferDirective, - // BatchSearchComponent, + BatchSearchComponent, BatchSearchDirective, ItemDispenseDirective, - // ItemDispenseComponent, - // SearchComponent, - // SetLanguageComponent, + ItemDispenseComponent, + SearchComponent, ISTDatePipe, BatchAdjustmentDirective, - // BatchAdjustmentComponent, - // BeneficiaryDetailsComponent, - // RxBatchViewComponent, + BatchAdjustmentComponent, + BeneficiaryDetailsComponent, + RxBatchViewComponent, IndentRequestDirective, - // IndentItemListComponent, + IndentItemListComponent, IndentDispenseDirective, - // ShowCommitAndVersionDetailsComponent + ShowCommitAndVersionDetailsComponent ], exports: [ MaterialModule, // Md2Module, CommonDialogComponent, - // TextareaDialogComponent, - // SpinnerComponent, - // SetLanguageComponent, + TextareaDialogComponent, + SpinnerComponent, + SetLanguageComponent, ReactiveFormsModule, - // AppFooterComponent, - // AppHeaderComponent, + AppFooterComponent, + AppHeaderComponent, // Ng2GoogleChartsModule, myEmailDirective, - // SetLanguageComponent, + SetLanguageComponent, myMobileNumberDirective, myNameDirective, myPasswordDirective, @@ -203,21 +218,21 @@ import { CommonDialogComponent } from './components/common-dialog/common-dialog. NumberValidatorDirective, MinNumberValidatorDirective, NullDefaultValueDirective, - // ItemSearchComponent, + ItemSearchComponent, ItemSearchDirective, - // TransferSearchComponent, + TransferSearchComponent, ItemTransferDirective, ItemDispenseDirective, - // BatchSearchComponent, + BatchSearchComponent, BatchSearchDirective, ISTDatePipe, - // BatchAdjustmentComponent, + BatchAdjustmentComponent, BatchAdjustmentDirective, - // BeneficiaryDetailsComponent, + BeneficiaryDetailsComponent, IndentRequestDirective, - // IndentItemListComponent, + IndentItemListComponent, IndentDispenseDirective, - // ShowCommitAndVersionDetailsComponent + ShowCommitAndVersionDetailsComponent ], // entryComponents: [ // CommonDialogComponent, @@ -242,7 +257,7 @@ export class CoreModule { providers: [ ConfirmationService, BatchViewService, - // TextareaDialog, + TextareaDialog, AuthGuard, SpinnerService, CommonService, diff --git a/src/app/app-modules/core/directives/batch-adjustment.directive.ts b/src/app/app-modules/core/directives/batch-adjustment.directive.ts index efc8c85..732e150 100644 --- a/src/app/app-modules/core/directives/batch-adjustment.directive.ts +++ b/src/app/app-modules/core/directives/batch-adjustment.directive.ts @@ -29,6 +29,7 @@ import { // import { BatchAdjustmentComponent } from '../components/batch-adjustment/batch-adjustment.component'; import { FormArray, FormBuilder, Validators, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; +import { BatchAdjustmentComponent } from '../components/batch-adjustment/batch-adjustment.component'; @Directive({ selector: '[appBatchAdjustment]', @@ -59,45 +60,45 @@ export class BatchAdjustmentDirective { const searchTerm = this.stockForm.value.itemName; console.log('SEACHTEREM', searchTerm); - // const dialogRef = this.dialog.open(BatchAdjustmentComponent, { - // // width: '80%', - // // height: '90%', - // panelClass: 'fit-screen', - // data: { searchTerm: searchTerm, addedStock: this.previousSelected }, - // }); + const dialogRef = this.dialog.open(BatchAdjustmentComponent, { + width: '80%', + height: '90%', + panelClass: 'fit-screen', + data: { searchTerm: searchTerm, addedStock: this.previousSelected }, + }); - // dialogRef.afterClosed().subscribe((result) => { - // if (result) { - // const formArray = this.stockForm.parent as FormArray; - // const len = formArray.length; + dialogRef.afterClosed().subscribe((result) => { + if (result) { + const formArray = this.stockForm.parent as FormArray; + const len = formArray.length; - // console.log(formArray + ' ' + len); + console.log(formArray + ' ' + len); - // for (let i = len - 1, j = 0; i < len + result.length - 1; i++, j++) { - // (formArray.at(i)).controls['itemStockEntryID'].setValue( - // result[j].itemStockEntryID, - // ); - // (formArray.at(i)).controls['batchID'].setValue( - // result[j].batchNo, - // ); - // (formArray.at(i)).controls['itemID'].setValue( - // result[j].item.itemID, - // ); - // (formArray.at(i)).controls['itemName'].setValue( - // result[j].item.itemName, - // ); - // (formArray.at(i)).controls['quantityInHand'].setValue( - // result[j].quantityInHand, - // ); - // (formArray.at(i)).controls['itemName'].disable(); - // // (formArray.at(i)).controls['quantity'].enable(); - // (formArray.at(i)).markAsDirty(); + for (let i = len - 1, j = 0; i < len + result.length - 1; i++, j++) { + (formArray.at(i)).controls['itemStockEntryID'].setValue( + result[j].itemStockEntryID, + ); + (formArray.at(i)).controls['batchID'].setValue( + result[j].batchNo, + ); + (formArray.at(i)).controls['itemID'].setValue( + result[j].item.itemID, + ); + (formArray.at(i)).controls['itemName'].setValue( + result[j].item.itemName, + ); + (formArray.at(i)).controls['quantityInHand'].setValue( + result[j].quantityInHand, + ); + (formArray.at(i)).controls['itemName'].disable(); + // (formArray.at(i)).controls['quantity'].enable(); + (formArray.at(i)).markAsDirty(); - // if (formArray.length < len + result.length - 1) - // formArray.push(this.initStockAdjustmentList()); - // } - // } - // }); + if (formArray.length < len + result.length - 1) + formArray.push(this.initStockAdjustmentList()); + } + } + }); } initStockAdjustmentList() { diff --git a/src/app/app-modules/core/directives/batch-search.directive.ts b/src/app/app-modules/core/directives/batch-search.directive.ts index 3b38f5b..35ec682 100644 --- a/src/app/app-modules/core/directives/batch-search.directive.ts +++ b/src/app/app-modules/core/directives/batch-search.directive.ts @@ -30,6 +30,7 @@ import { import { NgControl } from '@angular/forms'; import { FormArray, FormBuilder, Validators, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; +import { BatchSearchComponent } from '../components/batch-search/batch-search.component'; // import { BatchSearchComponent } from '../components/batch-search/batch-search.component'; @Directive({ @@ -61,45 +62,45 @@ export class BatchSearchDirective { openDialog(): void { const searchTerm = this.stockForm.value.itemName; - // const dialogRef = this.dialog.open(BatchSearchComponent, { - // // width: '80%', - // // height: '90%', - // panelClass: 'fit-screen', - // data: { searchTerm: searchTerm, addedStock: this.previousSelected }, - // }); + const dialogRef = this.dialog.open(BatchSearchComponent, { + // width: '80%', + // height: '90%', + panelClass: 'fit-screen', + data: { searchTerm: searchTerm, addedStock: this.previousSelected }, + }); - // dialogRef.afterClosed().subscribe((result) => { - // if (result) { - // const formArray = this.stockForm.parent as FormArray; - // const len = formArray.length; + dialogRef.afterClosed().subscribe((result) => { + if (result) { + const formArray = this.stockForm.parent as FormArray; + const len = formArray.length; - // console.log(formArray + ' ' + len); + console.log(formArray + ' ' + len); - // for (let i = len - 1, j = 0; i < len + result.length - 1; i++, j++) { - // (formArray.at(i)).controls['itemStockEntryID'].setValue( - // result[j].itemStockEntryID, - // ); - // (formArray.at(i)).controls['batchNo'].setValue( - // result[j].batchNo, - // ); - // (formArray.at(i)).controls['itemID'].setValue( - // result[j].item.itemID, - // ); - // (formArray.at(i)).controls['itemName'].setValue( - // result[j].item.itemName, - // ); - // (formArray.at(i)).controls['quantityInHand'].setValue( - // result[j].quantityInHand, - // ); - // (formArray.at(i)).controls['itemName'].disable(); - // (formArray.at(i)).controls['quantity'].enable(); - // (formArray.at(i)).markAsDirty(); + for (let i = len - 1, j = 0; i < len + result.length - 1; i++, j++) { + (formArray.at(i)).controls['itemStockEntryID'].setValue( + result[j].itemStockEntryID, + ); + (formArray.at(i)).controls['batchNo'].setValue( + result[j].batchNo, + ); + (formArray.at(i)).controls['itemID'].setValue( + result[j].item.itemID, + ); + (formArray.at(i)).controls['itemName'].setValue( + result[j].item.itemName, + ); + (formArray.at(i)).controls['quantityInHand'].setValue( + result[j].quantityInHand, + ); + (formArray.at(i)).controls['itemName'].disable(); + (formArray.at(i)).controls['quantity'].enable(); + (formArray.at(i)).markAsDirty(); - // if (formArray.length < len + result.length - 1) - // formArray.push(this.initDispensedStock()); - // } - // } - // }); + if (formArray.length < len + result.length - 1) + formArray.push(this.initDispensedStock()); + } + } + }); } initDispensedStock() { diff --git a/src/app/app-modules/core/directives/item-dispense.directive.ts b/src/app/app-modules/core/directives/item-dispense.directive.ts index 4a836e7..3ccd85e 100644 --- a/src/app/app-modules/core/directives/item-dispense.directive.ts +++ b/src/app/app-modules/core/directives/item-dispense.directive.ts @@ -31,6 +31,7 @@ import { NgControl, FormGroup } from '@angular/forms'; // import { ItemDispenseComponent } from './../components/item-dispense/item-dispense.component'; import { MatDialog } from '@angular/material/dialog'; +import { ItemDispenseComponent } from '../components/item-dispense/item-dispense.component'; @Directive({ selector: '[appItemDispense]', @@ -60,21 +61,21 @@ export class ItemDispenseDirective { console.log(this.stockForm); - // const dialogRef = this.dialog.open(ItemDispenseComponent, { - // // width: '80%', - // // height: '90%', - // panelClass: 'fit-screen', - // data: { searchTerm: searchTerm, dispenseItemList: this.dispenseItemList }, - // }); + const dialogRef = this.dialog.open(ItemDispenseComponent, { + // width: '80%', + // height: '90%', + panelClass: 'fit-screen', + data: { searchTerm: searchTerm, dispenseItemList: this.dispenseItemList }, + }); - // dialogRef.afterClosed().subscribe((result) => { - // if (result) { - // this.stockForm.controls['itemName'].setValue(result.item.itemName); - // this.stockForm.controls['quantityInHand'].setValue( - // result.quantityInHand, - // ); - // this.stockForm.controls['itemID'].setValue(result.item.itemID); - // } - // }); + dialogRef.afterClosed().subscribe((result) => { + if (result) { + this.stockForm.controls['itemName'].setValue(result.item.itemName); + this.stockForm.controls['quantityInHand'].setValue( + result.quantityInHand, + ); + this.stockForm.controls['itemID'].setValue(result.item.itemID); + } + }); } } diff --git a/src/app/app-modules/core/directives/item-search.directive.ts b/src/app/app-modules/core/directives/item-search.directive.ts index eb59b09..ba644cb 100644 --- a/src/app/app-modules/core/directives/item-search.directive.ts +++ b/src/app/app-modules/core/directives/item-search.directive.ts @@ -28,6 +28,7 @@ import { } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; +import { ItemSearchComponent } from '../components/item-search/item-search.component'; // import { ItemSearchComponent } from '../components/item-search/item-search.component'; @Directive({ @@ -52,26 +53,26 @@ export class ItemSearchDirective { openDialog(): void { const searchTerm = this.stockForm.controls['itemName'].value; - // const dialogRef = this.dialog.open(ItemSearchComponent, { - // width: '80%', - // height: '90%', - // panelClass: 'fit-screen', - // data: { searchTerm: searchTerm }, - // }); + const dialogRef = this.dialog.open(ItemSearchComponent, { + width: '80%', + height: '90%', + panelClass: 'fit-screen', + data: { searchTerm: searchTerm }, + }); - // dialogRef.afterClosed().subscribe((result) => { - // if (result) { - // console.log('result', result); - // this.stockForm.controls['itemName'].setValue(result.itemName); - // this.stockForm.controls['itemName'].disable(); - // this.stockForm.controls['itemID'].setValue(result.itemID); + dialogRef.afterClosed().subscribe((result) => { + if (result) { + console.log('result', result); + this.stockForm.controls['itemName'].setValue(result.itemName); + this.stockForm.controls['itemName'].disable(); + this.stockForm.controls['itemID'].setValue(result.itemID); - // if (this.stockForm.controls['isMedical']) - // this.stockForm.controls['isMedical'].setValue(result.isMedical); - // this.stockForm.markAsDirty(); - // } else { - // // this.stockForm.control.parent.reset(); - // } - // }); + if (this.stockForm.controls['isMedical']) + this.stockForm.controls['isMedical'].setValue(result.isMedical); + this.stockForm.markAsDirty(); + } else { + // this.stockForm.control.parent.reset(); + } + }); } } diff --git a/src/app/app-modules/core/directives/item-transfer.directive.ts b/src/app/app-modules/core/directives/item-transfer.directive.ts index 0023bbf..d62c55d 100644 --- a/src/app/app-modules/core/directives/item-transfer.directive.ts +++ b/src/app/app-modules/core/directives/item-transfer.directive.ts @@ -35,6 +35,7 @@ import { } from '@angular/forms'; // import { TransferSearchComponent } from '../components/transfer-search/transfer-search.component'; import { MatDialog } from '@angular/material/dialog'; +import { TransferSearchComponent } from '../components/transfer-search/transfer-search.component'; @Directive({ selector: '[appItemTransfer]', @@ -65,44 +66,44 @@ export class ItemTransferDirective { const transferTo = this.stockForm?.parent?.parent?.value.transferTo.facilityID; - // const dialogRef = this.dialog.open(TransferSearchComponent, { - // // width: '80%', - // // height: '90%', - // panelClass: 'fit-screen', - // data: { - // searchTerm: searchTerm, - // transferTo: transferTo, - // addedStock: this.previousSelected, - // }, - // }); + const dialogRef = this.dialog.open(TransferSearchComponent, { + // width: '80%', + // height: '90%', + panelClass: 'fit-screen', + data: { + searchTerm: searchTerm, + transferTo: transferTo, + addedStock: this.previousSelected, + }, + }); - // dialogRef.afterClosed().subscribe((result) => { - // if (result) { - // const formArray = this.stockForm.parent as FormArray; - // const len = formArray.length; - // for (let i = len - 1, j = 0; i < len + result.length - 1; i++, j++) { - // (formArray.at(i)).controls['itemStockEntryID'].setValue( - // result[j].itemStockEntryID, - // ); - // (formArray.at(i)).controls['batchNo'].setValue( - // result[j].batchNo, - // ); - // (formArray.at(i)).controls['qoh'].setValue( - // result[j].quantityInHand, - // ); + dialogRef.afterClosed().subscribe((result) => { + if (result) { + const formArray = this.stockForm.parent as FormArray; + const len = formArray.length; + for (let i = len - 1, j = 0; i < len + result.length - 1; i++, j++) { + (formArray.at(i)).controls['itemStockEntryID'].setValue( + result[j].itemStockEntryID, + ); + (formArray.at(i)).controls['batchNo'].setValue( + result[j].batchNo, + ); + (formArray.at(i)).controls['qoh'].setValue( + result[j].quantityInHand, + ); - // (formArray.at(i)).controls['itemName'].setValue( - // result[j].item.itemName, - // ); - // (formArray.at(i)).controls['itemName'].disable(); - // (formArray.at(i)).controls['quantity'].enable(); - // (formArray.at(i)).markAsDirty(); + (formArray.at(i)).controls['itemName'].setValue( + result[j].item.itemName, + ); + (formArray.at(i)).controls['itemName'].disable(); + (formArray.at(i)).controls['quantity'].enable(); + (formArray.at(i)).markAsDirty(); - // if (formArray.length < len + result.length - 1) - // formArray.push(this.createItem()); - // } - // } - // }); + if (formArray.length < len + result.length - 1) + formArray.push(this.createItem()); + } + } + }); } createItem() { diff --git a/src/app/app-modules/core/services/auth-guard.service.ts b/src/app/app-modules/core/services/auth-guard.service.ts index b482cfd..00f7872 100644 --- a/src/app/app-modules/core/services/auth-guard.service.ts +++ b/src/app/app-modules/core/services/auth-guard.service.ts @@ -23,10 +23,11 @@ import { Injectable } from '@angular/core'; import { CanActivate, Router, ActivatedRoute } from '@angular/router'; // import { SetLanguageComponent } from '../components/set-language.component'; import { LanguageService } from './language.service'; +import { SetLanguageComponent } from '../components/set-language.component'; @Injectable() export class AuthGuard implements CanActivate { - // languageComponent!: SetLanguageComponent; + languageComponent!: SetLanguageComponent; currentLanguageSet: any; constructor( @@ -49,10 +50,10 @@ export class AuthGuard implements CanActivate { // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- - // fetchLanguageResponse() { - // this.languageComponent = new SetLanguageComponent(this.http_service); - // this.languageComponent.setLanguage(); - // this.currentLanguageSet = this.languageComponent.currentLanguageObject; - // } + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } // -----End------ } diff --git a/src/app/app-modules/core/services/beneficiary-details.service.ts b/src/app/app-modules/core/services/beneficiary-details.service.ts index 9db04af..83a3344 100644 --- a/src/app/app-modules/core/services/beneficiary-details.service.ts +++ b/src/app/app-modules/core/services/beneficiary-details.service.ts @@ -39,8 +39,8 @@ export class BeneficiaryDetailsService { .post(url, { beneficiaryRegID: beneficiaryRegID, benFlowID: benFlowID }) .subscribe({ next: (res: any) => { - if (res.json().data) { - this.beneficiaryDetails.next(res.json().data); + if (res.data) { + this.beneficiaryDetails.next(res.data); } }, error: (err) => { diff --git a/src/app/app-modules/core/services/http-interceptor.service.ts b/src/app/app-modules/core/services/http-interceptor.service.ts index a7f8ae2..1404176 100644 --- a/src/app/app-modules/core/services/http-interceptor.service.ts +++ b/src/app/app-modules/core/services/http-interceptor.service.ts @@ -96,59 +96,58 @@ export class HttpInterceptorService implements HttpInterceptor { sessionStorage.clear(); localStorage.clear(); setTimeout(() => this.router.navigate(['/login']), 0); - // this.confirmationService.alert(response.errorMessage, 'error'); + this.confirmationService.alert(response.errorMessage, 'error'); } else { - // this.startTimer(); + this.startTimer(); } } - // startTimer() { - // this.timerRef = setTimeout( - // () => { - // console.log('there', Date()); + startTimer() { + this.timerRef = setTimeout( + () => { + console.log('there', Date()); - // if ( - // sessionStorage.getItem('authenticationToken') && - // sessionStorage.getItem('isAuthenticated') - // ) { - // this.confirmationService - // .alert( - // 'Your session is about to Expire. Do you need more time ? ', - // 'sessionTimeOut', - // ) - // .afterClosed() - // .subscribe((result: any) => { - // if (result.action == 'continue') { - // this.http.post(environment.extendSessionUrl, {}).subscribe( - // (res: any) => {}, - // (err: any) => {}, - // ); - // } - // else if (result.action == 'timeout') { - // clearTimeout(this.timerRef); - // sessionStorage.clear(); - // localStorage.clear(); - // // this.confirmationService.alert( - // // this.currentLanguageSet.sessionExpired, - // // 'error', - // // ); - // this.router.navigate(['/login']); - // } else if (result.action == 'cancel') { - // setTimeout(() => { - // clearTimeout(this.timerRef); - // sessionStorage.clear(); - // localStorage.clear(); - // // this.confirmationService.alert( - // // this.currentLanguageSet.sessionExpired, - // // 'error', - // // ); - // this.router.navigate(['/login']); - // }, result.remainingTime * 1000); - // } - // }); - // } - // }, - // 27 * 60 * 1000, - // ); - // } + if ( + sessionStorage.getItem('authenticationToken') && + sessionStorage.getItem('isAuthenticated') + ) { + this.confirmationService + .alert( + 'Your session is about to Expire. Do you need more time ? ', + 'sessionTimeOut', + ) + .afterClosed() + .subscribe((result: any) => { + if (result.action == 'continue') { + this.http.post(environment.extendSessionUrl, {}).subscribe( + (res: any) => {}, + (err: any) => {}, + ); + } else if (result.action == 'timeout') { + clearTimeout(this.timerRef); + sessionStorage.clear(); + localStorage.clear(); + this.confirmationService.alert( + this.currentLanguageSet.sessionExpired, + 'error', + ); + this.router.navigate(['/login']); + } else if (result.action == 'cancel') { + setTimeout(() => { + clearTimeout(this.timerRef); + sessionStorage.clear(); + localStorage.clear(); + this.confirmationService.alert( + this.currentLanguageSet.sessionExpired, + 'error', + ); + this.router.navigate(['/login']); + }, result.remainingTime * 1000); + } + }); + } + }, + 27 * 60 * 1000, + ); + } } diff --git a/src/app/app-modules/core/services/rx-batchview.service.ts b/src/app/app-modules/core/services/rx-batchview.service.ts index 7f687b0..cea8972 100644 --- a/src/app/app-modules/core/services/rx-batchview.service.ts +++ b/src/app/app-modules/core/services/rx-batchview.service.ts @@ -23,6 +23,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { Injectable, ViewContainerRef, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Observable } from 'rxjs'; +import { RxBatchViewComponent } from '../components/rx-batch-view/rx-batch-view.component'; // import { RxBatchViewComponent } from '../components/rx-batch-view/rx-batch-view.component'; @Injectable() @@ -32,18 +33,18 @@ export class BatchViewService { @Inject(DOCUMENT) doc: any, ) {} - // public batches(prescribed: any, items: any, selection: any): Observable { - // const dialogRef: MatDialogRef = this.dialog.open( - // RxBatchViewComponent, - // { - // width: '80%', - // disableClose: false, - // }, - // ); - // dialogRef.componentInstance.prescribed = prescribed; - // dialogRef.componentInstance.items = items; - // dialogRef.componentInstance.editSelection = selection; + public batches(prescribed: any, items: any, selection: any): Observable { + const dialogRef: MatDialogRef = this.dialog.open( + RxBatchViewComponent, + { + width: '80%', + disableClose: false, + }, + ); + dialogRef.componentInstance.prescribed = prescribed; + dialogRef.componentInstance.items = items; + dialogRef.componentInstance.editSelection = selection; - // return dialogRef.afterClosed(); - // } + return dialogRef.afterClosed(); + } } diff --git a/src/app/app-modules/inventory/dashboard/dashboard.component.css b/src/app/app-modules/inventory/dashboard/dashboard.component.css new file mode 100644 index 0000000..75ef38a --- /dev/null +++ b/src/app/app-modules/inventory/dashboard/dashboard.component.css @@ -0,0 +1,3 @@ +.content { + /* height: stretch; */ +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/dashboard/dashboard.component.html b/src/app/app-modules/inventory/dashboard/dashboard.component.html new file mode 100644 index 0000000..31b120d --- /dev/null +++ b/src/app/app-modules/inventory/dashboard/dashboard.component.html @@ -0,0 +1,5 @@ + +
+ +
+ diff --git a/src/app/app-modules/inventory/dashboard/dashboard.component.spec.ts b/src/app/app-modules/inventory/dashboard/dashboard.component.spec.ts new file mode 100644 index 0000000..ac3b27d --- /dev/null +++ b/src/app/app-modules/inventory/dashboard/dashboard.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + let component: DashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DashboardComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/dashboard/dashboard.component.ts b/src/app/app-modules/inventory/dashboard/dashboard.component.ts new file mode 100644 index 0000000..dc2c6a4 --- /dev/null +++ b/src/app/app-modules/inventory/dashboard/dashboard.component.ts @@ -0,0 +1,31 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.css'], +}) +export class DashboardComponent { + constructor() {} +} diff --git a/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.css b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.css new file mode 100644 index 0000000..7044e5d --- /dev/null +++ b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.css @@ -0,0 +1,54 @@ +@media print { + body { + background: white; + font-size: 14px; + } + .non-printable { + display: none; + } + .page-break { + page-break-after: always; + } + @page { + margin: 1.3cm; + } +} + +.table-no-border tr, th, .table-no-border tr td, .table-no-border thead tr th, .table-no-border tbody tr th, .table-no-border tbody tr td { + border: none; +} + +#logo { + width: 90px; +} + +.container { + background: white; + padding-top: 10px; +} + +.bg-unset{ + background: unset; +} + +.example-fab.mat-mini-fab { + position: fixed; + right: 20px; + z-index: 3; +} + +.upward { + bottom: 30px; +} + +.print { + bottom: 80px; +} + +.back { + bottom: 130px; +} + +.select { + bottom: 180px; +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.html b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.html new file mode 100644 index 0000000..02f7401 --- /dev/null +++ b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.html @@ -0,0 +1,98 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.date }} : {{ today | date: "dd/MM/yyyy" }} +

+
+
+ +
+
+ +
+
+

+ {{ currentLanguageSet?.inventory?.facilityName }} : {{ headerDetail?.facilityName }} +

+
+
+

+ {{ currentLanguageSet?.inventory?.dispenseType }} : + {{ headerDetail?.issueType }} +

+
+
+ + +
+
+

{{ title?.headerTitle }}

+
+
+ + + + + + + + + + + + + + + +
+ {{ column?.columnName }} + + {{ headerDetail[column?.keyName] }} +
{{ column?.columnName }}{{ headerDetail[column?.keyName] }}
+
+
+ +
+
+ + + + + + + +
{{ column.columnName }}{{ data[column.keyName] }}
+
+
+
+ +
+
+ + +
+
diff --git a/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.spec.ts b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.spec.ts new file mode 100644 index 0000000..752ea03 --- /dev/null +++ b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DynamicPrintComponent } from './dynamic-print.component'; + +describe('DynamicPrintComponent', () => { + let component: DynamicPrintComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DynamicPrintComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DynamicPrintComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.ts b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.ts new file mode 100644 index 0000000..1f3f973 --- /dev/null +++ b/src/app/app-modules/inventory/dynamic-print/dynamic-print.component.ts @@ -0,0 +1,91 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; +import { Location } from '@angular/common'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { LanguageService } from '../../core/services/language.service'; +import { DataStorageService } from '../shared/service/data-storage.service'; + +@Component({ + selector: 'app-dynamic-print', + templateUrl: './dynamic-print.component.html', + styleUrls: ['./dynamic-print.component.css'], +}) +export class DynamicPrintComponent implements OnInit, DoCheck { + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private dataStorageService: DataStorageService, + private router: Router, + private http_service: LanguageService, + private route: ActivatedRoute, + private location: Location, + ) {} + + printableData: any; + columnList: any = []; + fieldData: any = []; + headerColumn: any = []; + headerDetail: any; + facilityDetail: any; + title: any; + today!: Date; + + ngOnInit() { + this.today = new Date(); + this.fetchLanguageResponse(); + const dataStore = this.route.snapshot.params['printablePage']; + // this.printableData = this.dataStorageService[dataStore]; + console.log('printableData', JSON.stringify(this.printableData, null, 4)); + this.title = this.printableData.title; + this.headerDetail = this.printableData.headerDetail; + this.columnList = this.printableData.columns; + this.fieldData = this.printableData.printableData; + this.headerColumn = this.printableData.headerColumn; + } + + goBack() { + this.location.back(); + } + + downloadList() { + window.print(); + } + + goToTop() { + window.scrollTo(0, 0); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/inventory-routing.module.ts b/src/app/app-modules/inventory/inventory-routing.module.ts new file mode 100644 index 0000000..bbe4746 --- /dev/null +++ b/src/app/app-modules/inventory/inventory-routing.module.ts @@ -0,0 +1,236 @@ +/* * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +// import { NgModule } from '@angular/core'; +// import { Routes, RouterModule } from '@angular/router'; +// import { DashboardComponent } from './dashboard/dashboard.component'; +// import { WorkareaComponent } from './workarea/workarea.component'; +// import { DynamicPrintComponent } from './dynamic-print/dynamic-print.component'; +// import { MedicineDispenseComponent } from './medicine-dispense/medicine-dispense.component'; +// import { PhysicalStockEntryComponent } from './physical-stock-entry/physical-stock-entry.component'; +// import { StoreStockAdjustmentComponent } from './store-stock-adjustment/store-stock-adjustment.component'; +// import { StoreSelfConsumptionComponent } from './store-self-consumption/store-self-consumption.component'; +// import { StoreStockTransferComponent } from './store-stock-transfer/store-stock-transfer.component'; +// import { PatientReturnComponent } from './patient-return/patient-return.component'; +// import { ViewPhysicalStockComponent } from './physical-stock-entry/view-physical-stock/view-physical-stock.component'; +// import { ViewStoreStockAdjustmentComponent } from './store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component'; +// import { ViewStoreStockAdjustmentDraftComponent } from './store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component'; +// import { ViewStoreSelfConsumptionComponent } from './store-self-consumption/view-store-self-consumption/view-store-self-consumption.component'; +// import { ViewStoreStockTransferComponent } from './store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component'; +// import { ViewMedicineDispenseComponent } from './medicine-dispense/view-medicine-dispense/view-medicine-dispense.component'; +// import { PatientReturnPreviousRecordComponent } from './patient-return/patient-return-previous-record/patient-return-previous-record.component'; +// import { TransitReportComponent } from './reports/transit-report/transit-report.component'; +// import { ShortExpiryReportComponent } from './reports/short-expiry-report/short-expiry-report.component'; +// import { YearlyReportComponent } from './reports/yearly-report/yearly-report.component'; +// import { MonthlyReportComponent } from './reports/monthly-report/monthly-report.component'; +// import { DailyStockSummaryReportComponent } from './reports/daily-stock-summary-report/daily-stock-summary-report.component'; +// import { DailyStockDetailsReportComponent } from './reports/daily-stock-details-report/daily-stock-details-report.component'; +// import { BeneficiaryDrugIssueReportComponent } from './reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component'; +// import { ExpiryReportComponent } from './reports/expiry-report/expiry-report.component'; +// import { ConsumptionReportComponent } from './reports/consumption-report/consumption-report.component'; +// import { InwardStockReportComponent } from './reports/inward-stock-report/inward-stock-report.component'; +// import { IndentRequestComponent } from './indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component'; +// import { IndentDispensesComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/indent-dispenses.component'; +// import { SubStoreIndentOrderWorklistComponent } from './indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component'; +// import { MainStoreIndentOrderWorklistComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component'; +// import { IndentOrderWorklistComponent } from './indent/indent-order-worklist/indent-order-worklist.component'; + +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { DashboardComponent } from "./dashboard/dashboard.component"; +import { WorkareaComponent } from "./workarea/workarea.component"; +import { PhysicalStockEntryComponent } from "./physical-stock-entry/physical-stock-entry.component"; +import { ViewPhysicalStockComponent } from "./physical-stock-entry/view-physical-stock/view-physical-stock.component"; +import { StoreStockAdjustmentComponent } from "./store-stock-adjustment/store-stock-adjustment.component"; +import { ViewStoreStockAdjustmentDraftComponent } from "./store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component"; +import { ViewStoreStockAdjustmentComponent } from "./store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component"; +import { StoreSelfConsumptionComponent } from "./store-self-consumption/store-self-consumption.component"; +import { ViewStoreSelfConsumptionComponent } from "./store-self-consumption/view-store-self-consumption/view-store-self-consumption.component"; +import { StoreStockTransferComponent } from "./store-stock-transfer/store-stock-transfer.component"; +import { ViewStoreStockTransferComponent } from "./store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component"; +import { PatientReturnComponent } from "./patient-return/patient-return.component"; +import { PatientReturnPreviousRecordComponent } from "./patient-return/patient-return-previous-record/patient-return-previous-record.component"; +import { MedicineDispenseComponent } from "./medicine-dispense/medicine-dispense.component"; +import { ViewMedicineDispenseComponent } from "./medicine-dispense/view-medicine-dispense/view-medicine-dispense.component"; +import { DynamicPrintComponent } from "./dynamic-print/dynamic-print.component"; +import { InwardStockReportComponent } from "./reports/inward-stock-report/inward-stock-report.component"; +import { ConsumptionReportComponent } from "./reports/consumption-report/consumption-report.component"; +import { ExpiryReportComponent } from "./reports/expiry-report/expiry-report.component"; +import { BeneficiaryDrugIssueReportComponent } from "./reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component"; +import { DailyStockDetailsReportComponent } from "./reports/daily-stock-details-report/daily-stock-details-report.component"; +import { DailyStockSummaryReportComponent } from "./reports/daily-stock-summary-report/daily-stock-summary-report.component"; +import { MonthlyReportComponent } from "./reports/monthly-report/monthly-report.component"; +import { YearlyReportComponent } from "./reports/yearly-report/yearly-report.component"; +import { ShortExpiryReportComponent } from "./reports/short-expiry-report/short-expiry-report.component"; +import { TransitReportComponent } from "./reports/transit-report/transit-report.component"; +import { EAushadhaComponent } from "./physical-stock-entry/e-aushadha/e-aushadha.component"; + +const routes: Routes = [ + { + path: '', + component: DashboardComponent, + children: [ + { + path: '', + redirectTo: 'dashboard', + pathMatch: 'full', + }, + { + path: 'dashboard', + component: WorkareaComponent, + }, + { + path: 'medicineDispense', + component: MedicineDispenseComponent, + }, + { + path: 'medicineDispense/View', + component: ViewMedicineDispenseComponent, + }, + { + path: 'storeSelfConsumption', + component: StoreSelfConsumptionComponent, + }, + { + path: 'storeSelfConsumption/View', + component: ViewStoreSelfConsumptionComponent, + }, + { + path: 'physicalStockEntry', + component: PhysicalStockEntryComponent, + }, + { + path: 'physicalStockEntry/View', + component: ViewPhysicalStockComponent, + }, + { + path: 'storeStockTransfer', + component: StoreStockTransferComponent, + }, + { + path: 'storeStockTransfer/View', + component: ViewStoreStockTransferComponent, + }, + { + path: 'storeStockAdjustment', + component: StoreStockAdjustmentComponent, + }, + { + path: 'storeStockAdjustment/update/:draftID', + component: StoreStockAdjustmentComponent, + }, + { + path: 'storeStockAdjustment/view', + component: ViewStoreStockAdjustmentComponent, + }, + { + path: 'storeStockAdjustmentDraft/view', + component: ViewStoreStockAdjustmentDraftComponent, + }, + { + path: 'patientReturn', + component: PatientReturnComponent, + }, + { + path: 'patientReturn/previousRecord', + component: PatientReturnPreviousRecordComponent, + }, + // { + // path: 'indentOrderWorklist', + // component: IndentOrderWorklistComponent, + // }, + // { + // path: 'mainStoreIndentOrderWorklist', + // component: MainStoreIndentOrderWorklistComponent, + // }, + // { + // path: 'subStoreIndentOrderWorklist', + // component: SubStoreIndentOrderWorklistComponent, + // }, + // { + // path: 'mainStoreIndentDispenses/:toFacilityID/:indentID', + // component: IndentDispensesComponent, + // }, + // { + // path: 'indentRequest', + // component: IndentRequestComponent, + // }, + // { + // path: 'indentRequest/:indentID/:fromFacilityID', + // component: IndentRequestComponent, + // }, + + { + path: 'inwardStockReport', + component: InwardStockReportComponent, + }, + { + path: 'consumptionReport', + component: ConsumptionReportComponent, + }, + { + path: 'expiryReport', + component: ExpiryReportComponent, + }, + { + path: 'beneficiaryDrugIssueReport', + component: BeneficiaryDrugIssueReportComponent, + }, + { + path: 'dailyStockReportDetails', + component: DailyStockDetailsReportComponent, + }, + { + path: 'dailyStockReportSummary', + component: DailyStockSummaryReportComponent, + }, + { + path: 'monthlyReport', + component: MonthlyReportComponent, + }, + { + path: 'yearlyReport', + component: YearlyReportComponent, + }, + { + path: 'shortExpiryReport', + component: ShortExpiryReportComponent, + }, + { + path: 'transitReport', + component: TransitReportComponent, + }, + { + path: 'physicalStockEntry/e-Aushadha', + component:EAushadhaComponent, + } + ], + }, + { + path: 'dynamicPrint/:printablePage', + component: DynamicPrintComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class InventoryRoutingModule {} diff --git a/src/app/app-modules/inventory/inventory.module.ts b/src/app/app-modules/inventory/inventory.module.ts new file mode 100644 index 0000000..57408d4 --- /dev/null +++ b/src/app/app-modules/inventory/inventory.module.ts @@ -0,0 +1,251 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +// import { NgModule } from '@angular/core'; +// import { CommonModule } from '@angular/common'; +// import { ReactiveFormsModule, FormsModule } from '@angular/forms'; +// import { CoreModule } from '../core/core.module'; +// import { MaterialModule } from '../core/material.module'; +// import { MatFormFieldModule } from '@angular/material/form-field'; +// import { MatInputModule } from '@angular/material/input'; +// import { MatTableModule } from '@angular/material/table'; +// import { MatTooltipModule } from '@angular/material/tooltip'; +// import { MatMenuModule } from '@angular/material/menu'; +// import { MatIconModule } from '@angular/material/icon'; +// import { MatButtonModule } from '@angular/material/button'; +// import { MatCardModule } from '@angular/material/card'; +// import { MatRadioModule } from '@angular/material/radio'; +// import { MatDatepickerModule } from '@angular/material/datepicker'; +// import { MatListModule } from '@angular/material/list'; +// import { MatSelectModule } from '@angular/material/select'; +// import { MatProgressBarModule } from '@angular/material/progress-bar'; +// import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +// import { MatDialogModule } from '@angular/material/dialog'; +// import { WorkareaComponent } from './workarea/workarea.component'; +// import { DynamicPrintComponent } from './dynamic-print/dynamic-print.component'; +// import { DataStorageService } from './shared/service/data-storage.service'; +// import { InventoryMasterService } from './shared/service/inventory-master.service'; +// import { InventoryService } from './shared/service/inventory.service'; +// import { MedicineDispenseComponent } from './medicine-dispense/medicine-dispense.component'; +// import { PhysicalStockEntryComponent } from './physical-stock-entry/physical-stock-entry.component'; +// import { StoreStockAdjustmentComponent } from './store-stock-adjustment/store-stock-adjustment.component'; +// import { StoreSelfConsumptionComponent } from './store-self-consumption/store-self-consumption.component'; +// import { StoreStockTransferComponent } from './store-stock-transfer/store-stock-transfer.component'; +// import { PatientReturnComponent } from './patient-return/patient-return.component'; +// import { BenificiaryDetailsComponent } from './patient-return/benificiary-details/benificiary-details.component'; +// import { ItemBatchDetailsForPatientReturnComponent } from './patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component'; +// import { PatientReturnBatchDetailsComponent } from './patient-return/patient-return-batch-details/patient-return-batch-details.component'; +// import { ViewPhysicalStockComponent } from './physical-stock-entry/view-physical-stock/view-physical-stock.component'; +// import { ViewPhysicalStockDetailsComponent } from './physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component'; +// import { ViewStockAdjustmentDetailsComponent } from './store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component'; +// import { ViewStockAdjustmentDraftDetailsComponent } from './store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component'; +// import { InventoryRoutingModule } from './inventory-routing.module'; +// import { DashboardComponent } from './dashboard/dashboard.component'; +// import { ViewStoreStockAdjustmentComponent } from './store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component'; +// import { ViewStoreStockAdjustmentDraftComponent } from './store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component'; +// import { ViewStoreSelfConsumptionComponent } from './store-self-consumption/view-store-self-consumption/view-store-self-consumption.component'; +// import { ViewStoreSelfConsumptionDetailsComponent } from './store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component'; +// import { ViewStoreStockTransferComponent } from './store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component'; +// import { ViewStoreStockTransferDetailsComponent } from './store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component'; +// import { ManualMedicineDispenseComponent } from './medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component'; +// import { SelectBatchComponent } from './medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component'; +// import { SystemMedicineDispenseComponent } from './medicine-dispense/system-medicine-dispense/system-medicine-dispense.component'; +// import { ShowBatchItemComponent } from './medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component'; +// import { ViewMedicineDispenseComponent } from './medicine-dispense/view-medicine-dispense/view-medicine-dispense.component'; +// import { ViewMedicineDispenseDetailsComponent } from './medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component'; +// import { PatientReturnPreviousRecordComponent } from './patient-return/patient-return-previous-record/patient-return-previous-record.component'; +// import { MatPaginatorModule } from '@angular/material/paginator'; +// import { IndentOrderWorklistComponent } from './indent/indent-order-worklist/indent-order-worklist.component'; +// import { IndentRequestComponent } from './indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component'; +// import { MainStoreIndentOrderWorklistComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component'; +// import { SubStoreIndentOrderWorklistComponent } from './indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component'; +// import { IndentDispensesComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/indent-dispenses.component'; +// import { SubStoreItemModelComponent } from './indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component'; +// import { MainStoreItemModelComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/main-store-item-model/main-store-item-model.component'; +// import { SelectBatchForIndentItemComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component'; +// import { ManualIndentDispenseComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component'; +// import { SystemIndentDispenseComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/system-indent-dispense.component'; +// import { ShowIndentBatchDetailsComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/show-indent-batch-details/show-indent-batch-details.component'; +// import { UtcDatePipe } from './utc-date.pipe'; +// import { InwardStockReportComponent } from './reports/inward-stock-report/inward-stock-report.component'; +// import { ConsumptionReportComponent } from './reports/consumption-report/consumption-report.component'; +// import { ExpiryReportComponent } from './reports/expiry-report/expiry-report.component'; +// import { BeneficiaryDrugIssueReportComponent } from './reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component'; +// import { DailyStockDetailsReportComponent } from './reports/daily-stock-details-report/daily-stock-details-report.component'; +// import { DailyStockSummaryReportComponent } from './reports/daily-stock-summary-report/daily-stock-summary-report.component'; +// import { MonthlyReportComponent } from './reports/monthly-report/monthly-report.component'; +// import { YearlyReportComponent } from './reports/yearly-report/yearly-report.component'; +// import { RejectItemFromMainstoreModelComponent } from './indent/indent-order-worklist/main-store-indent-order-worklist/reject-item-from-mainstore-model/reject-item-from-mainstore-model.component'; +// import { ShortExpiryReportComponent } from './reports/short-expiry-report/short-expiry-report.component'; +// import { TransitReportComponent } from './reports/transit-report/transit-report.component'; + +import { CommonModule } from "@angular/common"; +import { CoreModule } from "../core/core.module"; +import { InventoryRoutingModule } from "./inventory-routing.module"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MaterialModule } from "../core/material.module"; +import { MatDialogModule } from "@angular/material/dialog"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { NgModule } from "@angular/core"; +import { MatInputModule } from "@angular/material/input"; +import { MatTableModule } from "@angular/material/table"; +import { MatTooltipModule } from "@angular/material/tooltip"; +import { MatMenuModule } from "@angular/material/menu"; +import { MatIconModule } from "@angular/material/icon"; +import { MatButtonModule } from "@angular/material/button"; +import { MatCardModule } from "@angular/material/card"; +import { MatRadioModule } from "@angular/material/radio"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatListModule } from "@angular/material/list"; +import { MatSelectModule } from "@angular/material/select"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatPaginatorModule } from "@angular/material/paginator"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { UtcDatePipe } from "./utc-date.pipe"; +import { DashboardComponent } from "./dashboard/dashboard.component"; +import { WorkareaComponent } from "./workarea/workarea.component"; +import { DataStorageService } from "./shared/service/data-storage.service"; +import { InventoryMasterService } from "./shared/service/inventory-master.service"; +import { InventoryService } from "./shared/service/inventory.service"; +import { PhysicalStockEntryComponent } from "./physical-stock-entry/physical-stock-entry.component"; +import { ViewPhysicalStockComponent } from "./physical-stock-entry/view-physical-stock/view-physical-stock.component"; +import { ViewPhysicalStockDetailsComponent } from "./physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component"; +import { StoreStockAdjustmentComponent } from "./store-stock-adjustment/store-stock-adjustment.component"; +import { ViewStoreStockAdjustmentDraftComponent } from "./store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component"; +import { ViewStoreStockAdjustmentComponent } from "./store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component"; +import { ViewStockAdjustmentDraftDetailsComponent } from "./store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component"; +import { ViewStockAdjustmentDetailsComponent } from "./store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component"; +import { StoreSelfConsumptionComponent } from "./store-self-consumption/store-self-consumption.component"; +import { ViewStoreSelfConsumptionComponent } from "./store-self-consumption/view-store-self-consumption/view-store-self-consumption.component"; +import { ViewStoreSelfConsumptionDetailsComponent } from "./store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component"; +import { StoreStockTransferComponent } from "./store-stock-transfer/store-stock-transfer.component"; +import { ViewStoreStockTransferComponent } from "./store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component"; +import { ViewStoreStockTransferDetailsComponent } from "./store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component"; +import { PatientReturnComponent } from "./patient-return/patient-return.component"; +import { PatientReturnPreviousRecordComponent } from "./patient-return/patient-return-previous-record/patient-return-previous-record.component"; +import { PatientReturnBatchDetailsComponent } from "./patient-return/patient-return-batch-details/patient-return-batch-details.component"; +import { ItemBatchDetailsForPatientReturnComponent } from "./patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component"; +import { BenificiaryDetailsComponent } from "./patient-return/benificiary-details/benificiary-details.component"; +import { MedicineDispenseComponent } from "./medicine-dispense/medicine-dispense.component"; +import { ViewMedicineDispenseComponent } from "./medicine-dispense/view-medicine-dispense/view-medicine-dispense.component"; +import { ViewMedicineDispenseDetailsComponent } from "./medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component"; +import { SystemMedicineDispenseComponent } from "./medicine-dispense/system-medicine-dispense/system-medicine-dispense.component"; +import { ShowBatchItemComponent } from "./medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component"; +import { ManualMedicineDispenseComponent } from "./medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component"; +import { SelectBatchComponent } from "./medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component"; +import { DynamicPrintComponent } from "./dynamic-print/dynamic-print.component"; +import { InwardStockReportComponent } from "./reports/inward-stock-report/inward-stock-report.component"; +import { ConsumptionReportComponent } from "./reports/consumption-report/consumption-report.component"; +import { ExpiryReportComponent } from "./reports/expiry-report/expiry-report.component"; +import { BeneficiaryDrugIssueReportComponent } from "./reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component"; +import { DailyStockDetailsReportComponent } from "./reports/daily-stock-details-report/daily-stock-details-report.component"; +import { DailyStockSummaryReportComponent } from "./reports/daily-stock-summary-report/daily-stock-summary-report.component"; +import { MonthlyReportComponent } from "./reports/monthly-report/monthly-report.component"; +import { YearlyReportComponent } from "./reports/yearly-report/yearly-report.component"; +import { ShortExpiryReportComponent } from "./reports/short-expiry-report/short-expiry-report.component"; +import { TransitReportComponent } from "./reports/transit-report/transit-report.component"; +import { EAushadhaComponent } from "./physical-stock-entry/e-aushadha/e-aushadha.component"; + +@NgModule({ + imports: [ + CommonModule, + CoreModule, + InventoryRoutingModule, + ReactiveFormsModule, + FormsModule, + MaterialModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + MatTableModule, + MatTooltipModule, + MatMenuModule, + MatIconModule, + MatButtonModule, + MatCardModule, + MatRadioModule, + MatDatepickerModule, + MatListModule, + MatSelectModule, + MatProgressBarModule, + MatPaginatorModule, + MatProgressSpinnerModule, + ], + declarations: [ + DashboardComponent, + WorkareaComponent, + MedicineDispenseComponent, + ManualMedicineDispenseComponent, + SystemMedicineDispenseComponent, + SelectBatchComponent, + PhysicalStockEntryComponent, + StoreSelfConsumptionComponent, + StoreStockTransferComponent, + ViewStoreSelfConsumptionComponent, + ViewStoreSelfConsumptionDetailsComponent, + ViewPhysicalStockComponent, + ViewPhysicalStockDetailsComponent, + ViewMedicineDispenseComponent, + ViewMedicineDispenseDetailsComponent, + ViewStoreStockTransferComponent, + ViewStoreStockTransferDetailsComponent, + ShowBatchItemComponent, + DynamicPrintComponent, + StoreStockAdjustmentComponent, + ViewStoreStockAdjustmentComponent, + ViewStoreStockAdjustmentDraftComponent, + ViewStockAdjustmentDraftDetailsComponent, + ViewStockAdjustmentDetailsComponent, + PatientReturnComponent, + PatientReturnBatchDetailsComponent, + BenificiaryDetailsComponent, + // IndentOrderWorklistComponent, + // IndentRequestComponent, + ItemBatchDetailsForPatientReturnComponent, + // MainStoreIndentOrderWorklistComponent, + // SubStoreIndentOrderWorklistComponent, + // IndentDispensesComponent, + // SubStoreItemModelComponent, + // MainStoreItemModelComponent, + // SelectBatchForIndentItemComponent, + // ManualIndentDispenseComponent, + // SystemIndentDispenseComponent, + // ShowIndentBatchDetailsComponent, + UtcDatePipe, + InwardStockReportComponent, + ConsumptionReportComponent, + ExpiryReportComponent, + BeneficiaryDrugIssueReportComponent, + DailyStockDetailsReportComponent, + DailyStockSummaryReportComponent, + MonthlyReportComponent, + YearlyReportComponent, + // RejectItemFromMainstoreModelComponent, + PatientReturnPreviousRecordComponent, + ShortExpiryReportComponent, + TransitReportComponent, + EAushadhaComponent + ], + providers: [ + InventoryService, InventoryMasterService, DataStorageService + ], +}) +export class InventoryModule {} diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.css b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.css new file mode 100644 index 0000000..7d30302 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.css @@ -0,0 +1,40 @@ +.input-full-width { + width: 100%; +} + +.width-percent-5 { + width: 5% +} + +.width-percent-10 { + width: 10% +} + +.inner_table { + margin-bottom: 0px; +} + +.noPadding { + padding: 0px; +} + +.width-percent-25 { + width: 25%; +} + +.m-r-5 { + margin-right: 5px; +} + +.box { + height: 70px; +} + +.search-btn { + cursor: pointer; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.html b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.html new file mode 100644 index 0000000..cd148d2 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.html @@ -0,0 +1,264 @@ +
+
+
+
+ + + search + +
+
+ + + +
+
+
+ +
+
+

{{ currentLanguageSet?.inventory?.dispensingItem }}

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.item }} + + {{ element.itemName }} + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + {{ element.quantityInHand }} + + {{ currentLanguageSet?.itemDispense?.quantityDispensed }} + + {{ element.quantityDispensed }} + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + + + +
{{ x.batchNo }}
+
+ {{ currentLanguageSet?.inventory?.quantityOnHand }} + + + + + +
{{ x.quantityInHand }}
+
+ {{ currentLanguageSet?.itemDispense?.expiryDate }} + + + + + +
{{ x.expiryDate | date: "dd/MM/yyyy" }}
+
+ {{ currentLanguageSet?.itemDispense?.quantityDispensed }} + + + + + +
{{ x }}
+
+ {{ currentLanguageSet?.bendetails?.edit }} + + + + {{ currentLanguageSet?.inventory?.delete }} + + delete +
+
+
+
+ +
+
+ + +
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.spec.ts new file mode 100644 index 0000000..5b2960b --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManualMedicineDispenseComponent } from './manual-medicine-dispense.component'; + +describe('ManualMedicineDispenseComponent', () => { + let component: ManualMedicineDispenseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ManualMedicineDispenseComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ManualMedicineDispenseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts new file mode 100644 index 0000000..088ff68 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts @@ -0,0 +1,417 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Input, + Output, + EventEmitter, + OnChanges, + DoCheck, +} from '@angular/core'; +import { FormBuilder, FormGroup, FormControl, FormArray } from '@angular/forms'; +import { InventoryService } from './../../shared/service/inventory.service'; +import { SelectBatchComponent } from './select-batch/select-batch.component'; +import { ConfirmationService } from './../../../core/services/confirmation.service'; +import { DataStorageService } from './../../shared/service/data-storage.service'; +import { Router } from '@angular/router'; +import * as moment from 'moment'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatTableDataSource } from '@angular/material/table'; +@Component({ + selector: 'app-manual-medicine-dispense', + templateUrl: './manual-medicine-dispense.component.html', + styleUrls: ['./manual-medicine-dispense.component.css'], +}) +export class ManualMedicineDispenseComponent implements OnInit, DoCheck { + @Input() + beneficaryDetail: any; + + app: any; + + @Output() resetBeneficiaryDetail: EventEmitter = new EventEmitter(); + + manualItemDispenseForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + manualDispenseList = new MatTableDataSource(); + dataSource = new MatTableDataSource(); + batchNumberDataList: any = []; + otherData: any = []; + displayedColumns: string[] = [ + 'SNo', + 'itemName', + 'quantityInHand', + 'quantityDispensed', + 'batchNo', + 'quantityOnBatch', + 'expiryDate', + 'quantityOfDispense', + 'edit', + 'delete', + ]; + + constructor( + private fb: FormBuilder, + private dialog: MatDialog, + private router: Router, + public http_service: LanguageService, + private confirmationService: ConfirmationService, + private dataStorageService: DataStorageService, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.app = this.getApp(); + this.manualItemDispenseForm = this.initManualDispenseForm(); + this.subscribeToFormChange(); + this.fetchLanguageResponse(); + } + + subscribeToFormChange() { + this.manualItemDispenseForm.controls['itemID'].valueChanges.subscribe( + (value) => { + if (value) + setTimeout(() => { + this.selectBatch(); + }, 0); + }, + ); + } + getApp() { + console.log(sessionStorage.getItem('host')); + if (sessionStorage.getItem('host')) { + return sessionStorage.getItem('host'); + } else { + return 'STORE'; + } + } + resetDependent() { + this.manualItemDispenseForm.patchValue({ + itemID: null, + quantityInHand: null, + quantityDispensed: null, + }); + } + + initManualDispenseForm(): FormGroup { + return this.fb.group({ + itemName: null, + itemID: null, + quantityInHand: null, + quantityDispensed: null, + batchList: new FormArray([]), + }); + } + + initBatchForm(): FormGroup { + return this.fb.group({ + batchNo: null, + quantityOnBatch: null, + expiryDate: null, + entryDate: null, + quantityOfDispense: null, + }); + } + + get quantityInHand() { + return this.manualItemDispenseForm.controls['quantityInHand'].value; + } + + // manualDispenseList: any = []; + // manualDispenseList = new MatTableDataSource(); + + selectBatch() { + const batchList = ( + this.manualItemDispenseForm.controls['batchList'] + ); + const batchListLength = batchList.length; + if (batchList && batchListLength > 0) { + for (let j = 0; j <= batchListLength; j++) { + batchList.removeAt(0); + } + this.getItemBatchList(null, this.manualItemDispenseForm.value); + } else { + this.getItemBatchList(null, this.manualItemDispenseForm.value); + } + } + + getItemBatchList(editIndex: any, formValue: any) { + let itemBatchList = []; + const requestObjectGetBatchList = { + facilityID: localStorage.getItem('facilityID'), + itemID: formValue.itemID, + }; + this.inventoryService.getItemBatchList(requestObjectGetBatchList).subscribe( + (response) => { + if (response.statusCode == 200) { + if (response.data.length > 0) { + itemBatchList = response.data; + this.openModalTOSelectBatch(editIndex, formValue, itemBatchList); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.noBatchavailableforthisItem, + ); + } + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + + openModalTOSelectBatch(editIndex: any, formValue: any, itemBatchList: any) { + const mdDialogRef: MatDialogRef = this.dialog.open( + SelectBatchComponent, + { + data: { + batchList: itemBatchList, + editBatch: formValue, + editIndex: editIndex, + }, + panelClass: 'fit-screen', + disableClose: false, + }, + ); + mdDialogRef.afterClosed().subscribe((result: any) => { + if (result) { + console.log("result['batchList']", result.value['batchList']); + if (editIndex != null) { + this.manualDispenseList.data.splice(editIndex, 1); + this.manualDispenseList.data.push(result.value); + this.manualItemDispenseForm.reset(); + } else { + this.manualDispenseList.data.push(result.value); + this.manualDispenseList.data.forEach((item: any) => { + this.manualDispenseList.data[0].batchList.forEach((item: any) => { + this.batchNumberDataList.push(item.batchNo); + this.otherData.push(item.quantityOfDispense); + }); + this.manualDispenseList.data.forEach((element: any) => { + element['batchNo'] = this.batchNumberDataList; + element['quantityOfDispense'] = this.otherData; + }); + }); + this.manualItemDispenseForm.reset(); + } + } + }); + } + + removeManualDispenseItem(i: any) { + this.manualDispenseList.data.splice(i, 1); + } + + editItem(item: any, i: any) { + this.getItemBatchList(i, item); + } + + stockExitList: any = []; + createStockExitList() { + this.manualDispenseList.data.forEach((dispenseItem: any) => { + dispenseItem.batchList.forEach((batch: any) => { + const dispensedItem = { + createdBy: localStorage.getItem('userID'), + itemID: batch.batchNo.itemID, + itemStockEntryID: batch.batchNo.itemStockEntryID, + quantity: batch.quantityOfDispense, + }; + this.stockExitList.push(dispensedItem); + }); + }); + const dispensingItem = Object.assign( + {}, + { issuedBy: this.app }, + this.beneficaryDetail, + { itemStockExit: this.stockExitList }, + { + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + }, + ); + return dispensingItem; + } + save(print: any) { + this.saveItem(print); + } + saveItem(print: any) { + const dispensingItem = this.createStockExitList(); + console.log('dispensingItem', dispensingItem); + this.inventoryService.saveStockExit(dispensingItem).subscribe( + (response) => { + if (response.statusCode == 200) { + if (print) { + this.saveAndPrintPage(); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.manualDispenseList.data = []; + this.manualItemDispenseForm.reset(); + this.resetBeneficiaryDetails(); + } + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + + resetBeneficiaryDetails() { + console.log('event', event); + this.resetBeneficiaryDetail.emit(); + } + + createPrintableData() { + const printableData: any = []; + let i = 0; + this.manualDispenseList.data.forEach((dispenseItem: any) => { + dispenseItem.batchList.forEach((batch: any) => { + console.log('batch', batch); + i = i + 1; + const dispensedItem = { + sNo: i, + itemName: dispenseItem.itemName, + batchNo: batch.batchNo.batchNo, + expiryDate: moment(batch.expiryDate).format('DD-MM-YYYY'), + qod: batch.quantityOfDispense, + }; + printableData.push(dispensedItem); + }); + }); + const beneficaryDetail = Object.assign( + { + visitedDate: moment(this.beneficaryDetail.visitDate).format( + 'DD-MM-YYYY', + ), + }, + this.beneficaryDetail, + ); + console.log('beneficaryDetail', JSON.stringify(beneficaryDetail, null, 4)); + + const manualDispenseItem = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: beneficaryDetail }, + { columns: this.columns }, + { printableData: printableData }, + ); + return manualDispenseItem; + } + + title = { + modalTitle: 'Manual Dispense', + headerTitle: 'Dispense Detail', + tableTitle: 'Dispensed Item', + }; + + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchNo', + columnName: 'Batch No', + }, + { + keyName: 'expiryDate', + columnName: 'Expiry Date', + }, + { + keyName: 'qod', + columnName: 'Qty dispensed', + }, + ]; + + headerColumn = [ + { + columnName: 'Name :', + keyName: 'patientName', + }, + { + columnName: 'Beneficiary ID :', + keyName: 'beneficiaryID', + }, + { + columnName: 'Gender :', + keyName: 'gender', + }, + { + columnName: 'Age :', + keyName: 'age', + }, + { + columnName: 'Visit ID :', + keyName: 'visitID', + }, + { + columnName: 'Visit Date :', + keyName: 'visitedDate', + }, + { + columnName: 'Doctor Name :', + keyName: 'doctorName', + }, + { + columnName: 'Issued By :', + keyName: 'createdBy', + }, + { + columnName: 'Reference :', + keyName: 'reference', + }, + ]; + + saveAndPrintPage() { + const manualDispenseItem = this.createPrintableData(); + this.dataStorageService.manualDispenseItem = manualDispenseItem; + const uRL = 'manualDispenseItem'; + this.router.navigate(['/inventory/dynamicPrint/', uRL]); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.css b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.css new file mode 100644 index 0000000..0b443dd --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.css @@ -0,0 +1,63 @@ +.input-full-width { + width: 100%; +} + +.m-b-30 { + margin-bottom: 30px; +} + +.mat-form-field { + line-height: unset !important; +} + +.vertical-align-middle { + vertical-align: middle; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + +.title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} + +.icon-remove { + margin: 16px; +} + +.actionButton { + float: right; +} + +.width5 { + width: 5%; +} + +.width10 { + width: 10%; +} + +.width15 { + width: 15%; +} diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.html b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.html new file mode 100644 index 0000000..c20ccfc --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.html @@ -0,0 +1,267 @@ +
+

{{ title }}

+ +
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + + {{ batchItem.batchNo }} + + + + {{ currentLanguageSet?.inventory?.qtyinBatch }} + + + + + + {{ currentLanguageSet?.inventory?.qtytoDispensed }} + + + + + + {{ currentLanguageSet?.itemDispense?.expiryDate }} + + + + + + + + + {{ currentLanguageSet?.bendetails?.action }} + + +
+
+ +
+
+
+
+ +
+
+ + +
+
+
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.spec.ts new file mode 100644 index 0000000..335bbd5 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectBatchComponent } from './select-batch.component'; + +describe('SelectBatchComponent', () => { + let component: SelectBatchComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SelectBatchComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectBatchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.ts b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.ts new file mode 100644 index 0000000..1fd425c --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/select-batch/select-batch.component.ts @@ -0,0 +1,292 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck } from '@angular/core'; +import { FormBuilder, FormGroup, FormControl, FormArray } from '@angular/forms'; +import { ConfirmationService } from '../../../../core/services/confirmation.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-select-batch', + templateUrl: './select-batch.component.html', + styleUrls: ['./select-batch.component.css'], +}) +export class SelectBatchComponent implements OnInit, DoCheck { + batchForm!: FormGroup; + today!: Date; + + itemBatchList: any = []; + masterItemBatchList = []; + enableEditMode = false; + editBatchList: any; + selectedBatchList: any = []; + filteredBatchList: any = []; + languageComponent: any; + currentLanguageSet: any; + + constructor( + private confirmationService: ConfirmationService, + @Inject(MAT_DIALOG_DATA) public data: any, + private fb: FormBuilder, + public http_service: LanguageService, + public mdDialogRef: MatDialogRef, + ) {} + dataSource = new MatTableDataSource(); + title!: string; + + ngOnInit() { + this.fetchLanguageResponse(); + if ( + this.data !== undefined && + this.data !== null && + this.data.batchList !== undefined && + this.data.batchList !== null + ) { + this.masterItemBatchList = this.data.batchList; + this.itemBatchList = this.data.batchList; + } + this.batchForm = this.createBatchForm(); + if (this.data.editIndex != null) { + this.title = this.currentLanguageSet.inventory.editBatchSelection; + } else { + this.title = this.currentLanguageSet.itemDispense.batchSelection; + } + this.title; + console.log('this.data', this.data); + + if (this.data.editBatch != null) { + if (this.data.editBatch.batchList.length > 0) { + this.enableEditMode = true; + this.editBatchList = this.data.editBatch; + this.batchForm.patchValue(this.data.editBatch); + this.addBatch(); + this.handleBatchData(); + } else { + this.addBatch(); + this.editableBatch(this.data.editBatch); + } + } else { + this.editBatchList = []; + this.addBatch(); + } + this.loadManualDispense(); + } + + editableBatch(editBatchList: any) { + this.editBatchList = editBatchList; + this.batchForm.patchValue(editBatchList); + } + + handleBatchData() { + const formBatchList = this.batchForm.controls['batchList']; + const temp = this.data.editBatch.batchList.slice(); + + for (let i = 0; i < temp.length; i++) { + const batchArray = this.masterItemBatchList.filter((item: any) => { + return item.batchNo == temp[i].batchNo.batchNo; + }); + + if (batchArray.length > 0) { + temp[i].batchNo = batchArray[0]; + } + + if (temp[i].batchNo.batchNo) { + const k: any = formBatchList.get('' + i); + k.patchValue(temp[i]); + k.markAsTouched(); + this.getQuantityAndFilterItem(temp[i].batchNo, i); + } + if (i + 1 < temp.length) { + this.addBatch(); + } + } + } + + createBatchForm() { + return this.fb.group({ + item: null, + itemName: null, + itemID: null, + quantityInHand: null, + quantityDispensed: null, + batchList: new FormArray([]), + }); + } + + getQuantityAndFilterItem(selectedBatch: any, i: any, batchForm?: FormGroup) { + const selectedBatchList = this.selectedBatchList[i]; + this.filteredBatchList.map((item: any, t: any) => { + const index = item.indexOf(selectedBatch); + if (index != -1 && t != i) { + item = item.splice(index, 1); + } + }); + this.selectedBatchList[i] = selectedBatch; + + const expiryDate = (this.today = new Date(selectedBatch.value.expiryDate)); + if (batchForm != undefined) { + batchForm.patchValue({ + quantityOnBatch: selectedBatch.value.quantityInHand, + expiryDate: expiryDate, + quantityOfDispense: null, + }); + } + const quantityOnBatch = selectedBatch.value.quantityInHand; + } + + calculateDispenseQuantity() { + const batchList = this.batchForm.controls['batchList']; + const batchListValue = batchList.value; + let totalQuantity = 0; + batchListValue.filter((quantity: any) => { + if (quantity.quantityOfDispense && quantity.quantityOfDispense != null) { + totalQuantity = +totalQuantity + +quantity.quantityOfDispense; + } + }); + this.batchForm.patchValue({ quantityDispensed: totalQuantity }); + } + + loadManualDispense() { + const dataFromFun: any = this.getBatchListTableData(); + this.dataSource.data = dataFromFun; + } + + getBatchListTableData(): any { + return (this.batchForm.get('batchList') as FormArray).controls; + } + + addBatch() { + const batchList = this.batchForm.controls['batchList']; + const tempBatch = batchList.value; + if (this.itemBatchList.length > tempBatch.length) { + if (this.itemBatchList) { + const resultBatch = this.itemBatchList.filter((batch: any) => { + const batchArray = tempBatch.filter((item: any) => { + if ( + item.batchNo && + item.batchNo != null && + item.batchNo.batchNo != null + ) { + return item.batchNo.batchNo == batch.batchNo; + } + return; + }); + const batchFlag = batchArray.length == 0 ? true : false; + return batchFlag; + }); + this.filteredBatchList.push(resultBatch.slice()); + } + batchList.push(this.initBatchForm()); + this.loadManualDispense(); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.nofurtherbatchesavailable, + ); + } + } + + initBatchForm() { + return this.fb.group({ + batchNo: null, + quantityOnBatch: null, + expiryDate: null, + quantityOfDispense: null, + }); + } + + removeBatch(i: any, batchForm: any) { + const batchList = this.batchForm.controls['batchList']; + if (batchList.length == 1 && !!batchForm) { + batchForm.patchValue({ + batchNo: null, + quantityOnBatch: null, + expiryDate: null, + entryDate: null, + quantityOfDispense: null, + }); + this.calculateDispenseQuantity(); + this.loadManualDispense(); + } else { + const removedValue = this.selectedBatchList[i]; + this.filteredBatchList.map((item: any, t: any) => { + if (t != i && removedValue) { + item.push(removedValue); + } + }); + this.selectedBatchList.splice(i, 1); + this.filteredBatchList.splice(i, 1); + batchList.removeAt(i); + this.calculateDispenseQuantity(); + this.loadManualDispense(); + } + } + + checkValidity(batchForm: FormGroup) { + const batchList = this.batchForm.controls['batchList']; + const tempBatch = batchForm.value; + if (batchList.length != this.masterItemBatchList.length) { + if (tempBatch.quantityOfDispense) { + return false; + } else { + return true; + } + } else { + return true; + } + } + + checkQuantity(batch: FormGroup) { + const quantity = batch.value.quantityOfDispense; + if (batch.value.quantityOfDispense == 0) { + this.confirmationService.alert( + this.currentLanguageSet.inventory + .pleaseenterquantitygreaterthanzeroandlessthanorequaltoQtyinBatch, + ); + batch.patchValue({ quantityOfDispense: null }); + batch.markAsPristine(); + } else if (batch.value.quantityOnBatch < batch.value.quantityOfDispense) { + this.confirmationService.alert( + this.currentLanguageSet.inventory + .pleaseenterquantitylessthanorequaltoQtyinBatch, + ); + batch.patchValue({ quantityOfDispense: null }); + batch.markAsPristine(); + } + } + saveAndUpdateItem() { + this.mdDialogRef.close(this.batchForm); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.css b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.css new file mode 100644 index 0000000..112ea4a --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.css @@ -0,0 +1,52 @@ +.input-full-width { + width: 100%; +} + +.box { + height: 70px; +} + +.inline-block { + display: inline-block; +} + +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + +.mat-card { + padding-left: 0px !important; + padding-right: 0px !important; + padding-top: 15px !important; + padding-bottom: 15px !important; +} + +.m-b-40 { + margin-bottom: 40px; +} + +.mat-form-field { + line-height: unset !important; +} + +.m-l-5 { + margin-left: 5px; +} + +@media screen and (max-width: 768px) { + .button-full-width { + width: 100%; + /* height: 50px; */ + margin-top: 3px; + } + .box{ + height: 60px; + } + +} +.medicineAlign{ + display: flex; + justify-content: space-between; +} diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.html b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.html new file mode 100644 index 0000000..953e71b --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.html @@ -0,0 +1,216 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.patientIssueWithoutRx }} +

+
+
+ + +
+ +
+ +
+
+
+ + + +
+
+ + + + + {{ visit.benVisitCode }} + + + +
+
+ + + + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ {{ currentLanguageSet?.inventory?.typeofDispense }}: +
+ + {{ + currentLanguageSet?.inventory?.manualDispense + }} + {{ + currentLanguageSet?.inventory?.systemDispense + }} + +
+
+
+
+ + + +
+
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.spec.ts new file mode 100644 index 0000000..a67d0e1 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MedicineDispenseComponent } from './medicine-dispense.component'; + +describe('MedicineDispenseComponent', () => { + let component: MedicineDispenseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MedicineDispenseComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MedicineDispenseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts new file mode 100644 index 0000000..a138801 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts @@ -0,0 +1,312 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, OnDestroy, DoCheck } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { InventoryService } from './../shared/service/inventory.service'; +import { ConfirmationService } from './../../core/services/confirmation.service'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { LanguageService } from '../../core/services/language.service'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { SearchComponent } from '../../core/components/search/search.component'; + +@Component({ + selector: 'app-medicine-dispense', + templateUrl: './medicine-dispense.component.html', + styleUrls: ['./medicine-dispense.component.css'], +}) +export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { + beneficiaryDetailForm!: FormGroup; + beneficaryDetail: any; + + parentBenID: any; + parentVisitID: any; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + constructor( + private fb: FormBuilder, + private confirmationService: ConfirmationService, + private inventoryService: InventoryService, + public http_service: LanguageService, + private dialog: MatDialog, + ) {} + + ngOnInit() { + this.beneficiaryDetailForm = this.createBeneficiaryForm(); + //Parent App Calling + this.checkParentVisits(); + this.fetchLanguageResponse(); + } + + ngOnDestroy() { + sessionStorage.removeItem('parentBen'); + sessionStorage.removeItem('parentBenVisit'); + } + + createBeneficiaryForm() { + return this.fb.group({ + medicineDispenseType: { value: '', disabled: true }, + beneficiaryID: { value: '', disabled: false }, + visitCode: { value: '', disabled: true }, + visitID: { value: '', disabled: true }, + beneficiaryName: { value: '', disabled: false }, + beneficiaryAge: { value: '', disabled: false }, + genderName: { value: '', disabled: false }, + doctorName: { value: '', disabled: false }, + reference: { value: '', disabled: true }, + visitDate: { value: '', disabled: false }, + }); + } + + checkParentVisits() { + this.parentBenID = + sessionStorage.getItem('parentBen') === 'undefined' + ? undefined + : sessionStorage.getItem('parentBen'); + this.parentVisitID = + sessionStorage.getItem('parentBenVisit') === 'undefined' + ? undefined + : sessionStorage.getItem('parentBenVisit'); + console.log(this.parentBenID, this.parentVisitID); + + if (this.parentBenID) { + this.getParentBenVisits(); + } + } + + getParentBenVisits() { + this.beneficiaryDetailForm.patchValue({ + beneficiaryID: this.parentBenID, + medicineDispenseType: 'System', + }); + + this.inventoryService + .getBeneficaryVisitDetail({ + providerServiceMapID: localStorage.getItem('providerServiceID'), + beneficiaryID: + this.beneficiaryDetailForm.controls['beneficiaryID'].value, + }) + .subscribe( + (response) => { + console.log('response', response); + if (response.statusCode == 200) { + if (response.data.beneficiaryFlowStatus.length > 0) { + this.beneficiaryVisitDetailList = response.data; + console.log(this.beneficiaryVisitDetailList, 'lissss'); + this.beneficiaryDetail = response.data.beneficiaryFlowStatus; + this.loadCurrentVisit(response.data.beneficiaryFlowStatus); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecentvisitavailable, + ); + } + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + + loadCurrentVisit(resp: any) { + if (this.parentVisitID) { + resp.forEach((element: any) => { + if (element.benVisitID == this.parentVisitID) { + this.beneficiaryDetailForm.patchValue({ + visitCode: element, + }); + this.getVisitDetail(); + } + }); + } + } + + beneficiaryDetail: any; + beneficiaryVisitDetailList: any; + recentBeneficaryVisit: any; + checkBeneficiary() { + if (this.beneficiaryDetailForm.controls['beneficiaryID'].value == null) { + this.nullifyBeneficiaryDetails(); + } + + if (this.beneficiaryDetailForm.controls['beneficiaryID'].value != null) { + if ( + this.beneficiaryDetailForm.controls['beneficiaryID'].value.length != 12 + ) { + this.nullifyBeneficiaryDetails(); + } + if ( + this.beneficiaryDetailForm.controls['beneficiaryID'].value.length == 12 + ) { + this.inventoryService + .getBeneficaryVisitDetail({ + providerServiceMapID: localStorage.getItem('providerServiceID'), + beneficiaryID: + this.beneficiaryDetailForm.controls['beneficiaryID'].value, + }) + .subscribe( + (response) => { + console.log('response', response); + if (response.statusCode == 200) { + if (response.data.benVisitDetail.length > 0) { + this.beneficiaryVisitDetailList = response.data; + this.beneficiaryDetail = response.data.beneficiaryFlowStatus; + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecentvisitavailable, + ); + } + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + } + // 720088175112 + } + openSearchDialog() { + const matDialogRef: MatDialogRef = this.dialog.open( + SearchComponent, + { + height: '80%', + width: '65%', + panelClass: 'fit-screen', + disableClose: false, + }, + ); + + matDialogRef.afterClosed().subscribe((result) => { + if (result) { + console.log('something fishy happening here', result); + this.beneficiaryDetailForm.patchValue({ + beneficiaryID: result, + }); + this.checkBeneficiary(); + } + }); + } + + getVisitDetail() { + if (this.visitCode != undefined || this.visitCode != null) { + this.beneficiaryDetailForm.patchValue({ + beneficiaryName: this.visitCode.benName, + beneficiaryAge: this.visitCode.ben_age_val, + genderName: this.visitCode.genderName, + doctorName: this.visitCode.agentId, + visitDate: this.visitCode.visitDate, + visitID: this.visitCode.benVisitID, + reference: null, + medicineDispenseType: 'System', + }); + this.getBeneficiaryDetail(); + } else { + this.nullifyBeneficiaryDetails(); + } + } + nullifyBeneficiaryDetails() { + this.beneficiaryDetailForm.patchValue({ + medicineDispenseType: null, + visitCode: null, + visitDate: null, + beneficiaryName: null, + beneficiaryAge: null, + genderName: null, + doctorName: null, + reference: null, + }); + } + + getBeneficiaryDetail() { + const facilityDetailfromStorage: any = + localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetailfromStorage); + const facilityName = facilityDetail.facilityName; + this.beneficaryDetail = { + age: this.visitCode.ben_age_val, + beneficiaryID: this.beneficiaryID, + benRegID: this.beneficiaryVisitDetailList.beneficiaryRegID, + createdBy: localStorage.getItem('username'), + providerServiceMapID: localStorage.getItem('providerServiceID'), + doctorName: this.visitCode.agentId, + facilityID: localStorage.getItem('facilityID'), + gender: this.visitCode.genderName, + issueType: this.medicineDispenseType, + patientName: this.visitCode.benName, + prescriptionID: null, + reference: this.reference, + visitID: this.visitCode.benVisitID, + visitCode: this.visitCode.benVisitCode, + facilityName: facilityName, + visitDate: this.visitCode.visitDate, + }; + console.log('ERRR100', this.beneficaryDetail); + } + + get reference() { + return this.beneficiaryDetailForm.controls['reference'].value; + } + get medicineDispenseType() { + return this.beneficiaryDetailForm.controls['medicineDispenseType'].value; + } + + get beneficiaryID() { + return this.beneficiaryDetailForm.controls['beneficiaryID'].value; + } + + get beneficiaryName() { + return this.beneficiaryDetailForm.controls['beneficiaryName'].value; + } + + get beneficiaryAge() { + return this.beneficiaryDetailForm.controls['beneficiaryAge'].value; + } + + get visitDate() { + return this.beneficiaryDetailForm.controls['visitDate'].value; + } + + get visitCode() { + return this.beneficiaryDetailForm.controls['visitCode'].value; + } + + resetBeneficiaryDetails(event: any) { + console.log('event', event); + this.beneficiaryDetailForm.reset(); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.css b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.css new file mode 100644 index 0000000..ee03a30 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.css @@ -0,0 +1,43 @@ +.input-full-width { + width: 100%; +} + +.m-t-30 { + margin-top: 30px; +} + +.container-fluid { + padding: 24px !important; +} + +.display{ + padding-bottom: 20px; +} + + +.title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} + +.actionButton { + float: right; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.html b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.html new file mode 100644 index 0000000..55fccc2 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.html @@ -0,0 +1,133 @@ +
+

{{ currentLanguageSet?.inventory?.issuedBatch }}

+ +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.item }} + + {{ element?.itemName }} + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + {{ element?.itemBatchList[0].batchNo }} + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + {{ element?.itemBatchList[0].quantityInHand }} + + {{ currentLanguageSet?.itemDispense?.expiryDate }} + + {{ element?.itemBatchList[0].expiryDate | date: "dd/MM/yyyy" }} + + {{ currentLanguageSet?.itemDispense?.quantityDispensed }} + + {{ element?.itemBatchList[0].quantity }} +
+
+
+
+ +
+
+ + +
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.spec.ts new file mode 100644 index 0000000..b0c87ef --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShowBatchItemComponent } from './show-batch-item.component'; + +describe('ShowBatchItemComponent', () => { + let component: ShowBatchItemComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ShowBatchItemComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ShowBatchItemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts new file mode 100644 index 0000000..592e503 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts @@ -0,0 +1,130 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck } from '@angular/core'; +import { InventoryService } from './../../../shared/service/inventory.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-show-batch-item', + templateUrl: './show-batch-item.component.html', + styleUrls: ['./show-batch-item.component.css'], +}) +export class ShowBatchItemComponent implements OnInit, DoCheck { + app: any; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private inventoryService: InventoryService, + public http_service: LanguageService, + @Inject(MAT_DIALOG_DATA) public data: any, + public mdDialogRef: MatDialogRef, + ) {} + // issuedBatchList: any = []; + issuedBatchList = new MatTableDataSource(); + beneficaryDetail: any; + ngOnInit() { + this.app = this.getApp(); + + this.issuedBatchList.data = this.data.batchList; + this.beneficaryDetail = this.data.beneficaryDetail; + console.log('tD', this.data); + console.log('this.beneficaryDetail', this.beneficaryDetail); + console.log('issuedBatchList', this.issuedBatchList.data); + this.fetchLanguageResponse(); + } + + getApp() { + console.log(sessionStorage.getItem('host')); + if (sessionStorage.getItem('host')) { + return sessionStorage.getItem('host'); + } else { + return 'STORE'; + } + } + createStockExitList() { + const stockExitList: any = []; + this.issuedBatchList.data.forEach((dispenseItem: any) => { + dispenseItem.itemBatchList.forEach((batch: any) => { + const dispensedItem = { + createdBy: localStorage.getItem('userID'), + itemID: dispenseItem.itemID, + itemStockEntryID: batch.itemStockEntryID, + quantity: batch.quantity, + }; + stockExitList.push(dispensedItem); + }); + }); + const dispensingItem = { + issuedBy: this.app, + ...this.beneficaryDetail, + itemStockExit: stockExitList, + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + }; + return dispensingItem; + } + + saveAndUpdateItem() { + const dispensingItem = this.createStockExitList(); + console.log('dispenseItem', dispensingItem); + this.inventoryService + .saveStockExit(dispensingItem) + .subscribe((response) => { + this.closeBatchModal(response, this.issuedBatchList.data, null); + }); + } + + saveUpdateAndPrintItem() { + const dispensingItem = this.createStockExitList(); + console.log('dispenseItem', dispensingItem); + this.inventoryService + .saveStockExit(dispensingItem) + .subscribe((response) => { + this.closeBatchModal(response, this.issuedBatchList.data, true); + }); + } + + closeBatchModal(result: any, issuedBatchList: any, print: any) { + const modalresult = Object.assign({ + result: result, + issuedBatchList: issuedBatchList, + print: print, + }); + this.mdDialogRef.close(modalresult); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.css b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.css new file mode 100644 index 0000000..1e230e9 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.css @@ -0,0 +1,31 @@ +.input-full-width { + width: 100%; +} + +.search-btn { + cursor: pointer; +} + +.vertical-align-middle { + vertical-align: middle; +} + +.icon-remove { + margin: 16px; +} + +.mat-form-field { + line-height: unset !important; +} + +.width5 { + width: 5%; +} + +.width10 { + width: 10%; +} + +.width15 { + width: 15%; +} diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.html b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.html new file mode 100644 index 0000000..89f67ae --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.html @@ -0,0 +1,165 @@ +
+
+
+
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ i + 1 }} + + + + + {{ currentLanguageSet?.inventory?.item }} + + + + + search + + + + + + {{ + currentLanguageSet?.inventory?.qtyinHand + }} + + + + + + + + + {{ + currentLanguageSet?.inventory?.qtyRequired + }} + + + + + + + + + {{ + currentLanguageSet?.inventory?.actions + }} + + delete + + + + + +
+ +
+
+
+
+
+ +
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.spec.ts new file mode 100644 index 0000000..5c0d1bc --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SystemMedicineDispenseComponent } from './system-medicine-dispense.component'; + +describe('SystemMedicineDispenseComponent', () => { + let component: SystemMedicineDispenseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SystemMedicineDispenseComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SystemMedicineDispenseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.ts new file mode 100644 index 0000000..4f23012 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/system-medicine-dispense.component.ts @@ -0,0 +1,427 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Input, + Output, + EventEmitter, + DoCheck, +} from '@angular/core'; +import { + FormBuilder, + FormGroup, + FormControl, + FormArray, + AbstractControl, +} from '@angular/forms'; +import { InventoryService } from './../../shared/service/inventory.service'; +import { ConfirmationService } from './../../../core/services/confirmation.service'; +import { DataStorageService } from './../../shared/service/data-storage.service'; + +import { ShowBatchItemComponent } from './show-batch-item/show-batch-item.component'; +import * as moment from 'moment'; +import { Router } from '@angular/router'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + itemName: string; + index: number; +} + +@Component({ + selector: 'app-system-medicine-dispense', + templateUrl: './system-medicine-dispense.component.html', + styleUrls: ['./system-medicine-dispense.component.css'], +}) +export class SystemMedicineDispenseComponent implements OnInit, DoCheck { + @Input() + beneficaryDetail: any; + + @Output() resetBeneficiaryDetail: EventEmitter = new EventEmitter(); + + systemDispenseForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + displayedColumns: string[] = [ + 'itemName', + 'quantity', + 'totalCostPrice', + 'actions', + ]; + constructor( + private inventoryService: InventoryService, + private confirmationService: ConfirmationService, + private dataStorageService: DataStorageService, + private router: Router, + public http_service: LanguageService, + private dialog: MatDialog, + private fb: FormBuilder, + ) {} + dataSource = new MatTableDataSource(); + + ngOnInit() { + // this.systemDispenseForm = this.createSystemDispenseForm(); + this.systemDispenseForm = this.fb.group({ + systemItemDispenseList: this.fb.array([]), + }); + this.initSystemDispense(); + this.fetchLanguageResponse(); + this.loadSystemMedicineData(); + console.log('ERRR1', this.beneficaryDetail); + } + + loadSystemMedicineData() { + const dataFromFun: any = this.systemMedicineDataSource(); + this.dataSource.data = dataFromFun; + } + + systemMedicineDataSource(): any { + return (this.systemDispenseForm.get('systemItemDispenseList') as FormArray) + .controls; + } + + checkValidity(systemDispenseForm: FormGroup) { + const tempBatch = systemDispenseForm.value; + if (tempBatch.quantityRequired) { + return false; + } else { + return true; + } + } + + get systemItemDispenseList() { + return this.systemDispenseForm.get('systemItemDispenseList') as FormArray; + } + + initSystemDispense() { + const frmArrSystemDispense = this.systemDispenseForm.get( + 'systemItemDispenseList', + ) as FormArray; + frmArrSystemDispense.push( + this.fb.group({ + itemName: null, + itemID: null, + quantityInHand: null, + quantityRequired: null, + }), + ); + } + initSystemDispenseForm(): FormGroup { + return this.fb.group({ + itemName: null, + itemID: null, + quantityInHand: null, + quantityRequired: null, + }); + } + + resetDependent(systemItemDispense: FormGroup) { + systemItemDispense.patchValue({ + itemID: null, + quantityInHand: null, + quantityRequired: null, + }); + } + + createItemList() { + const systemDispenseValue = this.systemDispenseForm.value; + console.log('systemDispenseValue', systemDispenseValue); + const itemList: any = []; + systemDispenseValue.systemItemDispenseList.forEach((item: any) => { + const itemObj = { + itemID: item.itemID, + quantity: item.quantityRequired, + }; + itemList.push(itemObj); + }); + return itemList; + } + initSystemDispenseMode() { + this.systemItemDispenseList.push(this.initSystemDispenseForm()); + this.loadSystemMedicineData(); + } + removeItem(i: any, itemForm: FormGroup) { + const stockForm = this.systemDispenseForm.get( + 'systemItemDispenseList', + ) as FormArray; + console.log('stockForm', stockForm); + console.log('stock', itemForm); + + if (stockForm.length > 1) { + stockForm.removeAt(i); + // stockForm.clear(); + this.loadSystemMedicineData(); + } else { + if (itemForm) { + itemForm.reset(); + itemForm.controls['itemName'].enable(); + } + } + + const systemItemDispenseList = ( + this.systemDispenseForm.controls['systemItemDispenseList'] + ); + console.log('systemItemDispenseList.length', systemItemDispenseList.length); + if (systemItemDispenseList.length == 1 && !!itemForm) { + this.systemDispenseForm.reset(); + console.log('here'); + } else { + systemItemDispenseList.removeAt(i); + } + } + + allocateBatch() { + const itemList = this.createItemList(); + console.log('itemList', JSON.stringify(itemList, null, 4)); + this.inventoryService.allocateBatch(itemList).subscribe( + (response) => { + if (response.statusCode == 200) { + if (response.data.length > 0) { + const itemBatchList = response.data; + this.openModalToShowBatchList(itemBatchList); + console.log('ERRR2', this.beneficaryDetail); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.itembatchlistisempty, + 'error', + ); + } + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + + openModalToShowBatchList(itemBatchList: any) { + const matDialogRef: MatDialogRef = this.dialog.open( + ShowBatchItemComponent, + { + data: { + batchList: itemBatchList, + beneficaryDetail: this.beneficaryDetail, + }, + width: 0.8 * window.innerWidth + 'px', + panelClass: 'dialog-width', + disableClose: false, + }, + ); + matDialogRef.afterClosed().subscribe( + (result) => { + console.log('result', result); + if (result) { + console.log('resuklt', result); + if (result.result) { + console.log('result.result', result.result); + if (result.result.statusCode == 200) { + console.log('result.result.statusCode', result.result.statusCode); + if (result.print != null && result.print == true) { + const printableData = this.createPrintableData( + result.issuedBatchList, + ); + this.dataStorageService.systemItemDispense = printableData; + console.log( + 'printableData', + JSON.stringify(printableData, null, 4), + ); + const uRL = 'systemItemDispense'; + this.router.navigate(['/inventory/dynamicPrint/', uRL]); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.resetBeneficiaryDetails(); + } + } else { + this.confirmationService.alert( + result.result.errorMessage, + 'error', + ); + } + } + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + + resetForm() { + console.log('here in '); + const systemItemDispenseList = ( + this.systemDispenseForm.controls['systemItemDispenseList'] + ); + const systemItemDispenseListLength = systemItemDispenseList.value.length; + console.log('systemItemDispenseListLength', systemItemDispenseListLength); + for (let i = 0; i < systemItemDispenseListLength; i++) { + systemItemDispenseList.removeAt(0); + } + this.resetBeneficiaryDetails(); + } + + resetBeneficiaryDetails() { + console.log('event', event); + this.resetBeneficiaryDetail.emit(); + } + + createPrintableData(issuedBatchList: any) { + const printableData: any = []; + let i = 0; + issuedBatchList.forEach((dispenseItem: any) => { + dispenseItem.itemBatchList.forEach((batch: any) => { + console.log('batch', batch); + i = i + 1; + const dispensedItem = { + sNo: i, + itemName: dispenseItem.itemName, + batchNo: batch.batchNo, + expiryDate: moment(batch.expiryDate).format('DD-MM-YYYY'), + qod: batch.quantity, + }; + printableData.push(dispensedItem); + }); + }); + console.log(JSON.stringify(this.beneficaryDetail, null, 4)); + const beneficaryDetail = Object.assign( + { + visitedDate: moment(this.beneficaryDetail.visitDate).format( + 'DD-MM-YYYY', + ), + }, + this.beneficaryDetail, + ); + + const systemDispenseItem = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: beneficaryDetail }, + { columns: this.columns }, + { printableData: printableData }, + ); + return systemDispenseItem; + } + + validateRequestedQuantity(stock: FormGroup) { + const quantityInHand = stock.value.quantityInHand; + const requestedQuantity = stock.value.quantityRequired; + + if (requestedQuantity <= 0) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.quantitycannotbenegativeorzero, + ); + stock.controls['quantityRequired'].setValue(null); + } else if (requestedQuantity > quantityInHand) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.insufficientquantityinthisbatch, + ); + stock.controls['quantityRequired'].setValue(null); + } + } + + title = { + modalTitle: 'System Dispense', + headerTitle: 'Dispense Detail', + tableTitle: 'Dispensed Item', + }; + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchNo', + columnName: 'Batch No', + }, + { + keyName: 'expiryDate', + columnName: 'Expiry Date', + }, + { + keyName: 'qod', + columnName: 'Qty dispensed', + }, + ]; + headerColumn = [ + { + columnName: 'Name :', + keyName: 'patientName', + }, + { + columnName: 'Beneficiary ID :', + keyName: 'beneficiaryID', + }, + { + columnName: 'Gender :', + keyName: 'gender', + }, + { + columnName: 'Age :', + keyName: 'age', + }, + { + columnName: 'Visit ID :', + keyName: 'visitID', + }, + { + columnName: 'Visit Date :', + keyName: 'visitedDate', + }, + { + columnName: 'Doctor Name :', + keyName: 'doctorName', + }, + { + columnName: 'Issued By :', + keyName: 'createdBy', + }, + { + columnName: 'Reference :', + keyName: 'reference', + }, + ]; + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.css b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.css new file mode 100644 index 0000000..7e2263c --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.css @@ -0,0 +1,43 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; + overflow-x: hidden; + overflow-y: hidden; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +h5 { + display: inline-block; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 15px; +} + +.h5_bold { + font-weight: bold; +} + +.m-b-15 { + margin-bottom: 15px; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.html b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.html new file mode 100644 index 0000000..3fe1213 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.html @@ -0,0 +1,191 @@ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.patientName }} + + {{ element.patientName }} + + {{ currentLanguageSet?.inventory?.issueType }} + {{ element.issueType }} + {{ currentLanguageSet?.inventory?.createdBy }} + {{ element.createdBy }} + {{ currentLanguageSet?.inventory?.reference }} + {{ element.reference }} + {{ currentLanguageSet?.inventory?.createdDate }} + + {{ element.createdDate | istDate: "dd/MM/yyyy" }} +
+
+
+ +
+
+ + + search + +
+
+ +
+
+
+ + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.itemName }} + + + {{ item?.itemName }} + + + + + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + {{ item?.batchNo }} + + + + + + {{ currentLanguageSet?.itemDispense?.expiryDate }} + + + {{ item?.expiryDate | date: "dd/MM/yyyy" }} + + + + + + {{ currentLanguageSet?.inventory?.quantity }} + + + {{ item?.quantity }} + + + + +
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+
+ +
+
+ + + + +
+
+ + + {{ + currentLanguageSet?.inventory?.norecordsfound + }} + + +
+
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.spec.ts new file mode 100644 index 0000000..83f3b45 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewMedicineDispenseDetailsComponent } from './view-medicine-dispense-details.component'; + +describe('ViewMedicineDispenseDetailsComponent', () => { + let component: ViewMedicineDispenseDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewMedicineDispenseDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewMedicineDispenseDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts new file mode 100644 index 0000000..96de969 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts @@ -0,0 +1,234 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Inject, + OnDestroy, + DoCheck, + ViewChild, +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; +import * as moment from 'moment'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-view-medicine-dispense-details', + templateUrl: './view-medicine-dispense-details.component.html', + styleUrls: ['./view-medicine-dispense-details.component.css'], +}) +export class ViewMedicineDispenseDetailsComponent + implements OnInit, OnDestroy, DoCheck +{ + _filterTerm = ''; + _detailedList: any = []; + // _filteredDetailedList: any = []; + blankTable = [1, 2, 3, 4, 5]; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + medicineDetailList = new MatTableDataSource(); + _filteredDetailedList = new MatTableDataSource(); + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'patientName', + 'issueType', + 'createdBy', + 'reference', + 'createdDate', + ]; + itemListColumns: string[] = ['itemName', 'batchNo', 'expiryDate', 'quantity']; + + constructor( + public dialogRef: MatDialogRef, + public http_service: LanguageService, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + ngOnInit() { + this.populateDispenseRecords(this.data); + this.fetchLanguageResponse(); + } + + ngOnDestroy(): void { + //Called once, before the instance is destroyed. + //Add 'implements OnDestroy' to the class. + this.data = ''; + } + populateDispenseRecords(data: any) { + if (data && data.dispenseItem && data.dispense) { + this._detailedList = data.dispenseItem; + this._filteredDetailedList.data.push(this._detailedList); + this.dataSource = new MatTableDataSource( + this._filteredDetailedList.data[0].data, + ); + this.medicineDetailList.data.push(data.dispense); + } + } + + filterDetails(filterTerm: string) { + console.log(filterTerm); + if (!filterTerm) this._filteredDetailedList.data = this._detailedList; + else { + this._filteredDetailedList.data = []; + this._detailedList.forEach((item: any) => { + for (const key in item) { + if (key == 'batchNo' || key == 'itemName' || key == 'quantity') { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this._filteredDetailedList.data.push(item); + break; + } + } + } + }); + } + } + + print() { + const printableData = this.createPrintableData(); + console.log('printableData', JSON.stringify(printableData, null, 4)); + this.closeModal(printableData); + } + closeModal(printableData: any) { + this.dialogRef.close(printableData); + } + + createPrintableData() { + const facilityDetailStrorage: any = localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetailStrorage); + const facilityName = facilityDetail.facilityName; + const printableData: any = []; + let i = 0; + this.data.dispenseItem.forEach((dispenseItem: any) => { + i = i + 1; + const dispensedItem = { + sNo: i, + itemName: dispenseItem.itemName, + batchNo: dispenseItem.batchNo, + expiryDate: moment(dispenseItem.expiryDate).format('DD-MM-YYYY'), + qod: dispenseItem.quantity, + }; + printableData.push(dispensedItem); + }); + + const beneficiaryDetails = Object.assign( + { + facilityName: facilityName, + visitedDate: moment(this.data.dispense.visitDate).format('DD-MM-YYYY'), + }, + this.data.dispense, + ); + const previousDispense = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: beneficiaryDetails }, + { columns: this.columns }, + { printableData: printableData }, + ); + return previousDispense; + } + + title = { + modalTitle: 'Previous Dispense', + headerTitle: 'Dispense Detail', + tableTitle: 'Dispensed Item', + }; + + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchNo', + columnName: 'Batch No', + }, + { + keyName: 'expiryDate', + columnName: 'Expiry Date', + }, + { + keyName: 'qod', + columnName: 'Qty dispensed', + }, + ]; + + headerColumn = [ + { + columnName: 'Name :', + keyName: 'patientName', + }, + { + columnName: 'Beneficiary ID :', + keyName: 'beneficiaryID', + }, + { + columnName: 'Gender :', + keyName: 'gender', + }, + { + columnName: 'Age :', + keyName: 'age', + }, + { + columnName: 'Visit Code :', + keyName: 'visitCode', + }, + { + columnName: 'Visit Date :', + keyName: 'visitedDate', + }, + { + columnName: 'Doctor Name :', + keyName: 'doctorName', + }, + { + columnName: 'Issued By :', + keyName: 'createdBy', + }, + { + columnName: 'Reference :', + keyName: 'reference', + }, + ]; + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.css b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.css new file mode 100644 index 0000000..5517611 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.css @@ -0,0 +1,56 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 24px; +} + +.h5_bold { + font-weight: bold; +} + +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} + +.previous-btn { + margin: 5px 0px; + background: #43a047 !important; +} + +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.html b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.html new file mode 100644 index 0000000..117a409 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.html @@ -0,0 +1,244 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousPatientIssueWithoutRx }} +

+
+
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} +
+
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+ + + + + + {{ i + 1 }} + + + + + + {{ + currentLanguageSet?.inventory?.issueID + }} + {{ element?.patientIssueID }} + + + + + {{ + currentLanguageSet?.inventory?.patientName + }} + {{ element?.patientName }} + + + + + {{ + currentLanguageSet?.inventory?.reference + }} + {{ element?.reference }} + + + + + {{ + currentLanguageSet?.inventory?.issueType + }} + {{ element?.issueType }} + + + + + {{ + currentLanguageSet?.inventory?.createdBy + }} + {{ element?.createdBy }} + + + + + {{ + currentLanguageSet?.inventory?.createdDate + }} + {{ + element?.createdDate | istDate: "dd/MM/yyyy" + }} + + + + + + +
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.spec.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.spec.ts new file mode 100644 index 0000000..92efa7a --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewMedicineDispenseComponent } from './view-medicine-dispense.component'; + +describe('ViewMedicineDispenseComponent', () => { + let component: ViewMedicineDispenseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewMedicineDispenseComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewMedicineDispenseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts new file mode 100644 index 0000000..8bc7964 --- /dev/null +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts @@ -0,0 +1,216 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + HostListener, + ViewChild, + DoCheck, +} from '@angular/core'; +import { ViewMedicineDispenseDetailsComponent } from './view-medicine-dispense-details/view-medicine-dispense-details.component'; +import * as moment from 'moment'; +import { Location } from '@angular/common'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { DataStorageService } from './../../shared/service/data-storage.service'; +import { Router } from '@angular/router'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-view-medicine-dispense', + templateUrl: './view-medicine-dispense.component.html', + styleUrls: ['./view-medicine-dispense.component.css'], +}) +export class ViewMedicineDispenseComponent implements OnInit, DoCheck { + _minDate: any; + _today: any; + + _dateRange: Date[] = []; + _dateRangePrevious: Date[] = []; + + _dispenseList: any = []; + _filteredDispenseList = new MatTableDataSource(); + // _filteredDispenseList: any = []; + blankTable = [1, 2, 3, 4, 5]; + filterTerm: any; + searched = false; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private location: Location, + private inventoryService: InventoryService, + private dialog: MatDialog, + public http_service: LanguageService, + private router: Router, + private dataStorageService: DataStorageService, + ) {} + + ngOnInit() { + this.setDateDefault(); + this.fetchLanguageResponse(); + this.getPastDispense(); + } + + setDateDefault() { + this._today = new Date(); + this._minDate = new Date(); + this._dateRange[0] = this._today; + this._dateRange[1] = this._today; + this._minDate.setFullYear(this._today.getFullYear() - 1); + // const date = new Date(); // Now + // date.setDate(date.getDate() - 30); + // this._dateRange = [date, new Date()] + console.log(this._dateRange, 'dateRange'); + } + + getPastDispense() { + const obj = this.getViewServiceObject(); + this.inventoryService.viewMedicineDispenseEntry(obj).subscribe((res) => { + this.searched = true; + this.loadDispense(res); + }); + } + + preventTyping(e: any) { + if (e.keyCode === 9) { + return true; + } else { + return false; + } + } + + getViewServiceObject() { + const startDate: Date = new Date(this._dateRange[0]); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this._dateRange[1]); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + return { + facilityID: localStorage.getItem('facilityID'), + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + } + + updateDate() { + // if (this._dateRange[0] != this._dateRangePrevious[0] || this._dateRange[1] != this._dateRangePrevious[1]) { + this._dateRangePrevious = this._dateRange; + // console.log(JSON.stringify(this._dateRange, null, 4), 'callservice'); + this.getPastDispense(); + + // } + } + + loadDispense(dispenseObject: any) { + console.log(dispenseObject); + // if (dispenseObject) { + // dispenseObject.forEach(element => { + // element.createdDate = moment(element.createdDate).utc().format('DD/MM/YYYY HH:mm') || 'Not Available' + + // }); + // } + this._dispenseList = dispenseObject.data; + this._filteredDispenseList.data = dispenseObject.data; + this.filterTerm = ''; + } + + filterConsumptionList(searchTerm: string) { + if (!searchTerm) this._filteredDispenseList.data = this._dispenseList; + else { + this._filteredDispenseList.data = []; + this._dispenseList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'patientIssueID' || + key == 'patientName' || + key == 'reference' || + key == 'issueType' || + key == 'createdBy' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(searchTerm.toLowerCase()) >= 0) { + this._filteredDispenseList.data.push(item); + break; + } + } + } + }); + } + } + + loadDispenseDetails(dispense: any) { + if (dispense && dispense.patientIssueID) { + this.inventoryService + .getParticularMedicineDispenseEntry(dispense.patientIssueID) + .subscribe((res) => this.popOutDispense(dispense, res)); + } + } + + popOutDispense(dispense: any, dispenseResponse: any) { + if (dispenseResponse) { + const mdDialogRef: MatDialogRef = + this.dialog.open(ViewMedicineDispenseDetailsComponent, { + // height: '90%', + width: '80%', + panelClass: 'fit-screen', + data: { dispense: dispense, dispenseItem: dispenseResponse }, + disableClose: false, + }); + mdDialogRef.afterClosed().subscribe((result: any) => { + if (result) { + this.dataStorageService.previousVisitData = result; + const uRL = 'previousVisitData'; + this.router.navigate(['/inventory/dynamicPrint/', uRL]); + } + }); + } + } + goBack() { + this.location.back(); + } + + // AV40085804 29/09/2021 Integrating Multilingual Functionality -----Start----- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + // -----End------ +} diff --git a/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.css b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.css new file mode 100644 index 0000000..b34dc12 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.css @@ -0,0 +1,42 @@ +.input-full-width { + width: 100%; + } + .box { + height: 70px; + } + .m-t-30 { + margin-top: 30px; + } + + .container-fluid { + padding: 24px !important; + } + + .title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; + } + + .title h4 { + display: inline-block; + } + + .title .exit { + cursor: pointer; + } + + .noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; + } + + @media screen and (max-width: 768px) { + .search-btn { + width: 100%; + } + } \ No newline at end of file diff --git a/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.html b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.html new file mode 100644 index 0000000..df0c67f --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.html @@ -0,0 +1,104 @@ +
+

+ {{ currentLanguageSet?.inventory?.benificiaryDetails }} +

+ +
+ +
+
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ i + 1 }} + {{ currentLanguageSet?.bendetails?.beneficiaryID }} + + {{ element?.beneficiaryID }} + + {{ currentLanguageSet?.bendetails?.beneficiaryName }} + + {{ element?.firstName ? element.firstName : "" }} + {{ element?.lastName ? element.lastName : "" }} + + {{ currentLanguageSet?.bendetails?.age }} + + {{ element?.age }} + + {{ currentLanguageSet?.bendetails?.gender }} + + {{ element?.m_gender?.genderName }} +
+
+ + + {{ + currentLanguageSet?.inventory?.norecordsfound + }} + + +
+
+
+
+
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.spec.ts b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.spec.ts new file mode 100644 index 0000000..fdba674 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BenificiaryDetailsComponent } from './benificiary-details.component'; + +describe('BenificiaryDetailsComponent', () => { + let component: BenificiaryDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BenificiaryDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BenificiaryDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.ts b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.ts new file mode 100644 index 0000000..9e4f4bb --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/benificiary-details/benificiary-details.component.ts @@ -0,0 +1,75 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck } from '@angular/core'; +import { InventoryService } from './../../../inventory/shared/service/inventory.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-benificiary-details', + templateUrl: './benificiary-details.component.html', + styleUrls: ['./benificiary-details.component.css'], +}) +export class BenificiaryDetailsComponent implements OnInit, DoCheck { + beneficiaryDetailsList = new MatTableDataSource(); + // beneficiaryDetailsList: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + displayedColumns: string[] = [ + 'beneficiaryID', + 'beneficiaryName', + 'age', + 'gender', + ]; + + constructor( + private inventoryService: InventoryService, + private http_service: LanguageService, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + ngOnInit() { + console.log('Data', this.data); + this.beneficiaryDetailsList.data = this.data.beneficiaryDetailsList; + this.fetchLanguageResponse(); + console.log('this.ben', this.beneficiaryDetailsList.data); + } + + loadbeneficiaryDetails(beneficiary: any) { + this.dialogRef.close(beneficiary); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css new file mode 100644 index 0000000..7d0cce1 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css @@ -0,0 +1,88 @@ +.input-full-width { + width: 100%; +} + +.searchBox { + background: #fff; + min-height: 40px; + overflow: hidden; + border-radius: 2px; + border-width: 0px; + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.08); + } + + .search_icon { + font-weight: bold; + } + + .search_button { + padding: 0; + width: 40px; + min-height: 40px; + background: none; + border: none; + transform: scale(1); + transition: all 1s; + outline: none; + } + + .search_button:active { + outline: none; + border: none; + } + + .search_textbox { + width: 100%; + height: 40px; + border: none; + padding-left: 10px; + } + + #search_type { + margin-bottom: -1px; + } + + .search_button:hover { + transform: scale(1.5); + transition: all 1s; + outline: none; + border: none; + } + +.width-percent-5 { + width: 5% +} + +.width-percent-10 { + width: 10% +} + +.inner_table { + margin-bottom: 0px; +} + +.noPadding { + padding: 0px; +} + +.width-percent-25 { + width: 25%; +} + +.m-r-5 { + margin-right: 5px; +} + +.box { + height: 70px; +} + +.search-btn { + cursor: pointer; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.html b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.html new file mode 100644 index 0000000..bfdfefc --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.html @@ -0,0 +1,176 @@ +
+
+ + + {{ item.itemName }} + + +
+
+
+
+
+

{{ currentLanguageSet?.inventory?.dispensingItem }}

+
+ +
+
+ + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.itemName }} + + {{ element?.itemName.itemName }} +
+ + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.itemDispense?.batchNo }} + + {{ batchElement?.batchNo?.batchNo }} + + {{ currentLanguageSet?.inventory?.issueQuantity }} + + {{ batchElement?.batchNo?.issuedQuantity }} + + {{ currentLanguageSet?.inventory?.dateOfIssue }} + + {{ batchElement?.batchNo?.dateofIssue }} + + {{ currentLanguageSet?.inventory?.returnQuantity }} + + {{ batchElement?.batchNo?.returnQuantity }} +
+ + + + {{ currentLanguageSet?.bendetails?.edit }} + + + + + + + + + {{ currentLanguageSet?.inventory?.delete }} + + + delete + + + + + + +
+
+
+
+
+ + +
+
+
diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.spec.ts b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.spec.ts new file mode 100644 index 0000000..57bd03e --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.spec.ts @@ -0,0 +1,47 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ItemBatchDetailsForPatientReturnComponent } from './item-batch-details-for-patient-return.component'; + +describe('ItemBatchDetailsForPatientReturnComponent', () => { + let component: ItemBatchDetailsForPatientReturnComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ItemBatchDetailsForPatientReturnComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent( + ItemBatchDetailsForPatientReturnComponent, + ); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts new file mode 100644 index 0000000..94e71a7 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts @@ -0,0 +1,272 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Input, + EventEmitter, + Output, + DoCheck, +} from '@angular/core'; +import { + NgForm, + FormBuilder, + FormArray, + Validators, + FormGroup, +} from '@angular/forms'; +import { InventoryService } from '../../../inventory/shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SearchComponent } from '../../../core/components/search/search.component'; +import { Router } from '@angular/router'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { PatientReturnBatchDetailsComponent } from '../patient-return-batch-details/patient-return-batch-details.component'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-item-batch-details-for-patient-return', + templateUrl: './item-batch-details-for-patient-return.component.html', + styleUrls: ['./item-batch-details-for-patient-return.component.css'], +}) +export class ItemBatchDetailsForPatientReturnComponent + implements OnInit, DoCheck +{ + @Input() + itemMasterList: any; + + @Input() + benRegId: any; + + @Output() + resetBenDetails: EventEmitter = new EventEmitter(); + + itemReturnForm!: FormGroup; + // batchList: any; + batchList = new MatTableDataSource(); + selectedItemList: any = []; + filterItemList: any = []; + + // selectedBatchList: any = []; + selectedBatchList = new MatTableDataSource(); + patientReturnList: any = []; + + searched = false; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + hide = false; + displayedColumns: string[] = [ + 'sNo', + 'itemName', + 'batchNo', + 'issuedQuantity', + 'dateofIssue', + 'returnQuantity', + 'edit', + 'delete', + ]; + constructor( + private fb: FormBuilder, + private dialog: MatDialog, + private http_service: LanguageService, + private inventoryService: InventoryService, + private confirmationService: ConfirmationService, + private router: Router, + ) {} + + ngOnInit() { + this.itemReturnForm = this.createItemReturnForm(); + this.fetchLanguageResponse(); + if (this.itemMasterList.length > 0) { + this.filterItemList = this.itemMasterList; + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.itemnotIssuedforthebeneficiary, + ); + } + console.log('itemListttttt......', this.itemMasterList, this.benRegId); + } + + createItemReturnForm() { + return this.fb.group({ + itemName: null, + batchList: new FormArray([]), + }); + } + + get itemName() { + return this.itemReturnForm.controls['itemName'].value; + } + + getBatchDetail(formvalue: any, editIndex: any) { + let batchReq; + let data: any; + if (editIndex == null) { + batchReq = { + benRegID: this.benRegId, + itemID: formvalue.itemID, + facilityID: localStorage.getItem('facilityID'), + }; + data = this.itemReturnForm.value; + console.log('Data if editIndex is null', data); + } else { + batchReq = { + benRegID: this.benRegId, + itemID: formvalue.itemName.itemID, + facilityID: localStorage.getItem('facilityID'), + }; + data = formvalue; + console.log('Data if editIndex is not null', data); + } + this.inventoryService.getBatchDetails(batchReq).subscribe((response) => { + console.log('Response of item batch list', response); + if (response.statusCode == 200) { + this.batchList.data = response.data; + this.popOutBenAndItemDetails(this.batchList.data, data, editIndex); + } + console.log('Batchlist::', JSON.stringify(this.batchList.data, null, 4)); + }); + } + + popOutBenAndItemDetails(batchList: any, formvalue: any, editIndex: any) { + console.warn(batchList); + const itemName = formvalue.itemName; + console.log('Itemmmmm', itemName); + const matDialogRef: MatDialogRef = + this.dialog.open(PatientReturnBatchDetailsComponent, { + // height: '90%', + // width: '80%', + panelClass: 'fit-screen', + data: { + batchList: batchList, + editIndex: editIndex, + editBatch: formvalue, + }, + disableClose: false, + }); + matDialogRef.afterClosed().subscribe((selectedBatchList: any) => { + if (selectedBatchList) { + if (editIndex != null) { + this.selectedBatchList.data.splice(editIndex, 1); + this.selectedBatchList.data.push(selectedBatchList.value); + this.itemReturnForm.patchValue({ + itemName: null, + }); + } else { + this.selectedBatchList.data.push(selectedBatchList.value); + this.itemReturnForm.patchValue({ + itemName: null, + }); + const filterItemMasterList = this.filterItemList; + this.filterItem(itemName, filterItemMasterList); + } + } else { + this.itemReturnForm.patchValue({ + itemName: null, + }); + } + }); + } + + removeAddedItem(i: any) { + const removedItem = this.selectedBatchList.data[i]; + this.filterItemList.push(removedItem.itemName); + this.selectedBatchList.data.splice(i, 1); + } + + filterItem(itemName: any, filterItemMasterList: any) { + this.selectedItemList.push(itemName); + console.log('selectedItemList', this.selectedItemList); + this.filterItemList = []; + this.filterItemList = filterItemMasterList.filter((item: any) => { + if (itemName && itemName.itemName && itemName.itemName != null) { + return itemName.itemName != item.itemName; + } + return; + }); + } + openSearchDialog() { + const mdDialogRef: MatDialogRef = this.dialog.open( + SearchComponent, + { + // height: '80%', + // width: '80%', + panelClass: 'fit-screen', + disableClose: false, + }, + ); + } + editItem(item: any, i: any) { + this.getBatchDetail(item, i); + } + + manipulateFinalData() { + const finalData: any = []; + this.selectedBatchList.data.forEach((item: any) => { + item.batchList.forEach((batch: any) => { + const returnQuantity = batch.returnQuantity; + const createdBy = localStorage.getItem('userName'); + const batchNo = Object.assign(batch.batchNo, { + returnQuantity, + createdBy, + }); + finalData.push(batchNo); + }); + }); + console.log('finalData', finalData); + this.savePatientReturnBatch(finalData); + } + + savePatientReturnBatch(finalData: any) { + this.inventoryService + .updateQuantityReturned(finalData) + .subscribe((response) => { + if (response.statusCode == 200) { + this.confirmationService.alert(response.data.response, 'success'); + this.resetFieldsAfterSubmit(); + this.resetBenDetails.emit(false); + } + }); + } + + resetFieldsAfterSubmit() { + this.itemReturnForm.reset(); + this.selectedBatchList.data = []; + } + resetOnClear() { + this.resetFieldsAfterSubmit(); + this.resetBenDetails.emit(false); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.css b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.css new file mode 100644 index 0000000..987e0f6 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.css @@ -0,0 +1,43 @@ +.input-full-width { + width: 100%; +} + +.m-t-30 { + margin-top: 30px; +} + +.container-fluid { + padding: 24px !important; +} + +.display{ + padding-bottom: 20px; +} + + +.title { + margin: 0px 0px 10px; + padding: 15px 24px 15px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #336CFB; +} + +.title h4 { + display: inline-block; +} + +.title .exit { + cursor: pointer; +} + +.actionButton { + float: right; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} diff --git a/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.html b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.html new file mode 100644 index 0000000..77baa97 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.html @@ -0,0 +1,215 @@ +
+

{{ title }}

+ +
+
+
+
+
+
+
+ + + {{ item.itemName }} + + +
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + {{ + currentLanguageSet?.itemDispense?.batchNo + }} + + {{ batchItem.batchNo }} + + + + {{ currentLanguageSet?.inventory?.issueQuantity }} + + + + + + {{ currentLanguageSet?.inventory?.dateOfIssue }} + + + + + + + + {{ currentLanguageSet?.inventory?.returnQuantity }} + + + + + + {{ currentLanguageSet?.bendetails?.action }} + + +
+
+
+
+
+
+
+ + +
+
+
+
+
diff --git a/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.spec.ts b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.spec.ts new file mode 100644 index 0000000..a8cd356 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PatientReturnBatchDetailsComponent } from './patient-return-batch-details.component'; + +describe('PatientReturnBatchDetailsComponent', () => { + let component: PatientReturnBatchDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PatientReturnBatchDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PatientReturnBatchDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.ts b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.ts new file mode 100644 index 0000000..784063a --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-batch-details/patient-return-batch-details.component.ts @@ -0,0 +1,308 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck } from '@angular/core'; +import { + FormGroup, + FormBuilder, + FormArray, + AbstractControl, +} from '@angular/forms'; +import { InventoryService } from './../../../inventory/shared/service/inventory.service'; +import { ConfirmationService } from './../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-patient-return-batch-details', + templateUrl: './patient-return-batch-details.component.html', + styleUrls: ['./patient-return-batch-details.component.css'], +}) +export class PatientReturnBatchDetailsComponent implements OnInit, DoCheck { + batchForm!: FormGroup; + today!: Date; + + itemBatchList: any = []; + masterItemBatchList = []; + enableEditMode = false; + editBatchList: any; + selectedBatchList: any = []; + filteredBatchList: any = []; + + title!: string; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + dataSource!: MatTableDataSource; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + private formBuilder: FormBuilder, + private http_service: LanguageService, + private inventoryService: InventoryService, + private confirmationService: ConfirmationService, + ) {} + filterItemList: any = []; + ngOnInit() { + this.fetchLanguageResponse(); + this.batchForm = this.createBatchForm(); + console.log('Data', this.data); + this.filterItemList.push(this.data.editBatch.itemName); + this.initAfterNg(); + } + + initAfterNg() { + if (this.data !== undefined) { + this.masterItemBatchList = this.data.batchList; + this.itemBatchList = this.data.batchList; + if (this.data.editIndex != null) { + this.title = this.currentLanguageSet.inventory.editBatchSelection; + } else { + this.title = this.currentLanguageSet.itemDispense.batchSelection; + const item = this.data.editBatch; + console.log('Item', JSON.stringify(item, null, 4)); + // this.setItem(item); + } + this.title; + console.log('this.data', this.data); + if (this.data.editBatch != null) { + if ( + this.data.editBatch.batchList && + this.data.editBatch.batchList.length > 0 + ) { + this.enableEditMode = true; + this.editBatchList = this.data.editBatch; + this.batchForm.patchValue(this.data.editBatch); + this.addBatch(); + this.handleBatchData(); + } else { + this.addBatch(); + this.editableBatch(this.data.editBatch); + } + } else { + this.editBatchList = []; + this.addBatch(); + } + } + } + + setItem(editBatch: any) { + console.log('editBatch', editBatch.itemName.itemName); + const item = editBatch.itemName.itemName; + this.batchForm.patchValue({ + itemName: editBatch.itemName.itemName, + itemDetails: editBatch.itemName, + }); + } + + createBatchForm() { + return this.formBuilder.group({ + itemName: null, + itemDetails: null, + batchList: this.formBuilder.array([]), + }); + } + + editableBatch(editBatchList: any) { + this.editBatchList = editBatchList; + this.batchForm.patchValue(editBatchList); + } + + handleBatchData() { + const formBatchList = this.batchForm.controls['batchList']; + const temp = this.data.editBatch.batchList.slice(); + + for (let i = 0; i < temp.length; i++) { + const batchArray = this.masterItemBatchList.filter((item: any) => { + return item.batchNo == temp[i].batchNo.batchNo; + }); + + if (batchArray.length > 0) { + temp[i].batchNo = batchArray[0]; + } + + if (temp[i].batchNo.batchNo) { + const k = formBatchList.get('' + i); + if (k) { + k.patchValue(temp[i]); + k.markAsTouched(); + this.getQuantityAndFilterItem(temp[i].batchNo, i); + } else { + throw new Error('Form control at index ${i} is null'); + } + } + if (i + 1 < temp.length) { + this.addBatch(); + } + } + } + + initBatchForm(): FormGroup { + return this.formBuilder.group({ + batchNo: null, + issuedQuantity: null, + dateOfIssue: null, + returnQuantity: null, + }); + } + + getQuantityAndFilterItem(selectedBatch: any, i: any, batchForm?: FormGroup) { + console.log('selectedBatch', selectedBatch); + + const selectedBatchList = this.selectedBatchList[i]; + this.filteredBatchList.map((item: any, t: any) => { + console.log('item, t', item, t); + + const index = item.indexOf(selectedBatch); + console.log('index', index); + + if (index != -1 && t != i) { + console.log('item', item); + + item = item.splice(index, 1); + } + }); + console.log('filteredBatchList', this.filteredBatchList); + + this.selectedBatchList[i] = selectedBatch; + + const dateOfIssue = (this.today = new Date(selectedBatch.dateofIssue)); + if (batchForm != undefined) { + batchForm.patchValue({ + issuedQuantity: selectedBatch.issuedQuantity, + dateOfIssue: dateOfIssue, + returnQuantity: null, + }); + } + // const quantityOnBatch = selectedBatch.quantityInHand; + } + + stroreStockTableData(): AbstractControl[] { + return (this.batchForm.get('batchList') as FormArray).controls; + } + + addBatch() { + const batchList = this.batchForm.controls['batchList']; + const tempBatch = batchList.value; + if (this.itemBatchList.length > tempBatch.length) { + if (this.itemBatchList) { + const resultBatch = this.itemBatchList.filter((batch: any) => { + const batchArray = tempBatch.filter((item: any) => { + if ( + item.batchNo && + item.batchNo != null && + item.batchNo.batchNo != null + ) { + return item.batchNo.batchNo == batch.batchNo; + } + else{ + return null; + } + }); + const batchFlag = batchArray.length == 0 ? true : false; + return batchFlag; + }); + this.filteredBatchList.push(resultBatch.slice()); + } + batchList.push(this.initBatchForm()); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.nofurtherbatchesavailable, + ); + } + } + + removeBatch(i: any, batchForm: any) { + const batchList = this.batchForm.controls['batchList']; + if (batchList.length == 1 && !!batchForm) { + batchForm.patchValue({ + batchNo: null, + issuedQuantity: null, + dateOfIssue: null, + returnQuantity: null, + }); + // this.calculateDispenseQuantity(); + } else { + const removedBatch = this.selectedBatchList[i]; + this.filteredBatchList.map((item: any, t: any) => { + if (t != i && removedBatch) { + item.push(removedBatch); + } + }); + this.selectedBatchList.splice(i, 1); + this.filteredBatchList.splice(i, 1); + batchList.removeAt(i); + // this.calculateDispenseQuantity(); + } + } + + checkValidity(batchForm: FormGroup) { + const batchList = this.batchForm.controls['batchList']; + const tempBatch = batchForm.value; + if (batchList.length != this.masterItemBatchList.length) { + if (tempBatch.returnQuantity) { + return false; + } else { + return true; + } + } else { + return true; + } + } + + checkQuantity(batch?: FormGroup) { + if (batch) { + const quantity = batch.value.returnQuantity; + if (batch.value.returnQuantity == 0) { + this.confirmationService.alert( + this.currentLanguageSet.inventory + .pleaseenterquantitygreaterthanzeroandlessthanorequaltoQtyinBatch, + ); + batch.patchValue({ returnQuantity: null }); + batch.markAsPristine(); + } else if (batch.value.issuedQuantity < batch.value.returnQuantity) { + this.confirmationService.alert( + this.currentLanguageSet.inventory + .pleaseenterquantitylessthanorequaltoQtyinBatch, + ); + batch.patchValue({ returnQuantity: null }); + batch.markAsPristine(); + } + } + } + saveAndUpdateItem() { + this.dialogRef.close(this.batchForm); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.css b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.css new file mode 100644 index 0000000..ca22514 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.css @@ -0,0 +1,40 @@ +.mdIcon { + vertical-align: text-bottom; +} + +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} +.title .exit { + cursor: pointer; +} + +.previous-btn { + margin: 5px 0px; +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +.vertical-align-middle { + vertical-align: middle; +} +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; + } + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} diff --git a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.html b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.html new file mode 100644 index 0000000..eb232aa --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.html @@ -0,0 +1,231 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousPatientReturn }} +

+
+
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} +
+
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ filteredPatientReturnList.data.length }} +
+
+ +
+
+ + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.patientName }} + + {{ return?.patientName }} + + {{ currentLanguageSet?.inventory?.itemName }} + + {{ return?.itemName }} + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + {{ return?.batchNo }} + + {{ currentLanguageSet?.inventory?.dateOfIssue }} + + {{ return?.dateofIssue | istDate: "dd/MM/yyyy" }} + + {{ currentLanguageSet?.inventory?.dateOfReturn }} + + {{ return?.returnDate | istDate: "dd/MM/yyyy" }} + + {{ currentLanguageSet?.itemDispense?.quantityinHand }} + + {{ return?.issuedQuantity }} +
+
+ + + {{ + currentLanguageSet?.inventory?.norecordsfound + }} + + +
+
+
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.spec.ts b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.spec.ts new file mode 100644 index 0000000..7c13dd4 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PatientReturnPreviousRecordComponent } from './patient-return-previous-record.component'; + +describe('PatientReturnPreviousRecordComponent', () => { + let component: PatientReturnPreviousRecordComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PatientReturnPreviousRecordComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PatientReturnPreviousRecordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts new file mode 100644 index 0000000..32dc5f2 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts @@ -0,0 +1,159 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { DataStorageService } from '../../shared/service/data-storage.service'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { Location } from '@angular/common'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-patient-return-previous-record', + templateUrl: './patient-return-previous-record.component.html', + styleUrls: ['./patient-return-previous-record.component.css'], +}) +export class PatientReturnPreviousRecordComponent implements OnInit, DoCheck { + today: any; + fromDate: any; + toDate: any; + patientReturnList: any = []; + + filterTerm: any; + filteredPatientReturnList = new MatTableDataSource(); + // filteredPatientReturnList: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private location: Location, + private dialog: MatDialog, + private router: Router, + private http_service: LanguageService, + private dataStorageService: DataStorageService, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.initializeDate(); + this.fetchLanguageResponse(); + } + + initializeDate() { + this.fromDate = new Date(); + this.fromDate.setHours(0, 0, 0, 0); + this.toDate = new Date(); + + this.fromDate.setHours(0); + this.fromDate.setMinutes(0); + this.fromDate.setSeconds(0); + this.fromDate.setMilliseconds(0); + + this.toDate.setHours(23); + this.toDate.setMinutes(59); + this.toDate.setSeconds(59); + this.toDate.setMilliseconds(0); + + this.today = new Date(); + this.viewRecords(); + } + + viewRecords() { + const startDate: Date = new Date(this.fromDate); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this.toDate); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + const temp = { + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: localStorage.getItem('facilityID') + ? +localStorage.getItem('facilityID')! + : undefined, + }; + + this.inventoryService.getPatientReturnList(temp).subscribe((response) => { + console.log('res..', response); + this.patientReturnList = response.data.slice(); + console.log('patientReturnList', this.patientReturnList); + this.filteredPatientReturnList.data = response.data.slice(); + console.log( + 'filteredPatientReturnList', + this.filteredPatientReturnList.data, + ); + }); + } + + goBack() { + this.location.back(); + } + + filterPatientReturnList(filterTerm: any) { + if (!filterTerm) + this.filteredPatientReturnList.data = this.patientReturnList.slice(); + else { + this.filteredPatientReturnList.data = []; + this.patientReturnList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'itemName' || + key == 'batchNo' || + key == 'dateofIssue' || + key == 'patientName' || + key == 'returnDate' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this.filteredPatientReturnList.data.push(item); + break; + } + } + } + }); + } + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/patient-return/patient-return.component.css b/src/app/app-modules/inventory/patient-return/patient-return.component.css new file mode 100644 index 0000000..7d0cce1 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return.component.css @@ -0,0 +1,88 @@ +.input-full-width { + width: 100%; +} + +.searchBox { + background: #fff; + min-height: 40px; + overflow: hidden; + border-radius: 2px; + border-width: 0px; + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.08); + } + + .search_icon { + font-weight: bold; + } + + .search_button { + padding: 0; + width: 40px; + min-height: 40px; + background: none; + border: none; + transform: scale(1); + transition: all 1s; + outline: none; + } + + .search_button:active { + outline: none; + border: none; + } + + .search_textbox { + width: 100%; + height: 40px; + border: none; + padding-left: 10px; + } + + #search_type { + margin-bottom: -1px; + } + + .search_button:hover { + transform: scale(1.5); + transition: all 1s; + outline: none; + border: none; + } + +.width-percent-5 { + width: 5% +} + +.width-percent-10 { + width: 10% +} + +.inner_table { + margin-bottom: 0px; +} + +.noPadding { + padding: 0px; +} + +.width-percent-25 { + width: 25%; +} + +.m-r-5 { + margin-right: 5px; +} + +.box { + height: 70px; +} + +.search-btn { + cursor: pointer; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + diff --git a/src/app/app-modules/inventory/patient-return/patient-return.component.html b/src/app/app-modules/inventory/patient-return/patient-return.component.html new file mode 100644 index 0000000..1ef1fb6 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return.component.html @@ -0,0 +1,122 @@ +
+
+
+
+

+ {{ currentLanguageSet?.inventory?.patientReturns }} +

+
+
+ +
+
+ +
+
+ + + search + +
+
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/patient-return/patient-return.component.spec.ts b/src/app/app-modules/inventory/patient-return/patient-return.component.spec.ts new file mode 100644 index 0000000..5aae1e3 --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PatientReturnComponent } from './patient-return.component'; + +describe('PatientReturnComponent', () => { + let component: PatientReturnComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PatientReturnComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PatientReturnComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/patient-return/patient-return.component.ts b/src/app/app-modules/inventory/patient-return/patient-return.component.ts new file mode 100644 index 0000000..aed0edf --- /dev/null +++ b/src/app/app-modules/inventory/patient-return/patient-return.component.ts @@ -0,0 +1,222 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { + FormBuilder, + Validators, + FormGroup, + FormControl, +} from '@angular/forms'; +import { InventoryService } from './../../inventory/shared/service/inventory.service'; +import { ConfirmationService } from './../../core/services/confirmation.service'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from '../../core/services/language.service'; +import { BenificiaryDetailsComponent } from './benificiary-details/benificiary-details.component'; + +@Component({ + selector: 'app-patient-return', + templateUrl: './patient-return.component.html', + styleUrls: ['./patient-return.component.css'], +}) +export class PatientReturnComponent implements OnInit, DoCheck { + patientReturnForm!: FormGroup; + beneficiaryDetailsList: any = []; + + itemMasterList: any = []; + benSelected = false; + + selectedItemList = []; + filterItemList = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private fb: FormBuilder, + private dialog: MatDialog, + private http_service: LanguageService, + private inventoryService: InventoryService, + private confirmationService: ConfirmationService, + ) {} + + ngOnInit() { + this.patientReturnForm = this.createPatientReturnForm(); + this.fetchLanguageResponse(); + } + + createPatientReturnForm() { + return this.fb.group({ + beneficiaryIDOrPhoneNumber: null, + beneficiaryID: [{ value: null, disabled: true }], + benRegId: null, + name: [{ value: null, disabled: true }], + age: [{ value: null, disabled: true }], + gender: [{ value: null, disabled: true }], + }); + } + + get beneficiaryIDOrPhoneNumber() { + return this.patientReturnForm.controls['beneficiaryIDOrPhoneNumber'].value; + } + + get beneficiaryID() { + return this.patientReturnForm.controls['beneficiaryID'].value; + } + + get name() { + return this.patientReturnForm.controls['name'].value; + } + + get age() { + return this.patientReturnForm.controls['age'].value; + } + + get gender() { + return this.patientReturnForm.controls['gender'].value; + } + + get benRegId() { + return this.patientReturnForm.controls['benRegId'].value; + } + + initpatientReturnList() { + return this.fb.group({ + itemName: null, + batchID: null, + issueQuantity: null, + dateOfIssue: null, + returnQuantity: null, + }); + } + + identityQuickSearch(beneficiaryIDOrPhoneNumber: string) { + if (beneficiaryIDOrPhoneNumber.length == 10) { + this.phoneNumberSearch(beneficiaryIDOrPhoneNumber); + } else if (beneficiaryIDOrPhoneNumber.length == 12) { + this.beneficiarySearch(beneficiaryIDOrPhoneNumber); + } + } + + openBenDetailsModal() { + const mdDialogRef: MatDialogRef = + this.dialog.open(BenificiaryDetailsComponent, { + // height: '90%', + width: '80%', + panelClass: 'fit-screen', + data: { + beneficiaryDetailsList: this.beneficiaryDetailsList, + }, + disableClose: false, + }); + mdDialogRef.afterClosed().subscribe((benificiary) => { + if (benificiary) { + this.patchData(benificiary); + this.itemSearch(benificiary); + } + }); + } + + phoneNumberSearch(phoneNumber: any) { + this.inventoryService + .getBeneficiaryByPhoneNumber({ + phoneNo: phoneNumber, + }) + .subscribe((response) => { + console.log('response', response); + this.reponseDataCheck(response); + }); + } + + reponseDataCheck(response: any) { + if (response.statusCode == 200) { + if (response.data.length > 0) { + this.beneficiaryDetailsList = response.data; + this.openBenDetailsModal(); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.nobeneficiarydetailsavailable, + ); + } + } + } + beneficiarySearch(beneficiaryID: any) { + this.inventoryService + .getBeneficiaryByBeneficiaryID({ + beneficiaryID: beneficiaryID, + }) + .subscribe((response) => { + console.log('response', response); + this.reponseDataCheck(response); + }); + } + openSearchDialog() {} + patchData(benDetails: any) { + this.patientReturnForm.patchValue({ + beneficiaryID: benDetails.beneficiaryID, + benRegId: benDetails.beneficiaryRegID, + name: benDetails.firstName + ? benDetails.firstName + : '' + benDetails.lastName + ? benDetails.lastName + : '', + age: benDetails.age, + gender: benDetails.m_gender.genderName, + }); + } + + itemSearch(beneficiary: any) { + console.log('Beneficiary details..', beneficiary); + if (beneficiary != undefined) { + this.inventoryService + .getItemList({ + benRegID: beneficiary.beneficiaryRegID, + facilityID: localStorage.getItem('facilityID'), + }) + .subscribe((response) => { + console.log(this.itemMasterList); + + this.itemMasterList = response.data; + this.benSelected = true; + + this.filterItemList = response.data; + }); + } + } + + resetBenDetails(event: any) { + console.log('event', event); + this.benSelected = false; + this.patientReturnForm.reset(); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.css b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.css new file mode 100644 index 0000000..105eec5 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.css @@ -0,0 +1,36 @@ +.modal-dialog{ + overflow: auto +} + + +.modal-body{ + overflow: auto ; + position: relative; + height: 100%; + width: 100%; +} + +.fade{ + height: 100vh; + width: 100vw; + box-shadow: 0 3px 5px #00000005,0 0 2px #0000000d,0 1px 4px #00000014!important; + +} + +.modal-centre{ + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + +} + +.sticky-top{ + position: sticky; + top: 0; + background-color: #43a047; + z-index: 999; + +} + diff --git a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.html b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.html new file mode 100644 index 0000000..7619b7b --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.html @@ -0,0 +1,90 @@ +
+
+
+ + {{currentLanguageSet?.inventory?.inwardDate}} + + + + +
+
+ +
+
+

Note:{{currentLanguageSet?.inventory?.failedStockEntryMessage}}

+ + +
+ + + +
+
\ No newline at end of file diff --git a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.spec.ts b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.spec.ts new file mode 100644 index 0000000..c695476 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EAushadhaComponent } from './e-aushadha.component'; + +describe('EAushadhaComponent', () => { + let component: EAushadhaComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EAushadhaComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EAushadhaComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts new file mode 100644 index 0000000..6e62d5a --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts @@ -0,0 +1,108 @@ +import { DatePipe } from '@angular/common'; +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { ConfirmationService } from 'src/app/app-modules/core/services/confirmation.service'; + +@Component({ + selector: 'app-e-aushadha', + templateUrl: './e-aushadha.component.html', + styleUrls: ['./e-aushadha.component.css'], + providers:[DatePipe] +}) +export class EAushadhaComponent implements OnInit, DoCheck { + eAushadhaForm!: FormGroup; + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + facilityID: any; + today!: Date; + isPopupOpen = false; + failedRecordsArray: any[] = []; + failedRecordsFlag = false; + showProgressBar = false; + inwardDate: any; + + constructor( private fb: FormBuilder, + private datePipe: DatePipe, + private http_service: LanguageService, + private dialogService: ConfirmationService, + private inventoryService: InventoryService) { } + + ngOnInit() { + this.facilityID = localStorage.getItem('facilityID') + this.eAushadhaForm = this.createeAushadhaForm(); + this.today = new Date(); + if(this.failedRecordsArray === null || this.failedRecordsArray === undefined || this.failedRecordsArray.length === 0){ + this.failedRecordsFlag = false; + } + } + ngDoCheck(){ + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + + createeAushadhaForm() { + return this.fb.group({ + eAushadhaDateField: null + }); + + } + + geteAushadhaDate(){ + this.failedRecordsFlag = false; + const formDate = this.eAushadhaForm.controls["eAushadhaDateField"].value; + const inwardDate = this.datePipe.transform(formDate, 'yyyy-MM-dd') + this.showProgressBar = true; + const reqObj = { + "inwardDate" : inwardDate, + "facilityId": this.facilityID + } + + + if(this.failedRecordsArray === null || this.failedRecordsArray === undefined || this.failedRecordsArray.length === 0){ + this.failedRecordsFlag = false; + } + + this.inventoryService.saveEAusadha(reqObj) + .subscribe((response: any) => { + if (response.statusCode == 200 && response.data ) { + this.showProgressBar = false; + this.dialogService.alert(response.data.response.response, 'success'); + this.reset(); + this.failedRecordsArray = response.data.failedStocks; + if(this.failedRecordsArray.length>0){ + this.failedRecordsFlag = true; + } + else{ + this.failedRecordsFlag = false; + } + } + else if (response.statusCode == 5000) { + this.failedRecordsFlag = false; + this.reset(); + this.dialogService.alert("Error while entering the stocks", 'error'); + } + }, (err: any) => { + this.reset(); + this.failedRecordsFlag = false; + this.dialogService.alert(err, 'error'); + }) + } + + reset() { + this.eAushadhaForm = this.createeAushadhaForm(); + this.today = new Date(); + } + + onInwardDateChange(){ + this.failedRecordsFlag = false; + } + + } diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.css b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.css new file mode 100644 index 0000000..6ebc5a2 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.css @@ -0,0 +1,52 @@ +.input-full-width { + width: 100%; +} + +.m-b-40 { + margin-bottom: 200px; +} + +.m-r-5 { + margin-right: 5px; +} + +.icon-remove { + margin: 16px; +} + +.width5 { + width: 5%; +} + +.width25 { + width: 25%; +} + +.width20 { + width: 20%; +} + +.vertical-align-middle { + vertical-align: middle; +} + +.input-datepicker { + padding: 5px 8px; +} + +.search-btn { + cursor: pointer; +} + +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} +@media screen and (max-width: 768px) { + .button-full-width { + width: 100%; + /* height: 50px; */ + margin-top: 3px; + } +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.html b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.html new file mode 100644 index 0000000..8c88844 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.html @@ -0,0 +1,300 @@ +
+
+
+
+

+ {{ currentLanguageSet?.inventory?.physicalStockEntry }} +

+
+
+ + + +
+
+ +
+
+ + + + + + {{ currentLanguageSet?.inventory?.pleaseenterReferenceNumber }} + + +
+ +
+ + {{ currentLanguageSet?.inventory?.date }} + + + + +
+
+ +
+
+ +
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ i + 1 }} + + + + {{ + currentLanguageSet?.inventory?.itemName + }} + + + + search + + + + + + {{ + currentLanguageSet?.inventory?.qtyInLowestUnit + }} + + + + + + + + + {{ + currentLanguageSet?.inventory?.unitCostPrice + }} + + + + + + + + + {{ + currentLanguageSet?.itemDispense?.batchNo + }} + + + + + + + + + {{ + currentLanguageSet?.itemDispense?.expiryDate + }} + + + + + + + + + + + {{ + currentLanguageSet?.inventory?.actions + }} + + delete + + + + + + + + +
+ +
+
+
+
+
+ +
+
+ + + +
+
+
+
diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.spec.ts b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.spec.ts new file mode 100644 index 0000000..3d7bc7b --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PhysicalStockEntryComponent } from './physical-stock-entry.component'; + +describe('PhysicalStockEntryComponent', () => { + let component: PhysicalStockEntryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PhysicalStockEntryComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PhysicalStockEntryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts new file mode 100644 index 0000000..7fc8701 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts @@ -0,0 +1,330 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + OnChanges, + DoCheck, + ChangeDetectorRef, +} from '@angular/core'; +import { InventoryService } from '../shared/service/inventory.service'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { + NgForm, + FormBuilder, + FormArray, + Validators, + FormGroup, + FormControl, + AbstractControl, +} from '@angular/forms'; +import { map, startWith } from 'rxjs/operators'; +import { ConfirmationService } from '../../core/services/confirmation.service'; +import { animate, style, transition, trigger } from '@angular/animations'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { LanguageService } from '../../core/services/language.service'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-physical-stock-entry', + templateUrl: './physical-stock-entry.component.html', + styleUrls: ['./physical-stock-entry.component.css'], + animations: [ + trigger('enterAnimation', [ + transition(':enter', [ + style({ opacity: 0 }), + animate('200ms', style({ opacity: 1 })), + ]), + transition(':leave', [ + style({ opacity: 1 }), + animate('200ms', style({ opacity: 0 })), + ]), + ]), + ], +}) +export class PhysicalStockEntryComponent implements OnInit, OnChanges, DoCheck { + stockItemName: any; + physicalStockEntryForm!: FormGroup; + matTableStockForm!: FormGroup; + // dataSource!: MatTableDataSource; + // dataSource = new BehaviorSubject(null); + otherDetails: any; + physicalStockList: any = []; + physicalStockTableDataList: any = []; + today!: Date; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + displayedColumns: string[] = [ + 'index', + 'itemName', + 'quantity', + 'totalCostPrice', + 'batchNo', + 'expiryDate', + 'actions', + ]; + stockEntryDate = new FormControl(new Date()); + isMainFacility = false; + + // physicalStock!: FormArray + constructor( + private changeDetectorRefs: ChangeDetectorRef, + private inventoryService: InventoryService, + private http_service: LanguageService, + private dialogService: ConfirmationService, + private fb: FormBuilder, + ) {} + dataSource = new MatTableDataSource(); + + ngOnInit() { + this.otherDetails = { + createdBy: localStorage.getItem('username'), + providerServiceMapID: localStorage.getItem('providerServiceID'), + userId: localStorage.getItem('userID'), + facilityID: localStorage.getItem('facilityID'), + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + }; + + const isMainfacilityFlag: any = localStorage.getItem('facilityDetail'); + const facilityData = JSON.parse(isMainfacilityFlag); + + if(facilityData.storeType.toUpperCase() === "MAIN"){ + this.isMainFacility = true; + } + + this.today = new Date(); + this.fetchLanguageResponse(); + this.physicalStockEntryForm = this.fb.group({ + referenceNumber: [''], + stockEntryDate: [''], + physicalStock: this.fb.array([]), + }); + this.initPhysicalStock(); + + console.log('this.physicalStockEntryForm', this.physicalStockEntryForm); + + console.log('form1', this.physicalStockEntryForm); + this.loadStockData(); + } + + loadStockData() { + const dataFromFun: any = this.physicalStockTableData(); + this.dataSource.data = dataFromFun; + } + + ngOnChanges() { + console.log('form2', this.physicalStockEntryForm); + } + + createPhysicalStockEntryForm() { + return this.fb.group({ + referenceNumber: null, + stockEntryDate: null, + }); + } + + get isMedical() { + return this.physicalStockEntryForm.controls['isMedical'].value; + } + + initPhysicalStock() { + const frmArr = this.physicalStockEntryForm.get( + 'physicalStock', + ) as FormArray; + frmArr.push( + this.fb.group({ + batchNo: ['', Validators.compose([Validators.required])], + expiryDate: [''], + itemID: ['', Validators.required], + itemName: ['', Validators.required], + quantity: ['', Validators.required], + totalCostPrice: ['', Validators.required], + isMedical: [''], + }), + ); + } + + initPhysicalStockForm() { + return this.fb.group({ + batchNo: ['', Validators.compose([Validators.required])], + expiryDate: [''], + itemID: ['', Validators.required], + itemName: ['', Validators.required], + quantity: ['', Validators.required], + totalCostPrice: ['', Validators.required], + isMedical: [''], + }); + } + + physicalStockTableData(): any { + return (this.physicalStockEntryForm.get('physicalStock') as FormArray) + .controls; + } + refresh(event: any, stock: any) { + console.log('event##', event); + stock.controls['itemName'].setValue(event.target.value); + } + get physicalStock() { + return this.physicalStockEntryForm.get('physicalStock') as FormArray; + } + + addStock() { + this.physicalStock.push(this.initPhysicalStockForm()); + this.loadStockData(); + } + + removeStock(index: any, stock?: FormGroup) { + // this.physicalStock.removeAt(index); + const stockForm = this.physicalStockEntryForm.get( + 'physicalStock', + ) as FormArray; + console.log('stockForm', stockForm); + console.log('stock', stock); + + if (stockForm.length > 1) { + stockForm.removeAt(index); + // stockForm.clear(); + this.loadStockData(); + } else { + if (stock) { + stock.reset(); + stock.controls['itemName'].enable(); + } + } + } + + savePhysicalStock() { + console.log('FORMSTOCK', this.physicalStockEntryForm); + const physicalStockEntry = JSON.parse( + JSON.stringify(this.physicalStockEntryForm.value), + ); + + physicalStockEntry.physicalStock.map((item: any) => { + item.createdBy = this.otherDetails.createdBy; + item.facilityID = this.otherDetails.facilityID; + }); + + const temp = Object.assign({}, physicalStockEntry, this.otherDetails, { + refNo: physicalStockEntry.referenceNumber, + status: 'Active', + itemStockEntry: physicalStockEntry.physicalStock, + physicalStock: undefined, + referenceNumber: undefined, + }); + + this.inventoryService.savePhysicalStock(temp).subscribe( + (response) => { + if ( + response.statusCode == 200 && + response.data && + response.data.phyEntryID + ) { + this.dialogService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.reset(); + } else this.dialogService.alert(response.status, 'error'); + }, + (err) => { + this.dialogService.alert(err, 'error'); + }, + ); + } + + reset() { + this.physicalStockEntryForm.reset(); + this.resetPhysicalStockFormArray(); + this.addStock(); + } + + resetPhysicalStockFormArray() { + const physicalStockArray = this.physicalStockEntryForm.get( + 'physicalStock', + ) as FormArray; + physicalStockArray.controls.length = 0; + } + + preventTyping(e: any) { + if (e.keyCode === 9) { + return true; + } else { + return false; + } + } + + removeAllPhysicalStock(physicalStockArray: FormArray) { + // let len = physicalStockArray.length; + + while (physicalStockArray.length > 1) { + physicalStockArray.removeAt(0); + } + // physicalStockArray.enable(); + } + + checkForDuplicateBatch(stockForm: FormGroup, index: any) { + // const index = (this.physicalStockEntryForm.get('physicalStock') as FormArray).controls.indexOf(stockForm) + const stockList = + this.physicalStockEntryForm.controls['physicalStock'].value; + const itemID = stockForm.value.itemID; + const batchNo = stockForm.value.batchNo; + + const temp = stockList.filter((stock: any, i: any) => { + if (i != index) + return ( + itemID && + stock.itemID == itemID && + batchNo && + stock.batchNo == batchNo + ); + else return false; + }); + + if (temp.length > 0) { + this.dialogService.alert( + this.currentLanguageSet.inventory.batchalreadypresent, + 'warn', + ); + stockForm.controls['batchNo'].reset(); + } + } + + getPhysicalStockControls() { + const physicalStockArray = this.physicalStockEntryForm.get( + 'physicalStock', + ) as FormArray; + return physicalStockArray.controls; + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.css b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.css new file mode 100644 index 0000000..3005056 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.css @@ -0,0 +1,39 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 15px; +} + +.h5_bold { + font-weight: bold; + display: inline-block; +} + +.m-b-15{ + margin-bottom: 15px; +} + +.greenBttn { + background: #43a047 !important; + color: white; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.html b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.html new file mode 100644 index 0000000..69332d4 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.html @@ -0,0 +1,196 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.stockEntryID }} + {{ row.phyEntryID }} + {{ currentLanguageSet?.inventory?.refNo }} + {{ row.refNo }} + {{ currentLanguageSet?.inventory?.storeID }} + {{ row.facilityID }} + {{ currentLanguageSet?.inventory?.createdBy }} + {{ row.createdBy }} + {{ currentLanguageSet?.inventory?.createdDate }} + + {{ row.createdDate | istDate: "dd/MM/yyyy" }} +
+ +
+
+ + + search + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + {{ currentLanguageSet?.inventory?.itemName }} + {{ row.item.itemName }} + {{ currentLanguageSet?.itemDispense?.batchNo }} + {{ row.batchNo }} + {{ currentLanguageSet?.itemDispense?.expiryDate }} + + {{ row.expiryDate | date: "dd/MM/yyyy" }} + + {{ currentLanguageSet?.inventory?.quantity }} + {{ row.quantity }}
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ _filteredDetailedList.data.length }} +
+ +
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.spec.ts b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.spec.ts new file mode 100644 index 0000000..4745df8 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewPhysicalStockDetailsComponent } from './view-physical-stock-details.component'; + +describe('ViewPhysicalStockDetailsComponent', () => { + let component: ViewPhysicalStockDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewPhysicalStockDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewPhysicalStockDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.ts b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.ts new file mode 100644 index 0000000..b52e096 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock-details/view-physical-stock-details.component.ts @@ -0,0 +1,138 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Inject, + OnDestroy, + DoCheck, + ViewChild, +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-view-physical-stock-details', + templateUrl: './view-physical-stock-details.component.html', + styleUrls: ['./view-physical-stock-details.component.css'], +}) +export class ViewPhysicalStockDetailsComponent + implements OnInit, OnDestroy, DoCheck +{ + _filterTerm = ''; + _detailedList: any = []; + // _filteredDetailedList: any = []; + _filteredDetailedList = new MatTableDataSource(); + blankTable = [1, 2, 3, 4, 5]; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + dataSourceList = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + + constructor( + private http_service: LanguageService, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + ngOnInit() { + this.populateStockEntryItems(this.data); + // this.dataSourceList.data = this.data; + this.fetchLanguageResponse(); + } + + ngOnDestroy(): void { + //Called once, before the instance is destroyed. + //Add 'implements OnDestroy' to the class. + this.data = ''; + } + populateStockEntryItems(data: any) { + console.log(data); + if (data && data.entryDetails && data.stockEntry) { + // this.dataSourceList.data = this.data.stockEntry; + const entries = data.entryDetails; + const stockEntries = JSON.parse(JSON.stringify(data.stockEntry)); + this.dataSourceList.data.push(stockEntries); + this._detailedList = entries.data; + this._filteredDetailedList.data = entries.data; + this._filteredDetailedList.paginator = this.paginator; + } + } + + filterDetails(filterTerm: string) { + console.log(filterTerm); + if (!filterTerm) { + this._filteredDetailedList.data = this._detailedList; + this._filteredDetailedList.paginator = this.paginator; + } else { + this._filteredDetailedList.data = []; + this._filteredDetailedList.paginator = this.paginator; + this._detailedList.forEach((item: any) => { + for (const key in item) { + if (key != 'item') { + if (key == 'batchNo' || key == 'quantity') { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this._filteredDetailedList.data.push(item); + this._filteredDetailedList.paginator = this.paginator; + break; + } + } + } + + if (key == 'item') { + const value: string = '' + item.item.itemName; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this._filteredDetailedList.data.push(item); + this._filteredDetailedList.paginator = this.paginator; + break; + } + } + } + }); + } + } + + print() { + this.closeViewModal(); + } + + closeViewModal() { + const modalresult = Object.assign({ print: true }); + this.dialogRef.close(modalresult); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.css b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.css new file mode 100644 index 0000000..54d58b9 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.css @@ -0,0 +1,26 @@ +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} + +.previous-btn { + margin: 5px 0px; + background: #43a047 !important +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.html b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.html new file mode 100644 index 0000000..ab5de2b --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.html @@ -0,0 +1,249 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousPhysicalStoreEntry }} +

+
+ +
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+ +
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} + +
+
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.entryID }} + + {{ row?.phyEntryID }} + + {{ currentLanguageSet?.inventory?.refNo }} + + {{ row?.refNo }} + + {{ currentLanguageSet?.bendetails?.status }} + + {{ row?.status }} + + {{ currentLanguageSet?.inventory?.createdBy }} + + {{ row?.createdBy }} + + {{ currentLanguageSet?.inventory?.createdDate }} + + {{ row?.createdDate | istDate: "dd/MM/yyyy" }} +
+
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ _filteredStockEntryList.data.length }} +
+
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.spec.ts b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.spec.ts new file mode 100644 index 0000000..0f2c1d9 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewPhysicalStockComponent } from './view-physical-stock.component'; + +describe('ViewPhysicalStockComponent', () => { + let component: ViewPhysicalStockComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewPhysicalStockComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewPhysicalStockComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts new file mode 100644 index 0000000..46e9c94 --- /dev/null +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts @@ -0,0 +1,321 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + HostListener, + ViewChild, + DoCheck, +} from '@angular/core'; +import { ViewPhysicalStockDetailsComponent } from './view-physical-stock-details/view-physical-stock-details.component'; +import { Location } from '@angular/common'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { DataStorageService } from './../../shared/service/data-storage.service'; +import * as moment from 'moment'; +import { Router } from '@angular/router'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-view-physical-stock', + templateUrl: './view-physical-stock.component.html', + styleUrls: ['./view-physical-stock.component.css'], +}) +export class ViewPhysicalStockComponent implements OnInit, DoCheck { + _minDate: any; + _today: any; + + _dateRange: Date[] = []; + _dateRangePrevious: Date[] = []; + + _stockEntryList: any = []; + _filteredStockEntryList = new MatTableDataSource(); + // _filteredStockEntryList: MatTableDataSource = new MatTableDataSource(); + blankTable = [1, 2, 3, 4, 5]; + filterTerm: any; + + searched = false; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'entryID', + 'refNo', + 'status', + 'createdBy', + 'createdDate', + ]; + + constructor( + private location: Location, + private http_service: LanguageService, + private inventoryService: InventoryService, + private dataStorageService: DataStorageService, + private dialog: MatDialog, + private router: Router, + ) {} + + ngOnInit() { + this.setDateDefault(); + this.fetchLanguageResponse(); + this.getPastEntries(); + } + + setDateDefault() { + this._today = new Date(); + this._minDate = new Date(); + this._minDate.setFullYear(this._today.getFullYear() - 1); + this._dateRange[0] = this._today; + this._dateRange[1] = this._today; + + console.log(this._dateRange, 'dateRange'); + } + + getPastEntries() { + const obj = this.getViewServiceObject(); + this.inventoryService.viewPhysicalStockEntry(obj).subscribe((res) => { + this.loadEntries(res); + this.searched = true; + }); + } + + getViewServiceObject() { + const startDate: Date = new Date(this._dateRange[0]); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this._dateRange[1]); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + return { + facilityID: localStorage.getItem('facilityID'), + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + } + + updateDate() { + this.getPastEntries(); + } + + loadEntries(entriesObject: any) { + console.log(entriesObject); + console.log('ENTRIES' + entriesObject.data); + this._stockEntryList = entriesObject.data; + this._filteredStockEntryList.data = entriesObject.data; + this._filteredStockEntryList.paginator = this.paginator; + console.log('P1' + this._filteredStockEntryList); + console.log('length', this._filteredStockEntryList.data.length); + this.filterTerm = ''; + } + + filterConsumptionList(searchTerm: string) { + if (!searchTerm) { + this._filteredStockEntryList.data = this._stockEntryList; + this._filteredStockEntryList.paginator = this.paginator; + } else { + this._filteredStockEntryList.data = []; + this._filteredStockEntryList.paginator = this.paginator; + this._stockEntryList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'phyEntryID' || + key == 'refNo' || + key == 'status' || + key == 'createdBy' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(searchTerm.toLowerCase()) >= 0) { + console.log('ITEM', +item); + this._filteredStockEntryList.data.push(item); + this._filteredStockEntryList.paginator = this.paginator; + console.log('P2' + this._filteredStockEntryList.data); + break; + } + } + } + }); + } + } + + loadEntryDetails(entry: any) { + if (entry && entry.phyEntryID) { + this.inventoryService + .getParticularStockEntry(entry.phyEntryID) + .subscribe((res) => this.popOutEntryDetails(entry, res)); + } + } + + popOutEntryDetails(entry: any, stockEntryResponse: any) { + console.warn(entry, stockEntryResponse); + if (stockEntryResponse) { + const matDialogRef: MatDialogRef = + this.dialog.open(ViewPhysicalStockDetailsComponent, { + // height: '90%', + width: '80%', + panelClass: 'fit-screen', + data: { stockEntry: entry, entryDetails: stockEntryResponse }, + disableClose: false, + }); + matDialogRef.afterClosed().subscribe((result) => { + if (result) { + if (result.print != null && result.print == true) { + if (result.print) { + const printableData = this.createPrintableData( + entry, + stockEntryResponse, + ); + this.dataStorageService.physicalStock = printableData; + const uRL = 'physicalStock'; + this.router.navigate(['/inventory/dynamicPrint/', uRL]); + } + } + } + }); + } + } + createPrintableData(entry: any, stockEntryResponse: any) { + const facilityDetl: any = localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetl); + const facilityName = facilityDetail.facilityName; + const printableData: any = []; + let i = 0; + console.log( + 'stockEntryResponse', + JSON.stringify(stockEntryResponse, null, 4), + ); + stockEntryResponse.forEach((batch: any) => { + i = i + 1; + const consumedBatch = { + sNo: i, + itemName: batch.item.itemName, + batchNo: batch.batchNo, + expiryDate: moment(batch.expiryDate).format('DD-MM-YYYY'), + qod: batch.quantity, + }; + printableData.push(consumedBatch); + }); + console.log('consumptionDetails', JSON.stringify(entry, null, 4)); + const entryDetails = Object.assign( + { + facilityName: facilityName, + createDate: moment(entry.createdDate).format('DD-MM-YYYY'), + }, + entry, + ); + console.log('consumptionResponse', JSON.stringify(printableData, null, 4)); + const stockEntered = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: entryDetails }, + { columns: this.columns }, + { printableData: printableData }, + ); + return stockEntered; + } + goBack() { + this.location.back(); + } + + preventTyping(e: any) { + if (e.keyCode === 9) { + return true; + } else { + return false; + } + } + + title = { + modalTitle: '', + headerTitle: 'Stock Entry Detail', + tableTitle: '', + }; + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchNo', + columnName: 'Batch No', + }, + { + keyName: 'expiryDate', + columnName: 'Expiry Date', + }, + { + keyName: 'qod', + columnName: 'Quantity', + }, + ]; + headerColumn = [ + { + columnName: 'Stock Entry ID :', + keyName: 'phyEntryID', + }, + { + columnName: 'Facility ID :', + keyName: 'facilityID', + }, + { + columnName: 'Reference No :', + keyName: 'refNo', + }, + { + columnName: 'Created By :', + keyName: 'createdBy', + }, + { + columnName: 'Created Date :', + keyName: 'createDate', + }, + ]; + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css new file mode 100644 index 0000000..0fec98d --- /dev/null +++ b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css @@ -0,0 +1,5 @@ +/* CSS files should not be empty SonarQube Bug Fix */ +mat-form-field { + margin-right: 40px; + margin-left: 20px + } \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.html b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.html new file mode 100644 index 0000000..bb98c81 --- /dev/null +++ b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.html @@ -0,0 +1,62 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.beneficiaryDrugIssueReport }}

+
+
+ +
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + + + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.spec.ts b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.spec.ts new file mode 100644 index 0000000..62a4168 --- /dev/null +++ b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BeneficiaryDrugIssueReportComponent } from './beneficiary-drug-issue-report.component'; + +describe('BeneficiaryDrugIssueReportComponent', () => { + let component: BeneficiaryDrugIssueReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BeneficiaryDrugIssueReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BeneficiaryDrugIssueReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.ts b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.ts new file mode 100644 index 0000000..2897efb --- /dev/null +++ b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.ts @@ -0,0 +1,304 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +// import * as Excel from 'exceljs/dist/exceljs.min.js' + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +declare global { + interface Navigator { + msSaveBlob?: (blob: any, defaultName?: string) => boolean; + } +} + +@Component({ + selector: 'app-beneficiary-drug-issue-report', + templateUrl: './beneficiary-drug-issue-report.component.html', + styleUrls: ['./beneficiary-drug-issue-report.component.css'], +}) +export class BeneficiaryDrugIssueReportComponent implements OnInit, DoCheck { + beneficiaryDrugIssueForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + beneficiaryDrugIssueList: any; + dateOffset: any; + + ngOnInit() { + this.createBeneficiaryDrugIssueForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createBeneficiaryDrugIssueForm() { + this.beneficiaryDrugIssueForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + }); + } + + get startDate() { + return this.beneficiaryDrugIssueForm.controls['startDate'].value; + } + + get endDate() { + return this.beneficiaryDrugIssueForm.controls['endDate'].value; + } + + checkEndDate() { + console.log('', this.startDate); + + if (this.endDate == null) { + this.minEndDate = new Date(this.startDate); + console.log('new Date(this.today.getDate() - 1);', new Date(this.today)); + } else { + this.beneficiaryDrugIssueForm.patchValue({ + endDate: null, + }); + this.minEndDate = new Date(this.startDate); + } + } + + searchReport() { + const startDate: Date = new Date( + this.beneficiaryDrugIssueForm.value.startDate, + ); + const endDate: Date = new Date(this.beneficiaryDrugIssueForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log( + 'Data form value...', + JSON.stringify(this.beneficiaryDrugIssueForm.value), + ); + const reqObjForBeneficiaryDrugIssueReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForBeneficiaryDrugIssueReport, null, 4), + ); + + this.inventoryService + .getBeneficiaryDrugIssueReports(reqObjForBeneficiaryDrugIssueReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.beneficiaryDrugIssueList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + + if (this.beneficiaryDrugIssueList.length > 0) { + const array = this.beneficiaryDrugIssueList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', head); + const wb_name = 'Beneficiary Drug Issue Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < head.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(head, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(head); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.beneficiaryDrugIssueList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + head.forEach((header) => { + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.beneficiaryDrugIssueReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html new file mode 100644 index 0000000..a9b47f4 --- /dev/null +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html @@ -0,0 +1,81 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.consumptionReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + +
+
+ + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+ + {{ + item + }} + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.spec.ts b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.spec.ts new file mode 100644 index 0000000..dd99ad6 --- /dev/null +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConsumptionReportComponent } from './consumption-report.component'; + +describe('ConsumptionReportComponent', () => { + let component: ConsumptionReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ConsumptionReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConsumptionReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts new file mode 100644 index 0000000..bb5435c --- /dev/null +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts @@ -0,0 +1,324 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-consumption-report', + templateUrl: './consumption-report.component.html', + styleUrls: ['./consumption-report.component.css'], +}) +export class ConsumptionReportComponent implements OnInit, DoCheck { + consumptionForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + consumptionList = []; + dateOffset: any; + selectedFacilityName = JSON.parse( + localStorage.getItem('facilityDetail') || '{}', + ).facilityName; + facilities = [this.selectedFacilityName, 'All']; + //BU40088124 27/7/2022 Added Facility Name dropdown in reports + + ngOnInit() { + this.createConsumptionForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + this.setSelectedFacility(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createConsumptionForm() { + this.consumptionForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + facilityName: [null, Validators.required], + }); + } + + get startDate() { + return this.consumptionForm.controls['startDate'].value; + } + + get endDate() { + return this.consumptionForm.controls['endDate'].value; + } + + checkEndDate() { + console.log('', this.startDate); + + if (this.endDate == null) { + this.minEndDate = new Date(this.startDate); + console.log('new Date(this.today.getDate() - 1);', new Date(this.today)); + } else { + this.consumptionForm.patchValue({ + endDate: null, + }); + this.minEndDate = new Date(this.startDate); + } + } + + searchReport() { + const startDate: Date = new Date(this.consumptionForm.value.startDate); + const endDate: Date = new Date(this.consumptionForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log( + 'Data form value...', + JSON.stringify(this.consumptionForm.value), + ); + const reqObjForConsumptionReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: + this.consumptionForm.value.facilityName === 'All' + ? null + : localStorage.getItem('facilityID'), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForConsumptionReport, null, 4), + ); + + this.inventoryService + .getConsumptionReports(reqObjForConsumptionReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + + if (response.statusCode == 200) { + this.consumptionList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + setSelectedFacility() { + this.consumptionForm.patchValue({ + facilityName: this.selectedFacilityName, + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.consumptionList.length > 0) { + const array = this.consumptionList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + if (obj[key] == 'StoreSelfConsumption') { + obj[key] = 'Store Self Consumption'; + } + if (obj[key] == 't_indent') { + obj[key] = 'Indent'; + } + if (obj[key] == 'T_StockTransfer') { + obj[key] = 'StockTransfer'; + } + if (obj[key] == 'T_PatientIssue ') { + obj[key] = 'PatientIssue '; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', head); + const wb_name = 'Consumption Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < head.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(head, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(head); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + // console.log("header1", header); + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.consumptionList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + head.forEach((header) => { + // console.log("header2", header); + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.consumptionReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html new file mode 100644 index 0000000..0bf0c5f --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html @@ -0,0 +1,82 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.dailyStockDetailsReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + +
+
+ + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+ + {{ + item + }} + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.spec.ts b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.spec.ts new file mode 100644 index 0000000..8430d7b --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DailyStockDetailsReportComponent } from './daily-stock-details-report.component'; + +describe('DailyStockDetailsReportComponent', () => { + let component: DailyStockDetailsReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DailyStockDetailsReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DailyStockDetailsReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts new file mode 100644 index 0000000..5436b50 --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts @@ -0,0 +1,324 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-daily-stock-details-report', + templateUrl: './daily-stock-details-report.component.html', + styleUrls: ['./daily-stock-details-report.component.css'], +}) +export class DailyStockDetailsReportComponent implements OnInit, DoCheck { + dailyStockDetailsForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + consumptionList = []; + dateOffset: any; + + selectedFacilityName = JSON.parse( + localStorage.getItem('facilityDetail') || '{}', + ).facilityName; + facilities = [this.selectedFacilityName, 'All']; + //BU40088124 27/7/2022 Added Facility Name dropdown in reports + + ngOnInit() { + this.createDailyStockDetailsForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + this.setSelectedFacility(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createDailyStockDetailsForm() { + this.dailyStockDetailsForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + facilityName: [null, Validators.required], + }); + } + + get startDate() { + return this.dailyStockDetailsForm.controls['startDate'].value; + } + + get endDate() { + return this.dailyStockDetailsForm.controls['endDate'].value; + } + + checkEndDate(event: any) { + this.dailyStockDetailsForm.patchValue({ + endDate: event.value, + }); + } + + checkStartDate(event: any) { + this.dailyStockDetailsForm.patchValue({ + startDate: event.value, + }); + } + + searchReport() { + const startDate: Date = new Date( + this.dailyStockDetailsForm.value.startDate, + ); + const endDate: Date = new Date(this.dailyStockDetailsForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log( + 'Data form value...', + JSON.stringify(this.dailyStockDetailsForm.value), + ); + const reqObjForDailyStockDetailsReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: + this.dailyStockDetailsForm.value.facilityName === 'All' + ? null + : localStorage.getItem('facilityID'), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForDailyStockDetailsReport, null, 4), + ); + + this.inventoryService + .getDailyStockDetailsReports(reqObjForDailyStockDetailsReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.consumptionList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + setSelectedFacility() { + this.dailyStockDetailsForm.patchValue({ + facilityName: this.selectedFacilityName, + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.consumptionList.length > 0) { + const headers = [ + 'slNo', + 'date', + 'facilityName', + 'itemName', + 'itemCategory', + 'batchNo', + 'unitCostPrice', + 'expiryDate', + 'openingStock', + 'quantityReceived', + 'dispensedQuantity', + 'adjustmentReceipt', + 'adjustmentIssue', + 'closingStock', + ]; + const array = this.consumptionList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', headers); + const wb_name = 'Daily Stock Details Report'; + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < headers.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(headers, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(headers); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.consumptionList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + headers.forEach((header) => { + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.dailyStockDetailsReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End- +} diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html new file mode 100644 index 0000000..a9c9996 --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html @@ -0,0 +1,82 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.dailyStockSummaryReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + +
+
+ + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+ + {{ + item + }} + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.spec.ts b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.spec.ts new file mode 100644 index 0000000..3064e6c --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DailyStockSummaryReportComponent } from './daily-stock-summary-report.component'; + +describe('DailyStockSummaryReportComponent', () => { + let component: DailyStockSummaryReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DailyStockSummaryReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DailyStockSummaryReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts new file mode 100644 index 0000000..6b257a5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts @@ -0,0 +1,324 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +@Component({ + selector: 'app-daily-stock-summary-report', + templateUrl: './daily-stock-summary-report.component.html', + styleUrls: ['./daily-stock-summary-report.component.css'], +}) +export class DailyStockSummaryReportComponent implements OnInit, DoCheck { + dailyStockSummaryForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private http_service: LanguageService, + private inventoryService: InventoryService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + consumptionList = []; + dateOffset: any; + selectedFacilityName = JSON.parse( + localStorage.getItem('facilityDetail') || '{}', + ).facilityName; + facilities = [this.selectedFacilityName, 'All']; + + //BU40088124 27/7/2022 Added Facility Name dropdown in reports + ngOnInit() { + this.createDailyStockSummaryForm(); + this.today = new Date(); + this.setSelectedFacility(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createDailyStockSummaryForm() { + this.dailyStockSummaryForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + facilityName: [null, Validators.required], + }); + } + + get startDate() { + return this.dailyStockSummaryForm.controls['startDate'].value; + } + + get endDate() { + return this.dailyStockSummaryForm.controls['endDate'].value; + } + + checkEndDate(event: any) { + console.log('event.value', event.value); + this.dailyStockSummaryForm.patchValue({ + endDate: event.value, + }); + } + + checkStartDate(event: any) { + console.log('', this.startDate); + this.dailyStockSummaryForm.patchValue({ + startDate: event.value, + }); + } + + searchReport() { + const startDate: Date = new Date( + this.dailyStockSummaryForm.value.startDate, + ); + const endDate: Date = new Date(this.dailyStockSummaryForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log( + 'Data form value...', + JSON.stringify(this.dailyStockSummaryForm.value), + ); + const reqObjForDailyStockSummaryReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: + this.dailyStockSummaryForm.value.facilityName === 'All' + ? null + : localStorage.getItem('facilityID'), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForDailyStockSummaryReport, null, 4), + ); + + this.inventoryService + .getDailyStockSummaryReports(reqObjForDailyStockSummaryReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.consumptionList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + + setSelectedFacility() { + this.dailyStockSummaryForm.patchValue({ + facilityName: this.selectedFacilityName, + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.consumptionList.length > 0) { + const headers = [ + 'slNo', + 'date', + 'facilityName', + 'itemName', + 'itemCategory', + 'openingStock', + 'quantityReceived', + 'quantityDispensed', + 'adjustmentReceipt', + 'adjustmentIssue', + 'closingStock', + ]; + const array = this.consumptionList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + // var head = Object.keys(array[0]); + console.log(' head', headers); + const wb_name = 'Daily Stock Summary Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < headers.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(headers, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(headers); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + // console.log("header1", header); + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.consumptionList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + headers.forEach((header) => { + // console.log("header2", header); + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.dailyStockSummaryReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html new file mode 100644 index 0000000..ff3eb4d --- /dev/null +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html @@ -0,0 +1,69 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.expiryReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + +
+
+ + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.spec.ts b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.spec.ts new file mode 100644 index 0000000..077a9b8 --- /dev/null +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExpiryReportComponent } from './expiry-report.component'; + +describe('ExpiryReportComponent', () => { + let component: ExpiryReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ExpiryReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExpiryReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.ts b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.ts new file mode 100644 index 0000000..e870a5a --- /dev/null +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.ts @@ -0,0 +1,289 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-expiry-report', + templateUrl: './expiry-report.component.html', + styleUrls: ['./expiry-report.component.css'], +}) +export class ExpiryReportComponent implements OnInit, DoCheck { + expiryForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + expiryList = []; + dateOffset: any; + + ngOnInit() { + this.createExpiryForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createExpiryForm() { + this.expiryForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + }); + } + + get startDate() { + return this.expiryForm.controls['startDate'].value; + } + + get endDate() { + return this.expiryForm.controls['endDate'].value; + } + + checkEndDate() { + console.log('', this.startDate); + + if (this.endDate == null) { + this.minEndDate = new Date(this.startDate); + console.log('new Date(this.today.getDate() - 1);', new Date(this.today)); + } else { + this.expiryForm.patchValue({ + endDate: null, + }); + this.minEndDate = new Date(this.startDate); + } + } + + searchReport() { + const startDate: Date = new Date(this.expiryForm.value.startDate); + const endDate: Date = new Date(this.expiryForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log('Data form value...', JSON.stringify(this.expiryForm.value)); + const reqObjForExpiryReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForExpiryReport, null, 4), + ); + + this.inventoryService + .getExpiryReports(reqObjForExpiryReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.expiryList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.expiryList.length > 0) { + const array = this.expiryList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', head); + const wb_name = 'Expiry Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < head.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(head, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(head); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.expiryList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + head.forEach((header) => { + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.expiryReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html new file mode 100644 index 0000000..8f3fc87 --- /dev/null +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html @@ -0,0 +1,81 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.inwardStockReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + +
+
+ + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+ + {{ + item + }} + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.spec.ts b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.spec.ts new file mode 100644 index 0000000..725bb14 --- /dev/null +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InwardStockReportComponent } from './inward-stock-report.component'; + +describe('InwardStockReportComponent', () => { + let component: InwardStockReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [InwardStockReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InwardStockReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts new file mode 100644 index 0000000..42ebcce --- /dev/null +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts @@ -0,0 +1,319 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-inward-stock-report', + templateUrl: './inward-stock-report.component.html', + styleUrls: ['./inward-stock-report.component.css'], +}) +export class InwardStockReportComponent implements OnInit, DoCheck { + inwardStockForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + inwardStockList = []; + dateOffset: any; + selectedFacilityName = JSON.parse( + localStorage.getItem('facilityDetail') || '{}', + ).facilityName; + facilities = [this.selectedFacilityName, 'All']; + + //BU40088124 27/7/2022 Added Facility Name dropdown in reports + + ngOnInit() { + this.createInwardStockForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + this.setSelectedFacility(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createInwardStockForm() { + this.inwardStockForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + facilityName: [null, Validators.required], + }); + } + + get startDate() { + return this.inwardStockForm.controls['startDate'].value; + } + + get endDate() { + return this.inwardStockForm.controls['endDate'].value; + } + + checkEndDate() { + console.log('', this.startDate); + + if (this.endDate == null) { + this.minEndDate = new Date(this.startDate); + console.log('new Date(this.today.getDate() - 1);', new Date(this.today)); + } else { + this.inwardStockForm.patchValue({ + endDate: null, + }); + this.minEndDate = new Date(this.startDate); + } + } + + searchReport() { + const startDate: Date = new Date(this.inwardStockForm.value.startDate); + const endDate: Date = new Date(this.inwardStockForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log( + 'Data form value...', + JSON.stringify(this.inwardStockForm.value), + ); + const reqObjForInwardStockReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: + this.inwardStockForm.value.facilityName === 'All' + ? null + : localStorage.getItem('facilityID'), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForInwardStockReport, null, 4), + ); + + this.inventoryService + .getInwardStockReports(reqObjForInwardStockReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.inwardStockList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + + setSelectedFacility() { + this.inwardStockForm.patchValue({ + facilityName: this.selectedFacilityName, + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.inwardStockList.length > 0) { + const array = this.inwardStockList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + if (obj[key] == 'physicalStockEntry') { + obj[key] = 'Physical Stock Entry'; + } + if (obj[key] == 'T_StockTransfer') { + obj[key] = 'StockTransfer'; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', head); + const wb_name = 'Inward Stock Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < head.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(head, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(head); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + // console.log("header1", header); + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.inwardStockList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + head.forEach((header) => { + // console.log("header2", header); + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.inwardStockReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css new file mode 100644 index 0000000..84f749b --- /dev/null +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css @@ -0,0 +1,51 @@ +.input-full-width { + width: 100%; + } + + .m-b-30 { + margin-bottom: 30px; + } + + .mat-form-field { + line-height: unset !important; + } + + .vertical-align-middle { + vertical-align: middle; + } + + .title { + margin: 0px 0px 10px; + padding: 5px 24px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #0277bd; + } + + .title h4 { + display: inline-block; + } + + .title .exit { + cursor: pointer; + } + + .scrolling-content { + max-height: 75vh; + overflow: auto; + } + + .box { + height: 65px; + } + + .m-r-5{ + margin-right: 5px; + } + + /* .scrolling-content{ + overflow: auto; + max-height: 80vh; + } */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html new file mode 100644 index 0000000..cd5cac7 --- /dev/null +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html @@ -0,0 +1,64 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.monthlyReport }}

+
+
+ +
+
+
+ + {{ + month.name + }} + +
+ +
+ + {{ + year + }} + +
+
+ + {{ + item + }} + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.spec.ts b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.spec.ts new file mode 100644 index 0000000..1d83067 --- /dev/null +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MonthlyReportComponent } from './monthly-report.component'; + +describe('MonthlyReportComponent', () => { + let component: MonthlyReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MonthlyReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MonthlyReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts new file mode 100644 index 0000000..8562419 --- /dev/null +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts @@ -0,0 +1,319 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-monthly-report', + templateUrl: './monthly-report.component.html', + styleUrls: ['./monthly-report.component.css'], +}) +export class MonthlyReportComponent implements OnInit, DoCheck { + monthlyForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + consumptionList = []; + dateOffset: any; + mm: any; + years: any[] = []; + yy!: number; + selectedFacilityName = JSON.parse( + localStorage.getItem('facilityDetail') || '{}', + ).facilityName; + facilities = [this.selectedFacilityName, 'All']; + //BU40088124 27/7/2022 Added Facility Name dropdown in reports + months = [ + { val: '0', name: 'Jan' }, + { val: '1', name: 'Feb' }, + { val: '2', name: 'Mar' }, + { val: '3', name: 'Apr' }, + { val: '4', name: 'May' }, + { val: '5', name: 'Jun' }, + { val: '6', name: 'Jul' }, + { val: '7', name: 'Aug' }, + { val: '8', name: 'Sep' }, + { val: '9', name: 'Oct' }, + { val: '10', name: 'Nov' }, + { val: '11', name: 'Dec' }, + ]; + ngOnInit() { + this.createMonthlyForm(); + this.getMonth(); + this.getYear(); + this.fetchLanguageResponse(); + this.setSelectedFacility(); + } + + createMonthlyForm() { + this.monthlyForm = this.formBuilder.group({ + month: [null, Validators.required], + year: [null, Validators.required], + facilityName: [null, Validators.required], + }); + } + + getYear() { + const today = new Date(); + this.yy = today.getFullYear(); + for (let i = this.yy; i >= this.yy - 100; i--) { + this.years.push(i); + } + } + + getMonth() { + const today = new Date(); + this.mm = today.getMonth() + 1; + if (this.mm < 10) { + this.mm = '0' + this.mm; + } + } + + get month() { + return this.monthlyForm.controls['month'].value; + } + + get year() { + return this.monthlyForm.controls['year'].value; + } + + searchReport() { + console.log('Data form value...', JSON.stringify(this.monthlyForm.value)); + const reqObjForMonthlyReport = { + month: this.monthlyForm.value.month.val, + monthName: this.monthlyForm.value.month.name, + year: this.monthlyForm.value.year, + facilityID: + this.monthlyForm.value.facilityName === 'All' + ? null + : localStorage.getItem('facilityID'), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForMonthlyReport, null, 4), + ); + + this.inventoryService + .getMonthlyReports(reqObjForMonthlyReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.consumptionList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + setSelectedFacility() { + this.monthlyForm.patchValue({ facilityName: this.selectedFacilityName }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Month', value: this.month.name }); + criteria.push({ Filter_Name: 'Year', value: this.year }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + + if (this.consumptionList.length > 0) { + const headers = [ + 'slNo', + 'month', + 'year', + 'facilityName', + 'itemName', + 'itemCategory', + 'batchNo', + 'unitCostPrice', + 'expiryDate', + 'openingStock', + 'quantityReceived', + 'dispensedQuantity', + 'adjustmentReceipt', + 'adjustmentIssue', + 'closingStock', + ]; + const array = this.consumptionList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + // var head = Object.keys(array[0]); + console.log(' head', headers); + const wb_name = 'Monthly Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < headers.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(headers, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(headers); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.consumptionList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + headers.forEach((header) => { + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.monthlyReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html new file mode 100644 index 0000000..127a3ff --- /dev/null +++ b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html @@ -0,0 +1,44 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.shortExpiryReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.date }} + + + + + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.spec.ts b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.spec.ts new file mode 100644 index 0000000..f56a6e5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShortExpiryReportComponent } from './short-expiry-report.component'; + +describe('ShortExpiryReportComponent', () => { + let component: ShortExpiryReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ShortExpiryReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ShortExpiryReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.ts b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.ts new file mode 100644 index 0000000..0c558e0 --- /dev/null +++ b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.ts @@ -0,0 +1,261 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-short-expiry-report', + templateUrl: './short-expiry-report.component.html', + styleUrls: ['./short-expiry-report.component.css'], +}) +export class ShortExpiryReportComponent implements OnInit, DoCheck { + shortExpiryForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + shortExpiryList = []; + dateOffset: any; + + ngOnInit() { + this.createShortExpiryForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + + this.dateOffset = 24 * 60 * 60 * 1000; + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createShortExpiryForm() { + this.shortExpiryForm = this.formBuilder.group({ + startDate: [new Date(), Validators.required], + // endDate: [null, Validators.required], + }); + } + + get startDate() { + return this.shortExpiryForm.controls['startDate'].value; + } + + searchReport() { + const startDate: Date = new Date(this.shortExpiryForm.value.startDate); + // let endDate: Date = new Date(this.shortExpiryForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + console.log( + 'Data form value...', + JSON.stringify(this.shortExpiryForm.value), + ); + const reqObjForShortExpiryReport = {}; + console.log( + 'Data form data', + JSON.stringify(reqObjForShortExpiryReport, null, 4), + ); + + this.inventoryService + .getShortExpiryReports(reqObjForShortExpiryReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.shortExpiryList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + // criteria.push({ 'Filter_Name': 'End_Date', 'value': this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.shortExpiryList.length > 0) { + const array = this.shortExpiryList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', head); + const wb_name = 'Short Expiry Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < head.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(head, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(head); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.shortExpiryList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + head.forEach((header) => { + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.shortExpiryReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css new file mode 100644 index 0000000..1d8f9d5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css @@ -0,0 +1 @@ +/* CSS files should not be empty SonarQube Bug Fix */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html new file mode 100644 index 0000000..8bfe962 --- /dev/null +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html @@ -0,0 +1,69 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.transitReport }}

+
+
+ +
+
+
+ + + {{ currentLanguageSet?.inventory?.startDate }} + + + + + +
+
+ + + {{ currentLanguageSet?.inventory?.endDate }} + + + + + +
+
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.spec.ts b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.spec.ts new file mode 100644 index 0000000..95b411c --- /dev/null +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransitReportComponent } from './transit-report.component'; + +describe('TransitReportComponent', () => { + let component: TransitReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [TransitReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransitReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.ts b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.ts new file mode 100644 index 0000000..6daca28 --- /dev/null +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.ts @@ -0,0 +1,291 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-transit-report', + templateUrl: './transit-report.component.html', + styleUrls: ['./transit-report.component.css'], +}) +export class TransitReportComponent implements OnInit, DoCheck { + transitForm!: FormGroup; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + transitList = []; + dateOffset: any; + + ngOnInit() { + this.createTransitForm(); + this.today = new Date(); + this.fetchLanguageResponse(); + + this.dateOffset = 24 * 60 * 60 * 1000; + // this.maxEndDate = new Date(this.today.setTime(this.today.getTime())); + this.maxEndDate = new Date(); + this.maxEndDate.setDate(this.today.getDate() - 1); + } + + createTransitForm() { + this.transitForm = this.formBuilder.group({ + startDate: [null, Validators.required], + endDate: [null, Validators.required], + }); + } + + get startDate() { + return this.transitForm.controls['startDate'].value; + } + + get endDate() { + return this.transitForm.controls['endDate'].value; + } + + checkEndDate() { + console.log('', this.startDate); + + if (this.endDate == null) { + this.minEndDate = new Date(this.startDate); + console.log('new Date(this.today.getDate() - 1);', new Date(this.today)); + } else { + this.transitForm.patchValue({ + endDate: null, + }); + this.minEndDate = new Date(this.startDate); + } + } + + searchReport() { + const startDate: Date = new Date(this.transitForm.value.startDate); + const endDate: Date = new Date(this.transitForm.value.endDate); + + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + console.log('Data form value...', JSON.stringify(this.transitForm.value)); + const reqObjForTransitReport = { + startDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + endDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForTransitReport, null, 4), + ); + + this.inventoryService + .getTransitReports(reqObjForTransitReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.transitList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Start_Date', value: this.startDate }); + criteria.push({ Filter_Name: 'End_Date', value: this.endDate }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + if (this.transitList.length > 0) { + const array = this.transitList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + const head = Object.keys(array[0]); + console.log(' head', head); + const wb_name = 'Transit Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < head.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(head, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(head); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + // console.log("header1", header); + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.transitList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + head.forEach((header) => { + // console.log("header2", header); + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + // Write to file + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.transitReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + //console.log(modifiedHeader); + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css new file mode 100644 index 0000000..5ed9747 --- /dev/null +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css @@ -0,0 +1,56 @@ +.input-full-width { + width: 100%; + } + + .m-b-30 { + margin-bottom: 30px; + } + + mat-form-field { + margin-right: 40px; + margin-left: 20px + } + + .mat-form-field { + line-height: unset !important; + } + + .vertical-align-middle { + vertical-align: middle; + } + + .title { + margin: 0px 0px 10px; + padding: 5px 24px; + color: white; + font-size: 18px; + line-height: 32px; + font-weight: 400; + background: #0277bd; + } + + .title h4 { + display: inline-block; + } + + .title .exit { + cursor: pointer; + } + + .scrolling-content { + max-height: 75vh; + overflow: auto; + } + + .box { + height: 65px; + } + + .m-r-5{ + margin-right: 5px; + } + + /* .scrolling-content{ + overflow: auto; + max-height: 80vh; + } */ \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html new file mode 100644 index 0000000..9a1efd5 --- /dev/null +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html @@ -0,0 +1,57 @@ +
+
+
+

{{ currentLanguageSet?.inventory?.yearlyReport }}

+
+
+ +
+
+ + + {{ currentLanguageSet?.inventory?.selectyear }} + + + {{ + year + }} + + + + + + {{ currentLanguageSet?.inventory?.facility }} + + + {{ + item + }} + + + +
+
+ +
+
+
diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.spec.ts b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.spec.ts new file mode 100644 index 0000000..f4f0df9 --- /dev/null +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { YearlyReportComponent } from './yearly-report.component'; + +describe('YearlyReportComponent', () => { + let component: YearlyReportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [YearlyReportComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(YearlyReportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts new file mode 100644 index 0000000..da2db2e --- /dev/null +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts @@ -0,0 +1,289 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; + +// import * as XLSX from 'xlsx'; +import * as ExcelJS from 'exceljs'; +import { saveAs } from 'file-saver'; + +import { InventoryService } from '../../shared/service/inventory.service'; +import { ConfirmationService } from '../../../core/services/confirmation.service'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-yearly-report', + templateUrl: './yearly-report.component.html', + styleUrls: ['./yearly-report.component.css'], +}) +export class YearlyReportComponent implements OnInit, DoCheck { + yearlyForm!: FormGroup; + currentLanguageSet: any; + languageComponent: any; + criteriaHead: any; + + constructor( + private formBuilder: FormBuilder, + private inventoryService: InventoryService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + today!: Date; + minEndDate!: Date; + maxDate: any; + maxEndDate!: Date; + consumptionList = []; + dateOffset: any; + + years: any[] = []; + yy!: number; + selectedFacilityName = JSON.parse( + localStorage.getItem('facilityDetail') || '{}', + ).facilityName; + facilities = [this.selectedFacilityName, 'All']; + + //BU40088124 27/7/2022 Added Facility Name dropdown in reports + + ngOnInit() { + this.createYearlyForm(); + this.getYear(); + this.fetchLanguageResponse(); + this.setSelectedFacility(); + } + + createYearlyForm() { + this.yearlyForm = this.formBuilder.group({ + year: [null, Validators.required], + facilityName: [null, Validators.required], + }); + } + + get year() { + return this.yearlyForm.controls['year'].value; + } + + getYear() { + const today = new Date(); + this.yy = today.getFullYear(); + for (let i = this.yy; i >= this.yy - 100; i--) { + this.years.push(i); + } + } + + searchReport() { + console.log('Data form value...', JSON.stringify(this.yearlyForm.value)); + const reqObjForYearlyReport = { + year: this.yearlyForm.value.year, + facilityID: + this.yearlyForm.value.facilityName === 'All' + ? null + : localStorage.getItem('facilityID'), + }; + console.log( + 'Data form data', + JSON.stringify(reqObjForYearlyReport, null, 4), + ); + + this.inventoryService + .getYearlyReports(reqObjForYearlyReport) + .subscribe((response) => { + console.log( + 'Json data of response: ', + JSON.stringify(response, null, 4), + ); + if (response.statusCode == 200) { + this.consumptionList = response.data; + this.getResponseOfSearchThenDo(); + } + }); + } + setSelectedFacility() { + this.yearlyForm.patchValue({ facilityName: this.selectedFacilityName }); + } + + downloadReport(downloadFlag: boolean) { + if (downloadFlag == true) { + this.searchReport(); + } + } + + getResponseOfSearchThenDo() { + const criteria: any = []; + criteria.push({ Filter_Name: 'Year', value: this.year }); + this.exportToxlsx(criteria); + } + exportToxlsx(criteria: any) { + if (criteria.length > 0) { + const criteriaArray = criteria.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (criteriaArray.length != 0) { + this.criteriaHead = Object.keys(criteriaArray[0]); + console.log('this.criteriaHead', this.criteriaHead); + } + } + + if (this.consumptionList.length > 0) { + const headers = [ + 'slNo', + 'year', + 'facilityName', + 'itemName', + 'itemCategory', + 'batchNo', + 'unitCostPrice', + 'expiryDate', + 'openingStock', + 'quantityReceived', + 'dispensedQuantity', + 'adjustmentReceipt', + 'adjustmentIssue', + 'closingStock', + ]; + const array = this.consumptionList.filter(function (obj: any) { + for (const key in obj) { + if (obj[key] == null) { + obj[key] = ''; + } + } + return obj; + }); + if (array.length != 0) { + console.log(' head', headers); + const wb_name = 'Yearly Report'; + + // below code added to modify the headers + + let i = 65; // starting from 65 since it is the ASCII code of 'A'. + let count = 0; + while (i < headers.length + 65) { + let j; + if (count > 0) { + j = i - 26 * count; + } else { + j = i; + } + const cellPosition = String.fromCharCode(j); + let finalCellName: any; + if (count == 0) { + finalCellName = cellPosition + '1'; + console.log(finalCellName); + } else { + const newcellPosition = String.fromCharCode(64 + count); + finalCellName = newcellPosition + cellPosition + '1'; + console.log(finalCellName); + } + const newName = this.modifyHeader(headers, i); + // delete report_worksheet[finalCellName].w; report_worksheet[finalCellName].v = newName; + i++; + if (i == 91 + count * 26) { + // i = 65; + count++; + } + } + // --------end-------- + const workbook = new ExcelJS.Workbook(); + const criteria_worksheet = workbook.addWorksheet('Criteria'); + const report_worksheet = workbook.addWorksheet('Report'); + + report_worksheet.addRow(headers); + criteria_worksheet.addRow(this.criteriaHead); + + // Add data + criteria.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + this.criteriaHead.forEach((header: string | number) => { + // console.log("header1", header); + rowData.push(row[header]); + }); + criteria_worksheet.addRow(rowData); + }); + + this.consumptionList.forEach((row: { [x: string]: any }) => { + const rowData: any[] = []; + headers.forEach((header) => { + // console.log("header2", header); + rowData.push(row[header]); + }); + report_worksheet.addRow(rowData); + }); + + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + saveAs(blob, wb_name + '.xlsx'); + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, wb_name); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.setAttribute('visibility', 'hidden'); + link.download = wb_name.replace(/ /g, '_') + '.xlsx'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + }); + } + this.confirmationService.alert( + this.currentLanguageSet.inventory.yearlyReportdownloaded, + 'success', + ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.norecordfound, + ); + } + } + + modifyHeader(headers: any, i: any) { + let modifiedHeader: string; + modifiedHeader = headers[i - 65] + .toString() + .replace(/([A-Z])/g, ' $1') + .trim(); + modifiedHeader = + modifiedHeader.charAt(0).toUpperCase() + modifiedHeader.substr(1); + + return modifiedHeader.replace(/I D/g, 'ID'); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/shared/service/data-storage.service.spec.ts b/src/app/app-modules/inventory/shared/service/data-storage.service.spec.ts new file mode 100644 index 0000000..a3930e5 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/data-storage.service.spec.ts @@ -0,0 +1,39 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { TestBed, inject } from '@angular/core/testing'; + +import { DataStorageService } from './data-storage.service'; + +describe('DataStorageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [DataStorageService], + }); + }); + + it('should be created', inject( + [DataStorageService], + (service: DataStorageService) => { + expect(service).toBeTruthy(); + }, + )); +}); diff --git a/src/app/app-modules/inventory/shared/service/data-storage.service.ts b/src/app/app-modules/inventory/shared/service/data-storage.service.ts new file mode 100644 index 0000000..f08c9f2 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/data-storage.service.ts @@ -0,0 +1,34 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Injectable } from '@angular/core'; + +@Injectable() +export class DataStorageService { + manualDispenseItem: any = {}; + systemItemDispense: any = {}; + previousVisitData: any = {}; + selfConsumption: any = {}; + physicalStock: any = {}; + stockTransfer: any = {}; + adjustment: any = {}; + indentDetails: any = {}; +} diff --git a/src/app/app-modules/inventory/shared/service/indent-dispense.service.ts b/src/app/app-modules/inventory/shared/service/indent-dispense.service.ts new file mode 100644 index 0000000..39453ed --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/indent-dispense.service.ts @@ -0,0 +1,42 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +// import { Injectable } from '@angular/core'; +// import { Subject } from 'rxjs'; + +// @Injectable() +// export class IndentDispenseService { + +// private mainStoreRequest = new Subject(); +// private indentDispenseAllocation = new Subject(); + +// mainStoreRequest$ = this.mainStoreRequest.asObservable(); +// indentDispenseAllocation$ = this.indentDispenseAllocation.asObservable(); + +// // Service message commands +// mainStoreIndentRequest(indentRequest: string) { +// this.mainStoreRequest.next(indentRequest); +// } + +// indentAllocateBasedOnBatch(indentAllocate: string) { +// this.indentDispenseAllocation.next(indentAllocate); +// } +// } diff --git a/src/app/app-modules/inventory/shared/service/inventory-master.service.spec.ts b/src/app/app-modules/inventory/shared/service/inventory-master.service.spec.ts new file mode 100644 index 0000000..d64ea29 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/inventory-master.service.spec.ts @@ -0,0 +1,39 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { TestBed, inject } from '@angular/core/testing'; + +import { InventoryMasterService } from './inventory-master.service'; + +describe('InventoryMasterService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [InventoryMasterService], + }); + }); + + it('should be created', inject( + [InventoryMasterService], + (service: InventoryMasterService) => { + expect(service).toBeTruthy(); + }, + )); +}); diff --git a/src/app/app-modules/inventory/shared/service/inventory-master.service.ts b/src/app/app-modules/inventory/shared/service/inventory-master.service.ts new file mode 100644 index 0000000..beef263 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/inventory-master.service.ts @@ -0,0 +1,25 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Injectable } from '@angular/core'; + +@Injectable() +export class InventoryMasterService {} diff --git a/src/app/app-modules/inventory/shared/service/inventory.service.spec.ts b/src/app/app-modules/inventory/shared/service/inventory.service.spec.ts new file mode 100644 index 0000000..26858f1 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/inventory.service.spec.ts @@ -0,0 +1,39 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { TestBed, inject } from '@angular/core/testing'; + +import { InventoryService } from './inventory.service'; + +describe('InventoryService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [InventoryService], + }); + }); + + it('should be created', inject( + [InventoryService], + (service: InventoryService) => { + expect(service).toBeTruthy(); + }, + )); +}); diff --git a/src/app/app-modules/inventory/shared/service/inventory.service.ts b/src/app/app-modules/inventory/shared/service/inventory.service.ts new file mode 100644 index 0000000..7d8ae62 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/inventory.service.ts @@ -0,0 +1,381 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { Observable, throwError } from 'rxjs'; +import { environment } from 'src/environments/environment'; + +@Injectable() +export class InventoryService { + constructor(private http: HttpClient) {} + + getAvailableItemInStore() { + const storeID = localStorage.getItem('facilityID'); + console.log('this.itemInStore', storeID); + return this.http.post( + environment.getAvailableItemInStoreUrl + storeID, + {}, + ); + } + getBeneficaryVisitDetail(beneficiaryID: any) { + return this.http.post( + environment.getBeneficaryVisitDetailsurl, + beneficiaryID, + ); + } + + saveStockExit(dispensingItem: any) { + return this.http.post(environment.saveStockExitUrl, dispensingItem); + } + + allocateBatch(itemList: any) { + return this.http.post( + environment.allocateBatchStockUrl + localStorage.getItem('facilityID'), + itemList, + ); + } + + getItemBatchList(itemDetail: any) { + return this.http.post(environment.getItemBatchListUrl, itemDetail); + } + + getStoreItemsCall(facID: any) { + return this.http.post(environment.getStoreItems + facID, {}); + } + + getItemBatchForStoreIDCall(itemID: any, facID: any) { + return this.http.post(environment.getItemBatchForStoreID, { + facilityID: facID, + itemID: itemID, + }); + } + + getItem(obj: any) { + return this.http.post(environment.getItem_Url, obj); + } + + /** + * Related To Store Consumption + * */ + storeSelfConsumption(obj: any) { + return this.http.post(environment.storeSelfConsumption, obj); + } + viewSelfConsumption(obj: any) { + return this.http.post(environment.viewSelfConsumption, obj); + } + + getParticularConsumption(consumptionID: any) { + return this.http.post(environment.getParticularConsumptionURL, { + consumptionID: consumptionID, + }); + } + + /** + * Related To Store Consumption -- ENDS + * */ + + /** + * Related to Physical Stock Entry + */ + savePhysicalStock(obj: any) { + return this.http.post(environment.savePhysicalStock_Url, obj); + } + + viewPhysicalStockEntry(obj: any) { + return this.http.post(environment.viewPhysicalStockURL, obj); + } + + getParticularStockEntry(entryID: any) { + return this.http.post(environment.getParticularStockURL, { + phyEntryID: entryID, + }); + } + + /** + * Related to Physical Stock Entry -- ENDS + */ + + /** + * Related to Medicine Dispense + */ + viewMedicineDispenseEntry(obj: any) { + return this.http.post(environment.viewMedicineDispenceURL, obj); + } + + getParticularMedicineDispenseEntry(patientIssueID: any) { + return this.http.post(environment.getParticularMedicineDispenseURL, { + patientIssueID: patientIssueID, + }); + } + /** + * Related to Medicine Dispense -- ENDS + */ + + /** + * Related to Stock Transfer + */ + + saveStockTransfer(obj: any) { + return this.http.post(environment.saveStoreTransferUrl, obj); + } + + viewStockTransferEntry(obj: any) { + return this.http.post(environment.viewStockTransferURL, obj); + } + + getParticularStockTransferEntry(stockTransferID: any) { + return this.http.post(environment.getParticularStockTransferURL, { + stockTransferID: stockTransferID, + }); + } + + /** + * Related to Stock Transfer -- ENDS + */ + + getAllStore(serviceProviderId: any) { + return this.http.post( + environment.getFacilityUrl + serviceProviderId, + {}, + ); + } + + saveStockAdjustmentDraft(stockAdjustment: any) { + return this.http.post( + environment.saveStockAdjustmentDraftUrl, + stockAdjustment, + ); + } + + saveStockAdjustment(stockAdjustment: any) { + return this.http.post( + environment.saveStockAdjustmentUrl, + stockAdjustment, + ); + } + + getStockAdjustmentDraftList(fetchDetails: any) { + return this.http.post( + environment.getStockAjustmentDraftList, + fetchDetails, + ); + } + + getStockAdjustmentList(fetchDetails: any) { + return this.http.post(environment.getStockAjustmentList, fetchDetails); + } + + getStockAdjustmentDraftDetails(stockAdjustmentDraftID: any) { + return this.http.post(environment.getStockAjustmentDraftDetails, { + stockAdjustmentDraftID, + }); + } + + getStockAdjustmentDetails(stockAdjustmentID: any) { + return this.http.post(environment.getStockAjustmentDetails, { + stockAdjustmentID, + }); + } + + /** + * Related to Patient Return -- STARTS + */ + + getBeneficiaryByPhoneNumber(obj: any) { + return this.http.post(environment.getBeneficiaryByPhoneNumberUrl, obj); + } + + getBeneficiaryByBeneficiaryID(obj: any) { + return this.http.post( + environment.getBeneficiaryByBeneficiaryIDUrl, + obj, + ); + } + + getItemList(obj: any) { + return this.http.post(environment.getItemListUrl, obj); + } + + getBatchDetails(obj: any) { + return this.http.post(environment.getBatchListUrl, obj); + } + + updateQuantityReturned(obj: any) { + return this.http.post(environment.getUpdateQuantityReturnedUrl, obj); + } + + getPatientReturnList(obj: any) { + return this.http.post(environment.getPatientReturnListUrl, obj); + } + /** + * + * Errrrorororororoor + * + */ + handleError(error: Response | any) { + return throwError(error.json()); + } + + /* + * Related to Indent Request + */ + saveIndentRequest(tempObj: any) { + return this.http.post(environment.saveIndentRequestUrl, tempObj); + } + showMainstoreOrderWorklist(facilityID: any) { + return this.http.post( + environment.showMainStoreIndentRequestUrl, + facilityID, + ); + } + + viewItemListForMainStore(itemList: any) { + return this.http.post( + environment.viewItemListForMainStoreUrl, + itemList, + ); + } + viewBatchlistForIndentItem(batchlistObj: any) { + return this.http.post(environment.getItemBatchListUrl, batchlistObj); + } + rejectIndentOrder(rejectIndent: any) { + return this.http.post( + environment.getSaveDispenseListUrl, + rejectIndent, + ); + } + /** + * Related to indent dispense + */ + saveDispenseList(itemListObj: any) { + return this.http.post(environment.getSaveDispenseListUrl, itemListObj); + } + /* + * Related to sub store + */ + showSubStoreOrderWorklist(facilityID: any) { + return this.http.post( + environment.showSubStoreIndentRequestUrl, + facilityID, + ); + } + cancelIndentRequest(cancelIndent: any) { + return this.http.post( + environment.cancelIndentRequestUrl, + cancelIndent, + ); + } + viewItemListForSubStore(itemList: any) { + return this.http.post( + environment.viewItemListForSubStoreUrl, + itemList, + ); + } + receiveIndentOrder(acceptOrderObj: any) { + return this.http.post( + environment.receiveIndentOrderUrl, + acceptOrderObj, + ); + } + updateIndentRequest(updateTempObj: any) { + return this.http.post(environment.updateIndentOrderUrl, updateTempObj); + } + + /** + * Reports + */ + getInwardStockReports(inwardStockReportObj: any) { + return this.http.post( + environment.inwardStockReportUrl, + inwardStockReportObj, + ); + } + + getConsumptionReports(consumptionReportObj: any) { + return this.http.post( + environment.consumptionReportUrl, + consumptionReportObj, + ); + } + + getExpiryReports(expiryReportObj: any) { + return this.http.post(environment.expiryReportUrl, expiryReportObj); + } + + getBeneficiaryDrugIssueReports(beneficiaryDrugIssueReportObj: any) { + return this.http.post( + environment.beneficiaryDrugIssueReportUrl, + beneficiaryDrugIssueReportObj, + ); + } + + getDailyStockDetailsReports(dailyStockDetailsReportObj: any) { + return this.http.post( + environment.dailyStockDetailsReportUrl, + dailyStockDetailsReportObj, + ); + } + + getDailyStockSummaryReports(dailyStockSummaryReportObj: any) { + return this.http.post( + environment.dailyStockSummaryReportUrl, + dailyStockSummaryReportObj, + ); + } + + getMonthlyReports(monthlyReportObj: any) { + return this.http.post(environment.monthlyReportUrl, monthlyReportObj); + } + + getYearlyReports(yearlyReportObj: any) { + return this.http.post(environment.yearlyReportUrl, yearlyReportObj); + } + + getShortExpiryReports(shortExpiryReportObj: any) { + return this.http.post( + environment.shortExpiryReportUrl, + shortExpiryReportObj, + ); + } + + getTransitReports(transitReportReqObj: any) { + return this.http.post( + environment.transitReportUrl, + transitReportReqObj, + ); + } + + addEAushadhiItemsToAmrit(facilityID: any) { + return this.http.post( + environment.eAushadhiStockAdditionUrl, + facilityID, + ); + } + + showLastUpdatedStockLogs(facilityID: any) { + return this.http.post(environment.lastUpdatedStockLogUrl, facilityID); + } + saveEAusadha(obj: any) { + return this.http.post(environment.saveEAusadhaStock_Url, obj); + } +} diff --git a/src/app/app-modules/inventory/shared/service/prescribed-drug.service.spec.ts b/src/app/app-modules/inventory/shared/service/prescribed-drug.service.spec.ts new file mode 100644 index 0000000..7e8dedc --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/prescribed-drug.service.spec.ts @@ -0,0 +1,39 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { TestBed, inject } from '@angular/core/testing'; + +import { PrescribedDrugService } from './prescribed-drug.service'; + +describe('PrescribedDrugService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PrescribedDrugService], + }); + }); + + it('should be created', inject( + [PrescribedDrugService], + (service: PrescribedDrugService) => { + expect(service).toBeTruthy(); + }, + )); +}); diff --git a/src/app/app-modules/inventory/shared/service/prescribed-drug.service.ts b/src/app/app-modules/inventory/shared/service/prescribed-drug.service.ts new file mode 100644 index 0000000..618b809 --- /dev/null +++ b/src/app/app-modules/inventory/shared/service/prescribed-drug.service.ts @@ -0,0 +1,69 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; + +@Injectable() +export class PrescribedDrugService { + dummify = { + prescribed: { + prescriptionID: '1A22eddt5', + prescribedDate: '08/08/2018', + consultantName: 'Balu Lal', + status: false, + prescribedDrugs: [ + { + drugID: '123431', + drugName: 'SomeMed CapsoTableSyruped', + batchNumber: '245u67ujt', + qoh: 209, + quantityPrescribed: 203, + quantiyIssued: 209, + }, + { + drugID: '123431', + drugName: 'SomeMed CapsoTableSyruped', + batchNumber: '245u67ujt', + qoh: 209, + quantityPrescribed: 203, + quantiyIssued: 209, + }, + { + drugID: '123431', + drugName: 'SomeMed CapsoTableSyruped', + batchNumber: '245u67ujt', + qoh: 209, + quantityPrescribed: 203, + quantiyIssued: 209, + }, + ], + }, + }; + + constructor(private http: HttpClient) {} + + getPrescription(reqObj: any) { + // return Observable.of(this.dummify); + return this.http.post(environment.getPrescriptions, reqObj); + } +} diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css new file mode 100644 index 0000000..e3af58c --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css @@ -0,0 +1,58 @@ +.input-full-width { + width: 100%; +} + +.m-b-40 { + margin-bottom: 40px; +} + +.m-r-5 { + margin-right: 5px; +} + +.icon-remove { + margin: 16px; +} + +.vertical-align-middle { + vertical-align: middle; +} + +.input-datepicker { + padding: 5px 8px; +} + +.search-btn { + cursor: pointer; +} + + +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + +@media screen and (max-width: 768px) { + .button-full-width { + width: 100%; + /* height: 50px; */ + margin-top: 3px; + } +} + +.width5 { + width: 5%; +} + +.width10 { + width: 10%; +} + +.width15 { + width: 15%; +} + +.width20 { + width: 20%; +} diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html new file mode 100644 index 0000000..d451525 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html @@ -0,0 +1,268 @@ +
+
+
+
+

+ {{ currentLanguageSet?.inventory?.storeConsumption }} +

+
+ +
+ +
+
+ +
+
+ + + + + + {{ currentLanguageSet?.inventory?.pleaseenterReferenceNumber }} + + +
+
+ + + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.index }} + + {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.itemName }} + + + + search + + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + + + + {{ currentLanguageSet?.inventory?.qOH }} + + + + + + {{ currentLanguageSet?.inventory?.quantity }} + + + + + + delete +
+
+ +
+
+
+
+
+ +
+
+ + +
+
+
+
diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.spec.ts b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.spec.ts new file mode 100644 index 0000000..05cac2a --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StoreSelfConsumptionComponent } from './store-self-consumption.component'; + +describe('StoreSelfConsumptionComponent', () => { + let component: StoreSelfConsumptionComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [StoreSelfConsumptionComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StoreSelfConsumptionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts new file mode 100644 index 0000000..afaba2a --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts @@ -0,0 +1,278 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { ConfirmationService } from '../../core/services/confirmation.service'; +import { InventoryService } from '../shared/service/inventory.service'; +import { Router } from '@angular/router'; +import { + FormBuilder, + FormArray, + FormGroup, + Validators, + AbstractControl, +} from '@angular/forms'; +import { LanguageService } from '../../core/services/language.service'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + itemName: string; + index: number; + batchNo: number; + quantityInHand: string; + quantity: string; + delete: string; + addButton: string; +} + +@Component({ + selector: 'app-store-self-consumption', + templateUrl: './store-self-consumption.component.html', + styleUrls: ['./store-self-consumption.component.css'], +}) +export class StoreSelfConsumptionComponent implements OnInit, DoCheck { + storeSelfConsumptionForm!: FormGroup; + facilityID: any; + providerServiceMapID: any; + createdBy: any; + currentLanguageSet: any; + languageComponent: any; + + displayedColumns: string[] = [ + 'index', + 'itemName', + 'batchNo', + 'quantityInHand', + 'quantity', + 'delete', + ]; + constructor( + private fb: FormBuilder, + private router: Router, + private http_service: LanguageService, + private inventoryService: InventoryService, + private alertService: ConfirmationService, + ) {} + dataSource = new MatTableDataSource(); + + ngOnInit() { + this.createdBy = localStorage.getItem('username'); + this.facilityID = localStorage.getItem('facilityID'); + this.fetchLanguageResponse(); + this.providerServiceMapID = localStorage.getItem('providerServiceID'); + + if (this.facilityID == null || this.facilityID <= 0) { + this.router.navigate(['/inventory']); + } + + // this.storeSelfConsumptionForm = this.createStoreSelfConsumptionForm(); + this.storeSelfConsumptionForm = this.fb.group({ + referenceNumber: [''], + dispenseReason: [''], + dispensedStock: this.fb.array([]), + }); + this.initDispensedStock(); + this.loadStockConsumptionData(); + // this.dataSource = new MatTableDataSource(this.storeSelfTableData()); + } + loadStockConsumptionData() { + const dataFromFun: any = this.storeSelfTableData(); + console.log('dataFromFun####', dataFromFun); + this.dataSource.data = dataFromFun; + } + + storeSelfTableData(): any { + return (this.storeSelfConsumptionForm.get('dispensedStock') as FormArray) + .controls; + } + + createStoreSelfConsumptionForm() { + return this.fb.group({ + referenceNumber: null, + dispenseReason: null, + // dispensedStock: new FormArray([this.initDispensedStock()]), + }); + } + + initDispensedStock() { + const frmSelfArr = this.storeSelfConsumptionForm.get( + 'dispensedStock', + ) as FormArray; + frmSelfArr.push( + this.fb.group({ + itemStockEntryID: [''], + batchNo: ['', Validators.required], + itemID: ['', Validators.required], + itemName: ['', Validators.required], + quantityInHand: [''], + quantity: ['', Validators.required], + }), + ); + } + + initDispensedStockForm() { + return this.fb.group({ + itemStockEntryID: [''], + batchNo: ['', Validators.required], + itemID: ['', Validators.required], + itemName: ['', Validators.required], + quantityInHand: [''], + quantity: ['', Validators.required], + }); + } + get physicalStock() { + return this.storeSelfConsumptionForm.get('dispensedStock') as FormArray; + } + + addDispensedStock() { + this.physicalStock.push(this.initDispensedStockForm()); + this.loadStockConsumptionData(); + } + + checkValidity(stock?: FormGroup) { + if (stock) { + const tempValid = stock.value; + // console.log('tempValid', tempValid) + if (tempValid.quantity) { + return false; + } else { + return true; + } + } + else{ + return false; + } + } + + removeDispensedStock(index: any, stock?: FormGroup) { + const stockForm = this.storeSelfConsumptionForm.get( + 'dispensedStock', + ) as FormArray; + console.log('stockForm', stockForm); + console.log('stock', stock); + + if (stockForm.length > 1) { + stockForm.removeAt(index); + // stockForm.clear(); + this.loadStockConsumptionData(); + } else { + if (stock) { + stock.reset(); + stock.controls['itemName'].enable(); + } + } + } + + saveSelfConsumptionStock() { + const temp = JSON.parse( + JSON.stringify(this.storeSelfConsumptionForm.value), + ); + const itemStockExit = temp.dispensedStock.map((item: any) => { + item = { + ...item, + createdBy: this.createdBy, + facilityID: this.facilityID, + }; + return item; + }); + const requestBody = { + issueType: 'Manual', + refNo: temp.referenceNumber, + reason: temp.dispenseReason, + itemStockExit: itemStockExit, + facilityID: this.facilityID, + providerServiceMapID: this.providerServiceMapID, + createdBy: this.createdBy, + dispensedStock: undefined, + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + }; + + // console.log("Self Stock Consumption", JSON.stringify(requestBody, null, 4)); + + this.inventoryService.storeSelfConsumption(requestBody).subscribe( + (response) => { + if (response.statusCode == 200) { + this.alertService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.reset(); + } else this.alertService.alert(response.status, 'error'); + }, + (err) => { + this.alertService.alert(err, 'error'); + }, + ); + } + + reset() { + this.storeSelfConsumptionForm.reset(); + this.resetStoreSelfConsumptionFormArray(); + this.addDispensedStock(); + } + + resetStoreSelfConsumptionFormArray() { + const dispensedStockArray = this.storeSelfConsumptionForm.get( + 'dispensedStock', + ) as FormArray; + dispensedStockArray.controls.length = 0; + } + + validateRequestedQuantity(stock: FormGroup) { + const quantityInHand = stock.value.quantityInHand; + const requestedQuantity = stock.value.quantity; + + if (requestedQuantity <= 0) { + this.alertService.alert( + this.currentLanguageSet.inventory.quantitycannotbenegativeorzero, + ); + stock.controls['quantity'].setValue(null); + } else if (requestedQuantity > quantityInHand) { + this.alertService.alert( + this.currentLanguageSet.inventory.insufficientquantityinthisbatch, + ); + stock.controls['quantity'].setValue(null); + } + } + + removeAllDispensedStock(dispensedStockArray: FormArray) { + // let len = dispensedStockArray.length; + // for (let i = 0; i < len - 1; i++) { + while (dispensedStockArray.length > 1) { + dispensedStockArray.removeAt(0); + } + dispensedStockArray.enable(); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.css b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.css new file mode 100644 index 0000000..4d4cfc3 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.css @@ -0,0 +1,38 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 15px; +} + +.h5_bold { + font-weight: bold; + display: inline-block; +} + +.m-b-15 { + margin-bottom: 15px; +} +.greenBttn { + background: #43a047 !important; + color: white; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.html b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.html new file mode 100644 index 0000000..4a5b61b --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.html @@ -0,0 +1,175 @@ + + +
+
+ + + + {{ currentLanguageSet?.inventory?.consumptionID }} + + + {{ data?.consumptionDetails?.consumptionID }} + + + + + + {{ currentLanguageSet?.inventory?.refNo }} + + + {{ data?.consumptionDetails?.refNo }} + + + + + + {{ currentLanguageSet?.inventory?.reason }} + + + {{ data?.consumptionDetails?.reason }} + + + + + + {{ currentLanguageSet?.inventory?.createdBy }} + + + {{ data?.consumptionDetails?.createdBy }} + + + + + + {{ currentLanguageSet?.inventory?.createdDate }} + + + {{ data?.consumptionDetails?.createdDate | istDate: "dd/MM/yyyy" }} + + + + + + + + +
+
+ + + search + +
+
+ +
+
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.itemName }} + + + {{ consumption?.itemName }} + + + + + + {{ currentLanguageSet?.inventory?.batchNo }} + + + {{ consumption?.batchNo }} + + + + + + {{ currentLanguageSet?.inventory?.quantity }} + + + {{ consumption?.quantity }} + + + + + + {{ currentLanguageSet?.itemDispense?.expiryDate }} + + + {{ consumption?.expiryDate | date: "dd/MM/yyyy" }} + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.spec.ts b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.spec.ts new file mode 100644 index 0000000..6ee8df8 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStoreSelfConsumptionDetailsComponent } from './view-store-self-consumption-details.component'; + +describe('ViewStoreSelfConsumptionDetailsComponent', () => { + let component: ViewStoreSelfConsumptionDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStoreSelfConsumptionDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStoreSelfConsumptionDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.ts b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.ts new file mode 100644 index 0000000..f4cee1b --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption-details/view-store-self-consumption-details.component.ts @@ -0,0 +1,142 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Inject, + OnDestroy, + DoCheck, + ViewChild, +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-view-store-self-consumption-details', + templateUrl: './view-store-self-consumption-details.component.html', + styleUrls: ['./view-store-self-consumption-details.component.css'], +}) +export class ViewStoreSelfConsumptionDetailsComponent + implements OnInit, OnDestroy, DoCheck +{ + _filterTerm = ''; + _detailedList: any = []; + // _filteredDetailedList: any = []; + _filteredDetailedList = new MatTableDataSource(); + _dataStoreSelfList = new MatTableDataSource(); + dataSource = new MatTableDataSource(); + blankTable = [1, 2, 3, 4, 5]; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'consumptionID', + 'refNo', + 'reason', + 'createdBy', + 'createdDate', + ]; + displayedColviewSelf: string[] = [ + 'itemName', + 'batchNo', + 'quantity', + 'expiryDate', + ]; + + constructor( + private http_service: LanguageService, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + ngOnInit() { + this.populateConsumedItems(this.data); + this.fetchLanguageResponse(); + this._dataStoreSelfList.data.push(this.data); + } + + ngOnDestroy(): void { + //Called once, before the instance is destroyed. + //Add 'implements OnDestroy' to the class. + this.data = ''; + } + populateConsumedItems(data: any) { + if (data && data.consumptionItem && data.consumptionDetails) { + this._detailedList = data.consumptionItem; + console.log('this._detailedList', this._detailedList); + this._filteredDetailedList.data.push(this._detailedList); + console.log( + ' this._filteredDetailedList.data2', + this._filteredDetailedList.data[0].data, + ); + this.dataSource = new MatTableDataSource( + this._filteredDetailedList.data[0].data, + ); + this.dataSource.paginator = this.paginator; + console.log(' this.dataSource ', this.dataSource.data); + + // this.dataSource = new MatTableDataSource(this.filteredStockAdjustmentList.data[0].data); + } + } + + filterDetails(filterTerm: string) { + console.log(filterTerm); + if (!filterTerm) this._filteredDetailedList.data = this._detailedList; + else { + this._filteredDetailedList.data = []; + this._detailedList.forEach((item: any) => { + for (const key in item) { + if (key == 'batchNo' || key == 'itemName' || key == 'quantity') { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this._filteredDetailedList.data.push(item); + break; + } + } + } + }); + } + } + print() { + this.closeViewModal(); + } + + closeViewModal() { + const modalresult = Object.assign({ print: true }); + this.dialogRef.close(modalresult); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css new file mode 100644 index 0000000..584fbf0 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css @@ -0,0 +1,36 @@ +.mdIcon { + vertical-align: text-bottom; +} + +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} + +.previous-btn { + margin: 5px 0px; +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + + + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html new file mode 100644 index 0000000..ff74358 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html @@ -0,0 +1,224 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousStoreConsumption }} +

+
+
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} +
+
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.consumptionID }} + + + {{ consumption?.consumptionID }} + + + + + + {{ currentLanguageSet?.inventory?.refNo }} + + + {{ consumption?.refNo }} + + + + + + {{ currentLanguageSet?.inventory?.reason }} + + + {{ consumption?.reason }} + + + + + + {{ currentLanguageSet?.inventory?.createdBy }} + + + {{ consumption?.createdBy }} + + + + + + {{ currentLanguageSet?.inventory?.createdDate }} + + + {{ consumption?.createdDate | istDate: "dd/MM/yyyy" }} + + + + + + + + +
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ _filteredConsumptionList.data.length }} +
+ +
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.spec.ts b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.spec.ts new file mode 100644 index 0000000..0aef067 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStoreSelfConsumptionComponent } from './view-store-self-consumption.component'; + +describe('ViewStoreSelfConsumptionComponent', () => { + let component: ViewStoreSelfConsumptionComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStoreSelfConsumptionComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStoreSelfConsumptionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts new file mode 100644 index 0000000..b5eee45 --- /dev/null +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts @@ -0,0 +1,335 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + HostListener, + ViewChild, + DoCheck, +} from '@angular/core'; +import { Location } from '@angular/common'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { DataStorageService } from './../../shared/service/data-storage.service'; +import * as moment from 'moment'; +import { Router } from '@angular/router'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { ViewStoreSelfConsumptionDetailsComponent } from './view-store-self-consumption-details/view-store-self-consumption-details.component'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-view-store-self-consumption', + templateUrl: './view-store-self-consumption.component.html', + styleUrls: ['./view-store-self-consumption.component.css'], +}) +export class ViewStoreSelfConsumptionComponent implements OnInit, DoCheck { + _minDate: any; + _today: any; + + _dateRange: Date[] = []; + _dateRangePrevious: Date[] = []; + + _consumptionList: any = []; + // _filteredConsumptionList: any = []; + _filteredConsumptionList = new MatTableDataSource(); + blankTable = [1, 2, 3, 4, 5]; + filterTerm: any; + searched = false; + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'consumptionID', + 'refNo', + 'reason', + 'createdBy', + 'createdDate', + ]; + + constructor( + private location: Location, + private inventoryService: InventoryService, + private dataStorageService: DataStorageService, + private http_service: LanguageService, + private dialog: MatDialog, + private router: Router, + ) {} + + ngOnInit() { + this.setDateDefault(); + this.fetchLanguageResponse(); + this.getPastConsumptions(); + } + + setDateDefault() { + this._today = new Date(); + this._minDate = new Date(); + this._minDate.setFullYear(this._today.getFullYear() - 1); + this._dateRange[0] = this._today; + this._dateRange[1] = this._today; + + // const dateFrom = new Date(); + // dateFrom.setDate(dateFrom.getDate() - 30); + + // const dateTo = new Date(); + // dateTo.setDate(dateTo.getDate() + 1); + + // this._dateRange = [dateFrom, dateTo]; + console.log(this._dateRange, 'dateRange'); + } + + getPastConsumptions() { + const obj = this.getViewServiceObject(); + this.inventoryService.viewSelfConsumption(obj).subscribe((res) => { + this.searched = true; + this.loadConsumption(res); + }); + } + preventTyping(e: any) { + if (e.keyCode === 9) { + return true; + } else { + return false; + } + } + + getViewServiceObject() { + const startDate: Date = new Date(this._dateRange[0]); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this._dateRange[1]); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + return { + facilityID: localStorage.getItem('facilityID'), + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + } + + updateDate() { + this.getPastConsumptions(); + + // } + } + + loadConsumption(consumptionObject: any) { + console.log(consumptionObject); + this._consumptionList = consumptionObject.data; + this._filteredConsumptionList.data = consumptionObject.data; + this._filteredConsumptionList.paginator = this.paginator; + console.log( + 'this._filteredConsumptionList.data', + this._filteredConsumptionList.data, + ); + this.filterTerm = ''; + } + + filterConsumptionList(searchTerm: string) { + if (!searchTerm) { + this._filteredConsumptionList.data = this._consumptionList; + this._filteredConsumptionList.paginator = this.paginator; + } else { + this._filteredConsumptionList.data = []; + this._filteredConsumptionList.paginator = this.paginator; + + this._consumptionList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'consumptionID' || + key == 'refNo' || + key == 'reason' || + key == 'createdBy' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(searchTerm.toLowerCase()) >= 0) { + this._filteredConsumptionList.data.push(item); + this._filteredConsumptionList.paginator = this.paginator; + + break; + } + } + } + }); + } + } + + loadConsumptionDetails(consumption: any) { + if (consumption && consumption.consumptionID) { + this.inventoryService + .getParticularConsumption(consumption.consumptionID) + .subscribe((res) => this.popOutConsumption(consumption, res)); + } + } + + popOutConsumption(consumptionDetails: any, consumptionResponse: any) { + if (consumptionResponse) { + const mdDialogRef: MatDialogRef = + this.dialog.open(ViewStoreSelfConsumptionDetailsComponent, { + // height: '90%', + width: '80%', + panelClass: 'fit-screen', + data: { + consumptionDetails: consumptionDetails, + consumptionItem: consumptionResponse, + }, + disableClose: false, + }); + mdDialogRef.afterClosed().subscribe((result) => { + if (result) { + if (result.print != null && result.print == true) { + if (result.print) { + const printableData = this.createPrintableData( + consumptionDetails, + consumptionResponse, + ); + this.dataStorageService.selfConsumption = printableData; + const uRL = 'selfConsumption'; + this.router.navigate(['/inventory/dynamicPrint/', uRL]); + } + } + } + }); + } + } + + createPrintableData(consumptionDetails: any, consumptionResponse: any) { + const facilityDetailStorage: any = localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetailStorage); + const facilityName = facilityDetail.facilityName; + const printableData: any = []; + let i = 0; + consumptionResponse.forEach((batch: any) => { + i = i + 1; + const consumedBatch = { + sNo: i, + itemName: batch.itemName, + batchNo: batch.batchNo, + expiryDate: moment(batch.expiryDate).format('DD-MM-YYYY'), + qod: batch.quantity, + }; + printableData.push(consumedBatch); + }); + console.log( + 'consumptionDetails', + JSON.stringify(consumptionDetails, null, 4), + ); + const consumptionDetail = Object.assign( + { + facilityName: facilityName, + createDate: moment(consumptionDetails.createdDate).format('DD-MM-YYYY'), + }, + consumptionDetails, + ); + console.log('consumptionResponse', JSON.stringify(printableData, null, 4)); + const consumedItem = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: consumptionDetail }, + { columns: this.columns }, + { printableData: printableData }, + ); + return consumedItem; + } + + goBack() { + this.location.back(); + } + title = { + modalTitle: '', + headerTitle: 'Consumed Detail', + tableTitle: '', + }; + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchNo', + columnName: 'Batch No', + }, + { + keyName: 'expiryDate', + columnName: 'Expiry Date', + }, + { + keyName: 'qod', + columnName: 'Qty dispensed', + }, + ]; + headerColumn = [ + { + columnName: 'Consumption ID :', + keyName: 'consumptionID', + }, + { + columnName: 'Facility ID :', + keyName: 'facilityID', + }, + { + columnName: 'Reference No :', + keyName: 'refNo', + }, + { + columnName: 'Reason :', + keyName: 'reason', + }, + { + columnName: 'Created By :', + keyName: 'createdBy', + }, + { + columnName: 'Created Date :', + keyName: 'createDate', + }, + ]; + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css new file mode 100644 index 0000000..8c1389a --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css @@ -0,0 +1,79 @@ +.input-full-width { + width: 100%; +} + +.mat-form-field { + line-height: unset; +} + +.m-b-40 { + margin-bottom: 40px; +} + +.m-r-5 { + margin-right: 5px; +} + +.icon-remove { + margin: 16px; +} + +.vertical-align-middle { + vertical-align: middle; +} + +.input-datepicker { + padding: 5px 8px; +} + +.search-btn { + cursor: pointer; +} + +.button-full-width { + margin-left: 5px; +} + +@media screen and (max-width: 768px) { + .button-full-width { + width: 100%; + margin-top: 5px; + /* height: 50px; */ + } +} + + +.mat-select-placeholder { + white-space: nowrap; + text-overflow: ellipsis; +} + +.mat-form-field-placeholder { + white-space: nowrap; + text-overflow: ellipsis; +} + +.box { + height: 60px; +} + +.width5 { + width: 5%; +} + +.width10 { + width: 10%; +} + +.width15 { + width: 15%; +} + +.width20 { + width: 20%; +} +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html new file mode 100644 index 0000000..fd462ff --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html @@ -0,0 +1,422 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.storeAdjustment }} +

+
+ +
+ + + + +
+
+
+ E-aushadhi stock last updated on - + {{ + lastUpdatedStockDate + ? (lastUpdatedStockDate | date: "dd/MM/yyyy HH:mm") + : "NA" + }} +
+
+
+
+
+
+ + {{ + currentLanguageSet?.inventory?.adjustmentDate + }} + + + + +
+ +
+ + + +
+
+ +
+
+ +
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ i + 1 }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemName }} + + + + search + + + {{ currentLanguageSet?.inventory?.batchID }} + + + + + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + + + + + {{ currentLanguageSet?.inventory?.adjustmentType }} + + + + + {{ adjustmentType }} + + + + + {{ currentLanguageSet?.inventory?.adjustmentQuantity }} + + + + + + + + + + {{ currentLanguageSet?.inventory?.qOHAfterAdjustment }} + + + + + + {{ currentLanguageSet?.inventory?.reason }} + + + + + + {{ currentLanguageSet?.inventory?.action }} + + delete +
+
+ +
+
+
+
+
+ +
+
+ + + + +
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.spec.ts b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.spec.ts new file mode 100644 index 0000000..7757403 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StoreStockAdjustmentComponent } from './store-stock-adjustment.component'; + +describe('StoreStockAdjustmentComponent', () => { + let component: StoreStockAdjustmentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [StoreStockAdjustmentComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StoreStockAdjustmentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts new file mode 100644 index 0000000..7c987e0 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts @@ -0,0 +1,438 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { + FormBuilder, + FormGroup, + FormArray, + AbstractControl, + Validators, +} from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; +import { Location } from '@angular/common'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { LanguageService } from '../../core/services/language.service'; +import { ConfirmationService } from '../../core/services/confirmation.service'; +import { InventoryService } from '../shared/service/inventory.service'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-store-stock-adjustment', + templateUrl: './store-stock-adjustment.component.html', + styleUrls: ['./store-stock-adjustment.component.css'], +}) +export class StoreStockAdjustmentComponent implements OnInit, DoCheck { + storeStockAdjustmentForm!: FormGroup; + adjustmentTypeList = ['Issue', 'Receipt']; + draftID: any; + + editMode = false; + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + isMainStore = false; + lastUpdatedStockDate: any; + // dataSource: MatTableDataSource = new MatTableDataSource([]); + // dataSource!: MatTableDataSource; + + displayedColumns: string[] = [ + 'itemName', + 'batchID', + 'quantityOnHand', + 'adjustmentType', + 'adjustmentQuantity', + 'qOHAfterAdjustment', + 'reason', + 'action', + ]; + stockItemName: any; + + constructor( + private fb: FormBuilder, + private router: Router, + private location: Location, + private http_service: LanguageService, + private route: ActivatedRoute, + private confirmationService: ConfirmationService, + private inventoryService: InventoryService, + ) {} + dataSource = new MatTableDataSource(); + + ngOnInit() { + // this.storeStockAdjustmentForm = this.createStoreStockAdjustmentForm(); + this.storeStockAdjustmentForm = this.fb.group({ + refNo: [''], + adjustmentDate: { value: new Date(), disabled: true }, + stockAdjustmentDraftID: [''], + draftDesc: [''], + stockAdjustmentList: this.fb.array([]), + // stockAdjustmentList: this.fb.array([this.initStockAdjustmentList()]), + }); + this.initStockAdjustmentList(); + this.draftID = this.route.snapshot.paramMap.get('draftID'); + this.fetchLanguageResponse(); + + if (this.draftID) { + this.editMode = true; + this.getStockAdjustmentDraftDetails(this.draftID); + } else { + this.editMode = false; + } + + const isMainStore: any = localStorage.getItem('facilityDetail'); + this.isMainStore = JSON.parse(isMainStore).isMainFacility; + this.showLastUpdatedStockLog(); + this.loadStockAdjData(); + } + + loadStockAdjData() { + const dataFromFun: any = this.stroreStockTableData(); + console.log('dataFromFun####', dataFromFun); + this.dataSource.data = dataFromFun; + } + + createStoreStockAdjustmentForm() { + return this.fb.group({ + refNo: null, + adjustmentDate: { value: new Date(), disabled: true }, + stockAdjustmentDraftID: null, + draftDesc: null, + }); + } + + initStockAdjustmentList() { + const frmArrStoreAdj = this.storeStockAdjustmentForm.get( + 'stockAdjustmentList', + ) as FormArray; + frmArrStoreAdj.push( + this.fb.group({ + itemStockEntryID: [''], + itemID: [''], + itemName: [''], + batchID: [''], + quantityInHand: [''], + adjustmentType: [''], + adjustedQuantity: [''], + qohAfterAdjustment: [''], + reason: [''], + deleted: [''], + stockAdjustmentDraftID: [''], + sADraftItemMapID: [''], + }), + ); + } + initPhysicalStockForm() { + return this.fb.group({ + itemStockEntryID: [''], + itemID: [''], + itemName: [''], + batchID: [''], + quantityInHand: [''], + adjustmentType: [''], + adjustedQuantity: [''], + qohAfterAdjustment: [''], + reason: [''], + deleted: [''], + stockAdjustmentDraftID: [''], + sADraftItemMapID: [''], + }); + } + + stroreStockTableData(): any { + return ( + this.storeStockAdjustmentForm.get('stockAdjustmentList') as FormArray + ).controls; + } + + get stockAdjustmentList() { + return this.storeStockAdjustmentForm.get( + 'stockAdjustmentList', + ) as FormArray; + } + + refresh(event: any, stock: any) { + console.log('event##', event); + stock.controls['itemName'].setValue(event.target.value); + console.log('stock', stock); + console.log('STOCK##', stock); + this.dataSource.data = this.stroreStockTableData(); + } + addToStockAdjustmentList() { + this.stockAdjustmentList.push(this.initPhysicalStockForm()); + this.loadStockAdjData(); + } + + removeFromStockAdjustmentList(index: any, stockForm?: FormGroup) { + const stockArrForm = this.storeStockAdjustmentForm.get( + 'stockAdjustmentList', + ) as FormArray; + + if (stockArrForm.length > 1) { + stockArrForm.removeAt(index); + // stockForm.clear(); + this.loadStockAdjData(); + } else { + if (stockForm) { + stockForm.reset(); + stockForm.controls['itemName'].enable(); + } + } + } + + submitStockAdjustmentDraft(storeStockAdjustmentForm: FormGroup) { + const storeStockAdjustment = JSON.parse( + JSON.stringify(storeStockAdjustmentForm.value), + ); + + const otherDetails = { + createdBy: localStorage.getItem('username'), + modifiedBy: localStorage.getItem('username'), + providerServiceMapID: localStorage.getItem('providerServiceID'), + facilityID: localStorage.getItem('facilityID'), + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + }; + + const stockAdjustmentItemDraft = + storeStockAdjustment.stockAdjustmentList.map((item: any) => { + item.isAdded = item.adjustmentType == 'Receipt' ? true : false; + item.adjustedQuantity = item.adjustedQuantity + ? +item.adjustedQuantity + : 0; + item.adjustmentType = undefined; + item = Object.assign({}, item, otherDetails); + return item; + }); + + const temp = Object.assign({}, storeStockAdjustment, otherDetails, { + stockAdjustmentItemDraft: stockAdjustmentItemDraft, + stockAdjustmentList: undefined, + }); + + this.confirmationService + .provideDraftDescription( + this.currentLanguageSet.inventory.draftDescription, + temp.draftDesc, + ) + .subscribe((draftDesc) => { + temp.draftDesc = draftDesc; + + this.inventoryService + .saveStockAdjustmentDraft(temp) + .subscribe((response) => { + if (temp.stockAdjustmentDraftID) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.updatedSuccessfully, + 'success', + ); + // this.getStockAdjustmentDraftDetails(this.draftID); + this.storeStockAdjustmentForm.reset({ + adjustmentDate: new Date(), + }); + this.location.back(); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.storeStockAdjustmentForm.reset(); + this.storeStockAdjustmentForm.reset({ + adjustmentDate: new Date(), + }); + this.resetStockAdjustmentFormArray(); + } + }); + }); + } + + submitStockAdjustmentFinal(storeStockAdjustmentForm: FormGroup) { + const storeStockAdjustment = JSON.parse( + JSON.stringify(storeStockAdjustmentForm.value), + ); + + const otherDetails = { + createdBy: localStorage.getItem('username'), + providerServiceMapID: localStorage.getItem('providerServiceID'), + facilityID: localStorage.getItem('facilityID'), + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + }; + + const stockAdjustmentItemDraft = + storeStockAdjustment.stockAdjustmentList.map((item: any) => { + item.isAdded = item.adjustmentType == 'Receipt' ? true : false; + item.adjustedQuantity = item.adjustedQuantity + ? +item.adjustedQuantity + : 0; + item.adjustmentType = undefined; + item = Object.assign({}, item, otherDetails); + return item; + }); + + const temp = Object.assign({}, storeStockAdjustment, otherDetails, { + stockAdjustmentItem: stockAdjustmentItemDraft, + stockAdjustmentList: undefined, + }); + + this.inventoryService.saveStockAdjustment(temp).subscribe((response) => { + if (temp.stockAdjustmentDraftID) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + // this.getStockAdjustmentDraftDetails(this.draftID); + this.storeStockAdjustmentForm.reset({ adjustmentDate: new Date() }); + this.location.back(); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.storeStockAdjustmentForm.reset(); + this.storeStockAdjustmentForm.reset({ adjustmentDate: new Date() }); + this.resetStockAdjustmentFormArray(); + } + }); + } + + getStockAdjustmentDraftDetails(draftID: any) { + const temp = parseInt(draftID); + this.inventoryService + .getStockAdjustmentDraftDetails(temp) + .subscribe((response) => { + const stockAdjustmentList = response.stockAdjustmentItemDraftEdit; + + // Clear the existing data in the MatTableDataSource + this.dataSource.data = []; + + for (let i = 0; i < stockAdjustmentList.length; i++) { + stockAdjustmentList[i].adjustmentType = stockAdjustmentList[i].isAdded + ? 'Receipt' + : 'Issue'; + stockAdjustmentList[i].stockAdjustmentDraftID = + response.stockAdjustmentDraftID; + this.dataSource.data.push(stockAdjustmentList[i]); + } + + // Assign the modified data to MatTableDataSource + this.dataSource.data = this.dataSource.data.slice(); + + this.storeStockAdjustmentForm.patchValue({ + adjustmentDate: new Date(response.createdDate), + refNo: response.refNo, + stockAdjustmentDraftID: response.stockAdjustmentDraftID, + draftDesc: response.draftDesc, + }); + }); + } + + calculateQOHAfterAdjustment(stockForm: FormGroup) { + const qoh = parseInt(stockForm.value.quantityInHand) || 0; + const adjustedQuantity = parseInt(stockForm.value.adjustedQuantity) || 0; + const adjustmentType = stockForm.value.adjustmentType; + + if (adjustmentType == 'Receipt') { + if (qoh >= 0 && adjustedQuantity >= 0) + stockForm.patchValue({ qohAfterAdjustment: qoh + adjustedQuantity }); + } else if (adjustmentType == 'Issue') { + if (qoh > 0 && adjustedQuantity >= 0 && adjustedQuantity <= qoh) + stockForm.patchValue({ qohAfterAdjustment: qoh - adjustedQuantity }); + } + } + + resetStockAdjustmentFormArray() { + const stockAdjustmentFormArray = this.storeStockAdjustmentForm.get( + 'stockAdjustmentList', + ) as FormArray; + stockAdjustmentFormArray.controls.length = 0; + this.addToStockAdjustmentList(); + } + + resetStoreStockAdjustmentForm() { + this.storeStockAdjustmentForm.reset({ adjustmentDate: new Date() }); + this.resetStockAdjustmentFormArray(); + } + + goBack() { + this.location.back(); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- + + addEAushadhiStock() { + const reqObj = { + facilityID: localStorage.getItem('facilityID'), + }; + this.inventoryService.addEAushadhiItemsToAmrit(reqObj).subscribe( + (response) => { + if ( + response != null && + response !== undefined && + response.statusCode === 200 + ) { + this.confirmationService.alert(response.data.response, 'success'); + this.showLastUpdatedStockLog(); + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } + showLastUpdatedStockLog() { + const reqObj = { + facilityID: localStorage.getItem('facilityID'), + }; + this.inventoryService.showLastUpdatedStockLogs(reqObj).subscribe( + (logResponse) => { + console.log('response stock', logResponse); + if ( + logResponse != null && + logResponse !== undefined && + logResponse.statusCode === 200 + ) { + if (logResponse.data.lastSuccessDate) + this.lastUpdatedStockDate = new Date( + logResponse.data.lastSuccessDate, + ); + else this.lastUpdatedStockDate = null; + } else { + this.confirmationService.alert(logResponse.errorMessage, 'error'); + } + }, + (err) => { + this.confirmationService.alert(err, 'error'); + }, + ); + } +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.css b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.css new file mode 100644 index 0000000..fc1dcca --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.css @@ -0,0 +1,34 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 15px; +} + +.h5_bold { + font-weight: bold; + display: inline-block; +} + +.m-b-15 { + margin-bottom: 15px; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.html new file mode 100644 index 0000000..d103357 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.html @@ -0,0 +1,178 @@ + + +
+
+ + + + {{ currentLanguageSet?.inventory?.stockAdjustmentID }} + + + {{ stock?.data.stockAdjustmentID }} + + + + + + {{ currentLanguageSet?.inventory?.refNo }} + + + {{ stock?.data.refNo }} + + + + + + {{ currentLanguageSet?.inventory?.createdBy }} + + + {{ stock?.data.createdBy }} + + + + + + {{ currentLanguageSet?.inventory?.createdDate }} + + + {{ stock?.data.createdDate | istDate: "dd/MM/yyyy" }} + + + + + + + + +
+
+ + + search + +
+
+ +
+
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.itemName }} + + + {{ adjustment?.itemName }} + + + + + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + {{ adjustment?.batchID }} + + + + + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + + {{ adjustment?.quantityInHand }} + + + + + + {{ currentLanguageSet?.inventory?.adjustmentType }} + + + {{ adjustment?.isAdded ? "Receipt" : "Issue" }} + + + + + + {{ currentLanguageSet?.inventory?.reason }} + + + {{ adjustment?.reason }} + + + + + + +
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource2.data.length }} +
+ + +
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.spec.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.spec.ts new file mode 100644 index 0000000..cdd3f7c --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStockAdjustmentDetailsComponent } from './view-stock-adjustment-details.component'; + +describe('ViewStockAdjustmentDetailsComponent', () => { + let component: ViewStockAdjustmentDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStockAdjustmentDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStockAdjustmentDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.ts new file mode 100644 index 0000000..2dadee2 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-details/view-stock-adjustment-details.component.ts @@ -0,0 +1,153 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-view-stock-adjustment-details', + templateUrl: './view-stock-adjustment-details.component.html', + styleUrls: ['./view-stock-adjustment-details.component.css'], +}) +export class ViewStockAdjustmentDetailsComponent implements OnInit, DoCheck { + filterTerm!: string; + + stock: any; + adjustmentList: any = []; + // filteredAdjustmentList: any = []; + filteredAdjustmentList = new MatTableDataSource(); + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + stockAdjustmentList = new MatTableDataSource(); + dataSource = new MatTableDataSource(); + dataSource2 = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'stockAdjustmentID', + 'refNo', + 'createdBy', + 'createdDate', + ]; + + storeListColumns: string[] = [ + 'itemName', + 'batchNo', + 'quantityOnHand', + 'adjustmentType', + 'reason', + ]; + + constructor( + private http_service: LanguageService, + @Inject(MAT_DIALOG_DATA) public input: any, + public dialogRef: MatDialogRef, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.fetchLanguageResponse(); + if (this.input && this.input.adjustmentID) { + this.getStockAdjustmentDetails(this.input.adjustmentID); + } + } + + getStockAdjustmentDetails(adjustmentID: any) { + const temp = parseInt(adjustmentID); + this.inventoryService + .getStockAdjustmentDetails(temp) + .subscribe((response) => { + this.stock = response; + console.log('response##', response); + this.stockAdjustmentList.data.push(this.stock); + console.log( + 'this.stockAdjustmentList.data', + this.stockAdjustmentList.data, + ); + this.dataSource = new MatTableDataSource( + this.stockAdjustmentList.data, + ); + this.adjustmentList.push(response.stockAdjustmentItemDraftEdit); + this.filteredAdjustmentList.data.push(this.stock); + this.dataSource2 = new MatTableDataSource( + this.filteredAdjustmentList.data[0].data.stockAdjustmentItemDraftEdit, + ); + this.dataSource2.paginator = this.paginator; + }); + } + + filterDetails(filterTerm: any) { + if (!filterTerm) + this.filteredAdjustmentList.data = this.adjustmentList.slice(); + else { + this.filteredAdjustmentList.data = []; + this.adjustmentList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'itemName' || + key == 'batchID' || + key == 'reason' || + key == 'quantityInHand' || + key == 'adjustedQuantity' || + key == 'isAdded' + ) { + const value: string = '' + item[key]; + if (key == 'isAdded') { + if ( + 'receipt'.indexOf(filterTerm.toLowerCase()) >= 0 && + item[key] + ) { + this.filteredAdjustmentList.data.push(item); + break; + } else if ( + 'issue'.indexOf(filterTerm.toLowerCase()) >= 0 && + !item[key] + ) { + this.filteredAdjustmentList.data.push(item); + break; + } + } + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this.filteredAdjustmentList.data.push(item); + break; + } + } + } + }); + } + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.css b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.css new file mode 100644 index 0000000..7f7e903 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.css @@ -0,0 +1,38 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 15px; +} + +.h5_bold { + font-weight: bold; + display: inline-block; +} + +.m-b-15 { + margin-bottom: 15px; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} + +.box { + /* height: 60px; */ +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.html new file mode 100644 index 0000000..bbe0939 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.html @@ -0,0 +1,178 @@ + + +
+
+ + + + + {{ currentLanguageSet?.inventory?.stockAdjustmentDraftID }} + + + {{ stock?.stockAdjustmentDraftID }} + + + + + + {{ currentLanguageSet?.inventory?.refNo }} + + + {{ stock?.refNo }} + + + + + + {{ currentLanguageSet?.inventory?.draftDescription }} + + + {{ stock?.draftDesc }} + + + + + + {{ currentLanguageSet?.inventory?.createdBy }} + + + {{ stock?.createdBy }} + + + + + + {{ currentLanguageSet?.inventory?.createdDate }} + + + {{ stock?.createdDate | istDate: "dd/MM/yyyy" }} + + + + + + + + +
+
+ + + search + +
+
+ +
+
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.itemName }} + + + {{ adjustment?.itemName }} + + + + + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + + {{ adjustment?.batchID }} + + + + + + {{ currentLanguageSet?.inventory?.quantityOnHand }} + + + {{ adjustment?.quantityInHand }} + + + + + + {{ currentLanguageSet?.inventory?.adjustmentType }} + + + {{ adjustment?.isAdded ? "Receipt" : "Issue" }} + + + + + + {{ currentLanguageSet?.inventory?.reason }} + + + {{ adjustment?.reason }} + + + + + + + +
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.spec.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.spec.ts new file mode 100644 index 0000000..d5826e7 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStockAdjustmentDraftDetailsComponent } from './view-stock-adjustment-draft-details.component'; + +describe('ViewStockAdjustmentDraftDetailsComponent', () => { + let component: ViewStockAdjustmentDraftDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStockAdjustmentDraftDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStockAdjustmentDraftDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.ts new file mode 100644 index 0000000..ef54fc5 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component.ts @@ -0,0 +1,150 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, Inject, DoCheck, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-view-stock-adjustment-draft-details', + templateUrl: './view-stock-adjustment-draft-details.component.html', + styleUrls: ['./view-stock-adjustment-draft-details.component.css'], +}) +export class ViewStockAdjustmentDraftDetailsComponent + implements OnInit, DoCheck +{ + filterTerm!: string; + + stock: any; + adjustmentList: any = []; + // filteredAdjustmentList: any = []; + filteredAdjustmentList = new MatTableDataSource(); + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + stockAdjustmentDraftList = new MatTableDataSource(); + dataSource = new MatTableDataSource(); + newDataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'stockAdjustmentDraftID', + 'refNo', + 'draftDescription', + 'createdBy', + 'createdDate', + ]; + + adjustmentListColumns: string[] = [ + 'itemName', + 'batchNo', + 'quantityOnHand', + 'adjustmentType', + 'reason', + ]; + + constructor( + private http_service: LanguageService, + @Inject(MAT_DIALOG_DATA) public input: any, + public dialogRef: MatDialogRef, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.fetchLanguageResponse(); + if (this.input && this.input.adjustmentID) { + this.getStockAdjustmentDetails(this.input.adjustmentID); + } + } + + getStockAdjustmentDetails(adjustmentID: any) { + const temp = parseInt(adjustmentID); + this.inventoryService + .getStockAdjustmentDraftDetails(temp) + .subscribe((response) => { + this.stock = response; + this.stockAdjustmentDraftList.data.push(this.stock); + this.dataSource = new MatTableDataSource( + this.stockAdjustmentDraftList.data, + ); + this.adjustmentList.push(response.stockAdjustmentItemDraftEdit); + this.filteredAdjustmentList.data.push(this.stock); + this.newDataSource = new MatTableDataSource( + this.filteredAdjustmentList.data[0].data.stockAdjustmentItemDraftEdit, + ); + }); + } + + filterDetails(filterTerm: any) { + if (!filterTerm) + this.filteredAdjustmentList.data = this.adjustmentList.slice(); + else { + this.filteredAdjustmentList.data = []; + this.adjustmentList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'itemName' || + key == 'batchID' || + key == 'reason' || + key == 'quantityInHand' || + key == 'adjustedQuantity' || + key == 'isAdded' + ) { + const value: string = '' + item[key]; + if (key == 'isAdded') { + if ( + 'receipt'.indexOf(filterTerm.toLowerCase()) >= 0 && + item[key] + ) { + this.filteredAdjustmentList.data.push(item); + break; + } else if ( + 'issue'.indexOf(filterTerm.toLowerCase()) >= 0 && + !item[key] + ) { + this.filteredAdjustmentList.data.push(item); + break; + } + } + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this.filteredAdjustmentList.data.push(item); + break; + } + } + } + }); + } + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css new file mode 100644 index 0000000..6735928 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css @@ -0,0 +1,36 @@ +.mdIcon { + vertical-align: text-bottom; +} + +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} + +.previous-btn { + margin: 5px 0px; + background: #43a047 !important; +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; + } + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} + diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html new file mode 100644 index 0000000..8bfb07e --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html @@ -0,0 +1,217 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousStoreAdjustmentDraft }} +

+
+
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} +
+
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.draftID }} + + + {{ adjustment?.stockAdjustmentDraftID }} + + + + + + {{ currentLanguageSet?.inventory?.refNo }} + + + {{ adjustment?.refNo }} + + + + + + {{ currentLanguageSet?.inventory?.draftDescription }} + + + {{ adjustment?.draftDescription }} + + + + + + {{ currentLanguageSet?.inventory?.createdBy }} + + + {{ adjustment?.createdBy }} + + + + + + {{ currentLanguageSet?.inventory?.createdDate }} + + + {{ adjustment?.createdDate | istDate: "dd/MM/yyyy" }} + + + + + + {{ currentLanguageSet?.bendetails?.edit }} + + + remove_red_eye + + + + + + {{ currentLanguageSet?.inventory?.view }} + + + remove_red_eye + + + + + + + +
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.spec.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.spec.ts new file mode 100644 index 0000000..9052727 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStoreStockAdjustmentDraftComponent } from './view-store-stock-adjustment-draft.component'; + +describe('ViewStoreStockAdjustmentDraftComponent', () => { + let component: ViewStoreStockAdjustmentDraftComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStoreStockAdjustmentDraftComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStoreStockAdjustmentDraftComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts new file mode 100644 index 0000000..e82fdd6 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts @@ -0,0 +1,286 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit, ViewChild } from '@angular/core'; +import { Location } from '@angular/common'; +import { Router } from '@angular/router'; +import * as moment from 'moment'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { DataStorageService } from '../../shared/service/data-storage.service'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { ViewStockAdjustmentDraftDetailsComponent } from '../view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-view-store-stock-adjustment-draft', + templateUrl: './view-store-stock-adjustment-draft.component.html', + styleUrls: ['./view-store-stock-adjustment-draft.component.css'], +}) +export class ViewStoreStockAdjustmentDraftComponent implements OnInit, DoCheck { + today: any; + fromDate: any; + toDate: any; + stockAdjustmentList: any = []; + + filterTerm: any; + filteredStockAdjustmentList = new MatTableDataSource(); + // filteredStockAdjustmentList: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + displayedColumns: string[] = [ + 'draftID', + 'refNo', + 'draftDescription', + 'createdBy', + 'createdDate', + 'Edit', + 'view', + ]; + + constructor( + private location: Location, + private router: Router, + private dialog: MatDialog, + private http_service: LanguageService, + private dataStorageService: DataStorageService, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.fromDate = new Date(); + this.fromDate.setHours(0, 0, 0, 0); + this.toDate = new Date(); + + this.today = new Date(); + this.viewRecords(); + this.fetchLanguageResponse(); + } + + viewRecords() { + const startDate: Date = new Date(this.fromDate); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this.toDate); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + const temp = { + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: localStorage.getItem('facilityID') + ? +localStorage.getItem('facilityID')! + : undefined, + }; + + this.inventoryService + .getStockAdjustmentDraftList(temp) + .subscribe((response: any) => { + this.stockAdjustmentList = response; + this.filteredStockAdjustmentList.data.push(response); + this.dataSource = new MatTableDataSource( + this.filteredStockAdjustmentList.data[0].data, + ); + this.filteredStockAdjustmentList.paginator = this.paginator; + }); + } + + filterStockAdjustmentList(filterTerm: any) { + if (!filterTerm) + this.filteredStockAdjustmentList.data = this.stockAdjustmentList.slice(); + else { + this.filteredStockAdjustmentList.data = []; + this.stockAdjustmentList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'stockAdjustmentDraftID' || + key == 'refNo' || + key == 'draftDesc' || + key == 'createdBy' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this.filteredStockAdjustmentList.data.push(item); + break; + } + } + } + }); + } + } + + viewStockAdjustmentDraftDetails(draftID: any) { + this.dialog + .open(ViewStockAdjustmentDraftDetailsComponent, { + width: '80%', + panelClass: 'fit-screen', + data: { + adjustmentID: draftID, + }, + }) + .afterClosed() + .subscribe((response) => { + if (response) { + console.log(response); + const printableData = this.createPrintableData(response); + this.dataStorageService.adjustment = printableData; + const URL = 'adjustment'; + this.router.navigate(['/inventory/dynamicPrint/', URL]); + } + }); + } + + goBack() { + this.location.back(); + } + + goToUpdateAdjustmentDraft(draftID: any) { + this.router.navigate(['inventory/storeStockAdjustment/update', draftID]); + } + createPrintableData(adjustmentDetials: any) { + const facilityDetailStrorage: any = localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetailStrorage); + const facilityName = facilityDetail.facilityName; + const adjustedItemList: any = []; + let i = 0; + + adjustmentDetials.stockAdjustmentItemDraftEdit.forEach((stock: any) => { + i = i + 1; + const temp = { + sNo: i, + itemName: stock.itemName, + batchID: stock.batchID, + quantityInHand: stock.quantityInHand, + adjustedQuantity: stock.adjustedQuantity, + adjustmentType: + stock.isAdded != undefined && stock.isAdded ? 'Receipt' : 'Issue', + reason: stock.reason, + }; + adjustedItemList.push(temp); + }); + + const headerDetails = Object.assign( + { + facilityName: facilityName, + createDate: moment(adjustmentDetials.createdDate).format('DD-MM-YYYY'), + }, + adjustmentDetials, + ); + const printableData = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: headerDetails }, + { columns: this.columns }, + { printableData: adjustedItemList }, + ); + return printableData; + } + + title = { + modalTitle: '', + headerTitle: 'Adjustment Detail', + tableTitle: '', + }; + + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchID', + columnName: 'Batch No', + }, + { + keyName: 'quantityInHand', + columnName: 'Quantity on Hand', + }, + { + keyName: 'adjustedQuantity', + columnName: 'Adjusted Quantity', + }, + { + keyName: 'adjustmentType', + columnName: 'Adjustment Type', + }, + { + columnName: 'Reason', + keyName: 'reason', + }, + ]; + + headerColumn = [ + { + columnName: 'Adjustment Draft ID :', + keyName: 'stockAdjustmentDraftID', + }, + { + columnName: 'Facility ID :', + keyName: 'facilityID', + }, + { + columnName: 'Reference No :', + keyName: 'refNo', + }, + { + columnName: 'Draft Description :', + keyName: 'draftDesc', + }, + { + columnName: 'Created By :', + keyName: 'createdBy', + }, + { + columnName: 'Created Date :', + keyName: 'createDate', + }, + ]; + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.css b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.css new file mode 100644 index 0000000..380c79a --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.css @@ -0,0 +1,47 @@ +.filterTest { + vertical-align: text-bottom; +} + +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} + + + +.previous-btn { + margin: 5px 0px; + background: #43a047 !important; +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +.vertical-align-middle { + vertical-align: middle; +} + +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; + } + + #topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html new file mode 100644 index 0000000..ff1a1a7 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html @@ -0,0 +1,198 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousStoreAdjustment }} +

+
+
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} +
+
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+
+ + + + {{ + currentLanguageSet?.inventory?.index + }} + {{ + i + 1 + }} + + + + + {{ currentLanguageSet?.inventory?.stockAdjustmentID }} + + + {{ adjustment?.stockAdjustmentID }} + + + + + + {{ currentLanguageSet?.inventory?.refNo }} + + + {{ adjustment?.refNo }} + + + + + + {{ currentLanguageSet?.inventory?.createdBy }} + + + {{ adjustment?.createdBy }} + + + + + + {{ currentLanguageSet?.inventory?.createdDate }} + + + {{ adjustment?.createdDate | istDate: "dd/MM/yyyy" }} + + + + + + {{ currentLanguageSet?.inventory?.view }} + + + remove_red_eye + + + + + + + +
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+ + +
+
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.spec.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.spec.ts new file mode 100644 index 0000000..d7efc54 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStoreStockAdjustmentComponent } from './view-store-stock-adjustment.component'; + +describe('ViewStoreStockAdjustmentComponent', () => { + let component: ViewStoreStockAdjustmentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStoreStockAdjustmentComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStoreStockAdjustmentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts new file mode 100644 index 0000000..78c16ee --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts @@ -0,0 +1,288 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit, ViewChild } from '@angular/core'; +import { Location } from '@angular/common'; +import { Router } from '@angular/router'; +import * as moment from 'moment'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { DataStorageService } from '../../shared/service/data-storage.service'; +import { ViewStockAdjustmentDetailsComponent } from '../view-stock-adjustment-details/view-stock-adjustment-details.component'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; + +@Component({ + selector: 'app-view-store-stock-adjustment', + templateUrl: './view-store-stock-adjustment.component.html', + styleUrls: ['./view-store-stock-adjustment.component.css'], +}) +export class ViewStoreStockAdjustmentComponent implements OnInit, DoCheck { + today: any; + fromDate: any; + toDate: any; + stockAdjustmentList: any = []; + _minDate: any; + filterTerm: any; + filteredStockAdjustmentList = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + // filteredStockAdjustmentList: any = []; + currentLanguageSet: any; + languageComponent!: SetLanguageComponent; + dataSource = new MatTableDataSource(); + displayedColumns: string[] = [ + 'stockAdjustmentID', + 'refNo', + 'createdBy', + 'createdDate', + 'view', + ]; + + constructor( + private location: Location, + private dialog: MatDialog, + private http_service: LanguageService, + private router: Router, + private dataStorageService: DataStorageService, + private inventoryService: InventoryService, + ) {} + + ngOnInit() { + this.fromDate = new Date(); + this.fromDate.setHours(0, 0, 0, 0); + this.toDate = new Date(); + + this.today = new Date(); + this.viewRecords(); + this.fetchLanguageResponse(); + } + + viewRecords() { + const startDate: Date = new Date(this.fromDate); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this.toDate); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + const temp = { + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + facilityID: localStorage.getItem('facilityID') + ? +localStorage.getItem('facilityID')! + : undefined, + }; + + this.inventoryService + .getStockAdjustmentList(temp) + .subscribe((response: any) => { + this.stockAdjustmentList = response; + this.filteredStockAdjustmentList.data.push(response); + this.dataSource = new MatTableDataSource( + this.filteredStockAdjustmentList.data[0].data, + ); + this.dataSource.paginator = this.paginator; + console.log('WEEEEE', this.dataSource.data); + }); + } + + filterStockAdjustmentList(filterTerm: any) { + if (!filterTerm) + this.filteredStockAdjustmentList.data = this.stockAdjustmentList.slice(); + else { + this.filteredStockAdjustmentList.data = []; + this.stockAdjustmentList.forEach((item: any) => { + for (const key in item) { + if ( + key == 'stockAdjustmentDraftID' || + key == 'refNo' || + key == 'reason' || + key == 'createdBy' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this.filteredStockAdjustmentList.data.push(item); + break; + } + } + } + }); + } + } + + viewStockAdjustmentDetails(adjustmentID: any) { + this.dialog + .open(ViewStockAdjustmentDetailsComponent, { + width: '80%', + height: '80%', + panelClass: 'fit-screen', + data: { + adjustmentID: adjustmentID, + }, + }) + .afterClosed() + .subscribe((response) => { + if (response) { + const printableData = this.createPrintableData(response); + this.dataStorageService.adjustment = printableData; + const URL = 'adjustment'; + this.router.navigate(['/inventory/dynamicPrint/', URL]); + } + }); + } + + goBack() { + this.location.back(); + } + + goToUpdateAdjustmentDraft(draftID: any) { + this.router.navigate(['inventory/storeStockAdjustment/update', draftID]); + } + + createPrintableData(adjustmentDetials: any) { + const facilityDetailStorage: any = localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetailStorage); + const facilityName = facilityDetail.facilityName; + const adjustedItemList: any = []; + let i = 0; + + adjustmentDetials.stockAdjustmentItemDraftEdit.forEach((stock: any) => { + i = i + 1; + const temp = { + sNo: i, + itemName: stock.itemName, + batchID: stock.batchID, + quantityInHand: stock.quantityInHand, + adjustedQuantity: stock.adjustedQuantity, + adjustmentType: + stock.isAdded != undefined && stock.isAdded ? 'Receipt' : 'Issue', + reason: stock.reason, + }; + adjustedItemList.push(temp); + }); + + const headerDetails = Object.assign( + { + facilityName: facilityName, + createDate: moment(adjustmentDetials.createdDate).format('DD-MM-YYYY'), + }, + adjustmentDetials, + ); + const printableData = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: headerDetails }, + { columns: this.columns }, + { printableData: adjustedItemList }, + ); + return printableData; + } + + setDateDefault() { + this.today = new Date(); + this._minDate = new Date(); + this._minDate.setFullYear(this.today.getFullYear() - 1); + } + + title = { + modalTitle: '', + headerTitle: 'Adjustment Detail', + tableTitle: '', + }; + + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchID', + columnName: 'Batch No', + }, + { + keyName: 'quantityInHand', + columnName: 'Quantity on Hand', + }, + { + keyName: 'adjustedQuantity', + columnName: 'Adjusted Quantity', + }, + { + keyName: 'adjustmentType', + columnName: 'Adjustment Type', + }, + { + columnName: 'Reason', + keyName: 'reason', + }, + ]; + + headerColumn = [ + { + columnName: 'Adjustment ID :', + keyName: 'stockAdjustmentID', + }, + { + columnName: 'Facility ID :', + keyName: 'facilityID', + }, + { + columnName: 'Reference No :', + keyName: 'refNo', + }, + { + columnName: 'Created By :', + keyName: 'createdBy', + }, + { + columnName: 'Created Date :', + keyName: 'createDate', + }, + ]; + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css new file mode 100644 index 0000000..d9ca672 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css @@ -0,0 +1,56 @@ +.input-full-width { + width: 100%; +} + +.mat-form-field { + line-height: unset; +} + +.vertical-align-middle { + vertical-align: middle; +} + +.search-btn { + cursor: pointer; +} + +.m-b-40 { + margin-bottom: 40px; +} + +.m-r-5 { + margin-right: 5px; +} + +.icon-remove { + margin: 16px; +} + +@media screen and (max-width: 768px) { + .button-full-width { + width: 100%; + /* height: 50px; */ + margin-top: 3px; + } +} +.width5 { + width: 5%; +} + +.width10 { + width: 10%; +} + +.width15 { + width: 15%; +} + +.width20 { + width: 20%; +} + +#topBtn { + display: flex; + justify-content: flex-end; + padding-top: 12px; +} diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html new file mode 100644 index 0000000..13c2400 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html @@ -0,0 +1,237 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.stockTransfer }} +

+
+
+ +
+
+ +
+
+
+ + {{ currentLanguageSet?.inventory?.date }} + + +
+
+ + + +
+
+ + + {{ store.facilityName }} + + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.itemName }} + + {{ currentLanguageSet?.itemDispense?.batchNo }} + + {{ currentLanguageSet?.inventory?.qOH }} + + {{ currentLanguageSet?.inventory?.quantity }} + + {{ currentLanguageSet?.bendetails?.action }} +
{{ i + 1 }} + + + search + + + + + + + + + + + + + + + delete +
+ +
+
+
+
+
+ +
+
+ + + +
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.spec.ts b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.spec.ts new file mode 100644 index 0000000..6cbca35 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StoreStockTransferComponent } from './store-stock-transfer.component'; + +describe('StoreStockTransferComponent', () => { + let component: StoreStockTransferComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [StoreStockTransferComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StoreStockTransferComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts new file mode 100644 index 0000000..bdf2e94 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts @@ -0,0 +1,319 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Router } from '@angular/router'; +import { InventoryService } from '../shared/service/inventory.service'; +import { + FormBuilder, + FormArray, + Validators, + FormGroup, + AbstractControl, +} from '@angular/forms'; +import { ConfirmationService } from '../../core/services/confirmation.service'; +import { Component, DoCheck, OnInit } from '@angular/core'; +import { animate, style, transition, trigger } from '@angular/animations'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { LanguageService } from '../../core/services/language.service'; +import * as moment from 'moment'; +import { MatTableDataSource } from '@angular/material/table'; +@Component({ + selector: 'app-store-stock-transfer', + templateUrl: './store-stock-transfer.component.html', + styleUrls: ['./store-stock-transfer.component.css'], + animations: [ + trigger('enterAnimation', [ + transition(':enter', [ + style({ opacity: 0 }), + animate('200ms', style({ opacity: 1 })), + ]), + transition(':leave', [ + style({ opacity: 1 }), + animate('200ms', style({ opacity: 0 })), + ]), + ]), + ], +}) +export class StoreStockTransferComponent implements OnInit, DoCheck { + stockTransferForm!: FormGroup; + arrayHead!: FormArray; + facilityID: any; + stores: any = []; + filterStore: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + dataSource!: MatTableDataSource; + displayedColumns: string[] = [ + 'itemName', + 'batchID', + 'qOH', + 'adjustmentType', + 'action', + ]; + + constructor( + private inventoryService: InventoryService, + private alertService: ConfirmationService, + private fb: FormBuilder, + private router: Router, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) { + this.checkFacility(); + } + + ngOnInit() { + this.getAllStore(); + this.stockTransferForm = this.createStockTransferForm(); + this.setArrayHead(); + this.updateTodaysData(); + this.fetchLanguageResponse(); + } + + stroreStockTransferTableData(): any { + return (this.stockTransferForm.get('itemArray') as FormArray).controls; + } + + checkFacility() { + this.facilityID = localStorage.getItem('facilityID'); + if (this.facilityID == null || this.facilityID <= 0) { + this.router.navigate(['/inventory']); + } + } + + getAllStore() { + const serviceProviderId = localStorage.getItem('providerServiceID'); + this.inventoryService.getAllStore(serviceProviderId).subscribe((data) => { + console.log('data****', data); + const newArr: any = Object.entries(data).map(([key, value]) => value); + console.log('newArr****', newArr); + this.stores = newArr[0].filter((item: any) => item.deleted == false); + console.log('stores$$$', this.stores); + this.filterStore = this.filterSubStore(this.stores, this.facilityID); + console.log('filterStore&&&&&', this.filterStore); + }); + } + + filterSubStore(storeList: any, facilityID: any) { + const source = storeList.filter( + (item: any) => item.facilityID == facilityID, + ); + + const children = []; + const queue = []; + queue.push(source[0]); + + while (queue.length > 0) { + const front = queue.shift(); + children.push(front); + storeList.forEach((item: any) => { + if (item.mainFacilityID && item.mainFacilityID == front.facilityID) + queue.push(item); + }); + } + + const index = children.indexOf(source[0]); + children.splice(index, 1); + + const parent = storeList.filter( + (item: any) => + source[0].mainFacilityID && item.facilityID == source[0].mainFacilityID, + ); + const sibling = storeList.filter( + (item: any) => + source[0].mainFacilityID && + item.mainFacilityID == source[0].mainFacilityID, + ); + + const index2 = sibling.indexOf(source[0]); + sibling.splice(index2, 1); + + const final = new Set(parent.concat(sibling).concat(children)); + return Array.from(final); + } + + createStockTransferForm() { + return this.fb.group({ + dated: { value: null, disabled: true }, + referenceNumber: [null, Validators.required], + transferTo: [null, Validators.required], + createdBy: [null, Validators.required], + providerServiceMapID: [null, Validators.required], + itemArray: new FormArray([this.createItem()]), + }); + } + + createItem() { + return this.fb.group({ + batchNo: [null, Validators.required], + itemStockEntryID: [null, Validators.required], + itemName: [null, Validators.required], + qoh: [null, Validators.required], + quantity: [null, Validators.required], + }); + } + + setArrayHead() { + this.arrayHead = this.stockTransferForm.controls['itemArray'] as FormArray; + } + + updateTodaysData() { + this.stockTransferForm.patchValue({ + dated: moment(new Date()).format('DD/MM/YYYY'), + createdBy: localStorage.getItem('username'), + providerServiceMapID: localStorage.getItem('providerServiceID'), + }); + } + + addTransfer() { + if (this.arrayHead.valid) { + this.arrayHead.push(this.createItem()); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.pleaseenterthevaluesfirst, + 'info', + ); + } + } + + removeTransfer(index: any, length: any) { + const stockArray = this.stockTransferForm.controls[ + 'itemArray' + ] as FormArray; + if (stockArray.length > 1) { + stockArray.removeAt(index); + } + + if (index === 0 && length === 1) { + // this.addTransfer(); + // stockArray.removeAt(index); + stockArray.reset(); + stockArray?.reset(); + stockArray.enable(); + } + } + + matcher(control: any, form: any) { + const isSubmitted = form && form.submitted; + return !!( + control && + control.invalid && + (control.dirty || control.touched || isSubmitted) + ); + } + + resetForm() { + this.resetItemArray(); + this.stockTransferForm.reset(); + this.updateTodaysData(); + } + + resetItemArray() { + this.stockTransferForm.removeControl('itemArray'); + this.stockTransferForm.addControl( + 'itemArray', + new FormArray([this.createItem()]), + ); + this.setArrayHead(); + } + + checkReferences() { + if ( + this.stockTransferForm.value.referenceNumber && + this.stockTransferForm.value.transferTo + ) { + return true; + } else { + this.resetItemArray(); + return false; + } + } + + checkQuantityAvailable(index: any) { + if ( + this.arrayHead.at(index).value.quantity > + this.arrayHead.at(index).value.qoh + ) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.transferquantitycannotbegreater, + 'info', + ); + this.arrayHead.at(index).patchValue({ + quantity: null, + }); + } + } + + submitTransfers() { + console.log(this.stockTransferForm.value); + this.inventoryService + .saveStockTransfer(this.serviceDataMapper(this.stockTransferForm.value)) + .subscribe((res) => { + if (res && res.response) { + this.confirmationService.alert( + this.currentLanguageSet.inventory.savedsuccessfully, + 'success', + ); + this.resetForm(); + } + }); + } + + serviceDataMapper(formValues: any) { + return { + createdBy: formValues.createdBy, + refNo: formValues.referenceNumber, + providerServiceMapID: formValues.providerServiceMapID, + transferFromFacilityID: this.facilityID, + vanID: localStorage.getItem('vanID'), + parkingPlaceID: localStorage.getItem('parkingPlaceID'), + transferToFacilityID: formValues.transferTo.facilityID, + itemStockExit: this.mapItemsForService( + formValues.itemArray, + formValues.createdBy, + ), + }; + } + + mapItemsForService(itemArray: any, createdBy: any) { + const itemStockExit: any = []; + itemArray.forEach((element: any) => { + itemStockExit.push({ + createdBy: createdBy, + itemStockEntryID: element.itemStockEntryID, + quantity: element.quantity, + }); + }); + return itemStockExit; + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.css b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.css new file mode 100644 index 0000000..f538cc3 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.css @@ -0,0 +1,34 @@ +#head { + background: #336CFB; + color: white; + height: 51px; + width: 100%; + padding: 20px; +} + +#dialog_head { + margin: 0; + padding: 0; +} + +#cross { + cursor: pointer; +} + +#dialog_row { + padding: 15px; +} + +.h5_bold { + font-weight: bold; + display: inline-block; +} + +.m-b-15 { + margin-bottom: 15px; +} + +.scrolling-content { + max-height: 75vh; + overflow: auto; +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.html b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.html new file mode 100644 index 0000000..0ed4748 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.html @@ -0,0 +1,214 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.stockTransferID }} + + {{ item?.stockEntry?.stockTransferID }} + + {{ currentLanguageSet?.inventory?.refNo }} + {{ item?.stockEntry?.refNo }} + {{ currentLanguageSet?.inventory?.transferFrom }} + + {{ item?.stockEntry?.transferFromFacility }} + + {{ currentLanguageSet?.inventory?.transferTo }} + + {{ item?.stockEntry?.transferToFacility }} + + {{ currentLanguageSet?.inventory?.createdBy }} + + {{ item?.stockEntry?.createdBy }} + + {{ currentLanguageSet?.inventory?.createdDate }} + + {{ item?.stockEntry?.createdDate | istDate: "dd/MM/yyyy" }} +
+ +
+
+ + + search + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ dataSource.data.length }} +
+
+ +
+
+ + + +
+ {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.itemName }} + {{ item?.itemName }} + {{ currentLanguageSet?.itemDispense?.batchNo }} + {{ item?.batchNo }} + {{ currentLanguageSet?.itemDispense?.expiryDate }} + + {{ item?.expiryDate | istDate: "dd/MM/yyyy" }} + + {{ currentLanguageSet?.inventory?.quantity }} + {{ item?.quantity }}
+
+
+
+ +
+
+ +
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.spec.ts b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.spec.ts new file mode 100644 index 0000000..ecb4627 --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStoreStockTransferDetailsComponent } from './view-store-stock-transfer-details.component'; + +describe('ViewStoreStockTransferDetailsComponent', () => { + let component: ViewStoreStockTransferDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStoreStockTransferDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStoreStockTransferDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.ts b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.ts new file mode 100644 index 0000000..beb5a5c --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer-details/view-store-stock-transfer-details.component.ts @@ -0,0 +1,124 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + Inject, + OnDestroy, + DoCheck, + ViewChild, +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; + +@Component({ + selector: 'app-view-store-stock-transfer-details', + templateUrl: './view-store-stock-transfer-details.component.html', + styleUrls: ['./view-store-stock-transfer-details.component.css'], +}) +export class ViewStoreStockTransferDetailsComponent + implements OnInit, OnDestroy, DoCheck +{ + _filterTerm = ''; + _detailedList = []; + // _filteredDetailedList = []; + blankTable = [1, 2, 3, 4, 5]; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + _filteredDetailedList = new MatTableDataSource(); + dataSourceTransferList = new MatTableDataSource(); + dataSource = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + + constructor( + private http_service: LanguageService, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + ngOnInit() { + this.populateStockEntryItems(this.data); + this.dataSourceTransferList.data.push(this.data); + console.log('OOOOOOO', this.dataSourceTransferList.data); + this.fetchLanguageResponse(); + } + + ngOnDestroy(): void { + //Called once, before the instance is destroyed. + //Add 'implements OnDestroy' to the class. + this.data = ''; + } + populateStockEntryItems(data: any) { + if (data && data.entryDetails && data.stockEntry) { + this._detailedList = data.entryDetails; + console.log(' this._detailedList', this._detailedList); + this._filteredDetailedList.data.push(this._detailedList); + this.dataSource = new MatTableDataSource( + this._filteredDetailedList.data[0].data, + ); + console.log('dataSourceG', this.dataSource.data); + } + } + + filterDetails(filterTerm: string) { + console.log(filterTerm); + if (!filterTerm) this._filteredDetailedList.data = this._detailedList; + else { + this._filteredDetailedList.data = []; + this._detailedList.forEach((item) => { + for (const key in item) { + if (key == 'batchNo' || key == 'itemName' || key == 'quantity') { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(filterTerm.toLowerCase()) >= 0) { + this._filteredDetailedList.data.push(item); + break; + } + } + } + }); + } + } + + print() { + this.closeViewModal(); + } + + closeViewModal() { + const modalresult = Object.assign({ print: true }); + this.dialogRef.close(modalresult); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css new file mode 100644 index 0000000..8445f7b --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css @@ -0,0 +1,88 @@ +.transfer { + position: relative; + padding-left: 20px; +} + +.transfer.transfer-in::before { + content: ""; + position: absolute; + left: 0; + top: 0; + bottom: 1px; + width: 4px; + background: #0b69b2; +} + +.transfer.transfer-out::before { + content: ""; + position: absolute; + left: 0; + top: 0; + bottom: 1px; + width: 4px; + background: #ff9900; +} + +ul { + list-style: none; + padding: 0px; +} + +ul li { + display: inline-block; + padding: 0 8px; +} + +ul li div, ul li p { + display: inline-block; +} + +ul li div { + height: 15px; + width: 15px; +} + +.transfer-in-marker { + background: #0b69b2; +} + +.transfer-out-marker { + background: #ff9900; +} + +.totalCount, .description { + padding-top: 15px; +} + +.input-full-width { + width: 100%; +} + +.box { + height: 60px; +} + +.back-btn-container { + margin: -26px 15px 15px; +} + +.previous-btn { + margin: 5px 0px; + background: #43a047 !important; +} + +.m-b-40 { + margin-bottom: 40px !important; +} + +.noRecord { + text-align: center; font-size: 16px; display: flex; + justify-content: center;padding-top: 14px; +} + + +@media screen and (max-width: 768px) { + .previous-btn { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html new file mode 100644 index 0000000..8429e4b --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html @@ -0,0 +1,295 @@ +
+
+
+

+ {{ currentLanguageSet?.inventory?.previousStockTransfer }} +

+
+ +
+ + {{ currentLanguageSet?.inventory?.fromDate }} + + + + +
+ +
+ + {{ currentLanguageSet?.inventory?.toDate }} + + + + + {{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }} +
+ +
+ +
+
+ +
+
+ + +
+
+ + + search + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.refNo }} + + {{ entry.refNo }} + + {{ currentLanguageSet?.inventory?.transferID }} + + {{ entry?.stockTransferID }} + + {{ currentLanguageSet?.inventory?.transferFrom }} + + {{ entry?.transferFromFacility }} + + {{ currentLanguageSet?.inventory?.transferTo }} + + {{ entry?.transferToFacility }} + + {{ currentLanguageSet?.inventory?.createdBy }} + + {{ entry?.createdBy }} + + {{ currentLanguageSet?.inventory?.createdDate }} + + {{ entry?.createdDate | istDate: "dd/MM/yyyy" }} +
+
+ {{ + currentLanguageSet?.inventory?.norecordsfound + }} +
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ _filteredStockEntryList.data.length }} +
+
+
    +
  • +
    +

    {{ currentLanguageSet?.inventory?.transferIn }}

    +
  • +
  • +
    +

    {{ currentLanguageSet?.inventory?.transferOut }}

    +
  • +
+
+ + +
+
+
+
+ +
+ +
+
+
+
+
+
diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.spec.ts b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.spec.ts new file mode 100644 index 0000000..f456cbc --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewStoreStockTransferComponent } from './view-store-stock-transfer.component'; + +describe('ViewStoreStockTranferComponent', () => { + let component: ViewStoreStockTransferComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ViewStoreStockTransferComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewStoreStockTransferComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts new file mode 100644 index 0000000..d74ec2f --- /dev/null +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts @@ -0,0 +1,349 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + HostListener, + ViewChild, + DoCheck, +} from '@angular/core'; +import { ViewStoreStockTransferDetailsComponent } from './view-store-stock-transfer-details/view-store-stock-transfer-details.component'; +import { Location } from '@angular/common'; +import { InventoryService } from '../../shared/service/inventory.service'; +import { DataStorageService } from './../../shared/service/data-storage.service'; +import * as moment from 'moment'; +import { Router } from '@angular/router'; +import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatPaginator } from '@angular/material/paginator'; +@Component({ + selector: 'app-view-store-stock-transfer', + templateUrl: './view-store-stock-transfer.component.html', + styleUrls: ['./view-store-stock-transfer.component.css'], +}) +export class ViewStoreStockTransferComponent implements OnInit, DoCheck { + _minDate: any; + _today: any; + + _dateRange: Date[] = []; + _dateRangePrevious: Date[] = []; + + _stockEntryList = []; + _filteredStockEntryList = new MatTableDataSource(); + @ViewChild(MatPaginator) paginator: MatPaginator | null = null; + blankTable = [1, 2, 3, 4, 5]; + filterTerm: any; + ourStore: any; + searched = false; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + + constructor( + private location: Location, + private inventoryService: InventoryService, + private dataStorageService: DataStorageService, + private dialog: MatDialog, + private http_service: LanguageService, + private router: Router, + ) {} + + ngOnInit() { + this.setDateDefault(); + this.fetchLanguageResponse(); + + this.getPastEntries(); + this.ourStore = localStorage.getItem('facilityID'); + } + + setDateDefault() { + this._today = new Date(); + this._minDate = new Date(); + this._minDate.setFullYear(this._today.getFullYear() - 1); + this._dateRange[0] = this._today; + this._dateRange[1] = this._today; + + // const date = new Date(); // Now + // date.setDate(date.getDate() - 30); + // this._dateRange = [date, new Date()] + console.log(this._dateRange, 'dateRange'); + } + + getPastEntries() { + const obj = this.getViewServiceObject(); + this.inventoryService.viewStockTransferEntry(obj).subscribe((res) => { + this.searched = true; + this.loadEntries(res); + }); + } + + getViewServiceObject() { + const startDate: Date = new Date(this._dateRange[0]); + startDate.setHours(0); + startDate.setMinutes(0); + startDate.setSeconds(0); + startDate.setMilliseconds(0); + + const endDate: Date = new Date(this._dateRange[1]); + endDate.setHours(23); + endDate.setMinutes(59); + endDate.setSeconds(59); + endDate.setMilliseconds(0); + + return { + facilityID: localStorage.getItem('facilityID'), + fromDate: new Date( + startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, + ), + toDate: new Date( + endDate.valueOf() - 1 * endDate.getTimezoneOffset() * 60 * 1000, + ), + }; + } + preventTyping(e: any) { + if (e.keyCode === 9) { + return true; + } else { + return false; + } + } + + updateDate() { + this.getPastEntries(); + + // } + } + + loadEntries(entriesObject: any) { + console.log('entriesObj', entriesObject); + const newObject: any = []; + if (entriesObject) { + entriesObject.data.forEach((element: any) => { + newObject.push({ + refNo: element.refNo, + stockTransferID: element.stockTransferID, + transferFromID: element.transferFromFacilityID, + transferToID: element.transferToFacilityID, + transferFromFacility: element.transferFromFacility.facilityName, + transferToFacility: element.transferToFacility.facilityName, + createdBy: element.createdBy, + createdDate: element.createdDate || 'Not Available', + }); + }); + } + this._stockEntryList = newObject; + this._filteredStockEntryList.data = newObject; + this._filteredStockEntryList.paginator = this.paginator; + console.log( + 'this._filteredStockEntryList.dataJK', + this._filteredStockEntryList.data, + ); + this.filterTerm = ''; + } + + filterConsumptionList(searchTerm: string) { + if (!searchTerm) { + this._filteredStockEntryList.data = this._stockEntryList; + this._filteredStockEntryList.paginator = this.paginator; + } else { + this._filteredStockEntryList.data = []; + this._filteredStockEntryList.paginator = this.paginator; + this._stockEntryList.forEach((item) => { + for (const key in item) { + if ( + key == 'refNo' || + key == 'stockTransferID' || + key == 'transferFromFacility' || + key == 'transferToFacility' || + key == 'createdBy' + ) { + const value: string = '' + item[key]; + if (value.toLowerCase().indexOf(searchTerm.toLowerCase()) >= 0) { + this._filteredStockEntryList.data.push(item); + this._filteredStockEntryList.paginator = this.paginator; + break; + } + } + } + }); + } + } + + loadEntryDetails(entry: any) { + if (entry && entry.stockTransferID) { + this.inventoryService + .getParticularStockTransferEntry(entry.stockTransferID) + .subscribe((res) => this.popOutEntryDetails(entry, res)); + } + } + + popOutEntryDetails(entry: any, stockEntryResponse: any) { + console.warn(entry, stockEntryResponse); + if (stockEntryResponse) { + const mdDialogRef: MatDialogRef = + this.dialog.open(ViewStoreStockTransferDetailsComponent, { + // height: '90%', + width: '80%', + panelClass: 'fit-screen', + data: { stockEntry: entry, entryDetails: stockEntryResponse }, + disableClose: false, + }); + mdDialogRef.afterClosed().subscribe((result) => { + if (result) { + if (result.print != null && result.print == true) { + if (result.print) { + const printableData = this.createPrintableData( + entry, + stockEntryResponse, + ); + this.dataStorageService.stockTransfer = printableData; + const uRL = 'stockTransfer'; + this.router.navigate(['/inventory/dynamicPrint/', uRL]); + } + } + } + }); + } + } + + createPrintableData(entry: any, stockEntryResponse: any) { + const facilityDetailStorage: any = localStorage.getItem('facilityDetail'); + const facilityDetail = JSON.parse(facilityDetailStorage); + const facilityName = facilityDetail.facilityName; + const printableData: any = []; + let i = 0; + console.log( + 'stockEntryResponse', + JSON.stringify(stockEntryResponse, null, 4), + ); + stockEntryResponse.forEach((batch: any) => { + i = i + 1; + const consumedBatch = { + sNo: i, + itemName: batch.itemName, + batchNo: batch.batchNo, + expiryDate: moment(batch.expiryDate).format('DD-MM-YYYY'), + qod: batch.quantity, + }; + printableData.push(consumedBatch); + }); + console.log('consumptionDetails', JSON.stringify(entry, null, 4)); + const entryDetails = Object.assign( + { + facilityName: facilityName, + createDate: moment(entry.createdDate).format('DD-MM-YYYY'), + }, + entry, + ); + console.log('consumptionResponse', JSON.stringify(printableData, null, 4)); + const stockEntered = Object.assign( + {}, + { title: this.title }, + { headerColumn: this.headerColumn }, + { headerDetail: entryDetails }, + { columns: this.columns }, + { printableData: printableData }, + ); + return stockEntered; + } + + goBack() { + this.location.back(); + } + + title = { + modalTitle: '', + headerTitle: 'Stock Transfer Detail', + tableTitle: '', + }; + columns = [ + { + keyName: 'sNo', + columnName: 'S No.', + }, + { + keyName: 'itemName', + columnName: 'Item Name', + }, + { + keyName: 'batchNo', + columnName: 'Batch No', + }, + { + keyName: 'expiryDate', + columnName: 'Expiry Date', + }, + { + keyName: 'qod', + columnName: 'Quantity', + }, + ]; + headerColumn = [ + { + columnName: 'Stock Transfer ID :', + keyName: 'stockTransferID', + }, + { + columnName: 'Reference No :', + keyName: 'refNo', + }, + { + columnName: 'Transfer From ID :', + keyName: 'transferFromID', + }, + + { + columnName: 'Transfer From Facility :', + keyName: 'transferFromFacility', + }, + { + columnName: 'Transfer To ID :', + keyName: 'transferToID', + }, + { + columnName: 'Transfer To Facility :', + keyName: 'transferToFacility', + }, + + { + columnName: 'Created By :', + keyName: 'createdBy', + }, + { + columnName: 'Created Date :', + keyName: 'createDate', + }, + ]; + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/inventory/utc-date.pipe.ts b/src/app/app-modules/inventory/utc-date.pipe.ts new file mode 100644 index 0000000..1290391 --- /dev/null +++ b/src/app/app-modules/inventory/utc-date.pipe.ts @@ -0,0 +1,46 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'utcDate', +}) +export class UtcDatePipe implements PipeTransform { + transform(value: string): any { + if (!value) { + return ''; + } + + const dateValue = new Date(value); + + const dateWithNoTimezone = new Date( + dateValue.getUTCFullYear(), + dateValue.getUTCMonth(), + dateValue.getUTCDate(), + dateValue.getUTCHours(), + dateValue.getUTCMinutes(), + dateValue.getUTCSeconds(), + ); + + return dateWithNoTimezone; + } +} diff --git a/src/app/app-modules/inventory/workarea/workarea.component.css b/src/app/app-modules/inventory/workarea/workarea.component.css new file mode 100644 index 0000000..85965f9 --- /dev/null +++ b/src/app/app-modules/inventory/workarea/workarea.component.css @@ -0,0 +1,13 @@ +h3 { + font-size: 150px; + font-weight: bold; + background-color: #565656; + color: transparent; + text-align: center; + vertical-align: bottom; + opacity: 0.3; + text-shadow: 2px 2px 3px rgba(255,255,255,0.5); + -webkit-background-clip: text; + -moz-background-clip: text; + background-clip: text; +} diff --git a/src/app/app-modules/inventory/workarea/workarea.component.html b/src/app/app-modules/inventory/workarea/workarea.component.html new file mode 100644 index 0000000..d2fb3d6 --- /dev/null +++ b/src/app/app-modules/inventory/workarea/workarea.component.html @@ -0,0 +1 @@ + diff --git a/src/app/app-modules/inventory/workarea/workarea.component.spec.ts b/src/app/app-modules/inventory/workarea/workarea.component.spec.ts new file mode 100644 index 0000000..4baf7b3 --- /dev/null +++ b/src/app/app-modules/inventory/workarea/workarea.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WorkareaComponent } from './workarea.component'; + +describe('WorkareaComponent', () => { + let component: WorkareaComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [WorkareaComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WorkareaComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/inventory/workarea/workarea.component.ts b/src/app/app-modules/inventory/workarea/workarea.component.ts new file mode 100644 index 0000000..967d333 --- /dev/null +++ b/src/app/app-modules/inventory/workarea/workarea.component.ts @@ -0,0 +1,44 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + ChangeDetectorRef, + AfterViewChecked, +} from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-workarea', + templateUrl: './workarea.component.html', + styleUrls: ['./workarea.component.css'], +}) +export class WorkareaComponent implements AfterViewChecked { + constructor( + private changeDetectorRef: ChangeDetectorRef, + private router: Router, + ) {} + + ngAfterViewChecked() { + this.changeDetectorRef.detectChanges(); + } +} diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css new file mode 100644 index 0000000..1256eb0 --- /dev/null +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css @@ -0,0 +1,82 @@ +.stepper { + margin-bottom: 100px; +} + +.mat-stepper-horizontal { + padding: 0px; + background: #f2f2f0 !important; +} + +.mat-horizontal-stepper-header-container { + background: #f2f2f0 !important; +} + +.step-btn button { + float: right; + margin-left: 5px; +} + +md-card { + min-height: 425px; +} + + +.example-sidenav-fab-container { + width: 100%; + overflow: auto; +} + +.sideNav { + max-width: 250px; + display: flex; +} + +.example-scrolling-content { + flex: auto; + /* overflow: auto; */ + background: #f2f2f0 !important; + min-height: 500px; +} + +.sidenav { + padding: 20px; +} + +.content { + background: #f2f2f0 !important; + padding: 20px 0px; +} + +.example-fab.mat-mini-fab { + position: fixed; + left: 20px; + bottom: 50px; + z-index: 3; +} + +.centered { + display: flex; + align-items: center; + justify-content: center; +} + +@media only screen and (max-width: 700px) { + + + .example-sidenav-fab-container{ + height: stretch; + } + + .sideNav { + max-width: unset; + width: 50%; + } + + .example-sidenav-fab-container .content { + height: stretch; + } +} + +.actionButton { + float: right; +} diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html new file mode 100644 index 0000000..c3fcf55 --- /dev/null +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html @@ -0,0 +1,83 @@ + + +
+ + + + +
+ +
+
+
+
+
+ + + {{ currentLanguageSet?.itemDispense?.systemIssue }} + + + {{ currentLanguageSet?.itemDispense?.manualIssue }} + + + +
+
+ + + +
+
+
+
+ +
+
+
+
+
+ + diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.spec.ts b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.spec.ts new file mode 100644 index 0000000..8e790d7 --- /dev/null +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RxDashboardComponent } from './rx-dashboard.component'; + +describe('RxDashboardComponent', () => { + let component: RxDashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RxDashboardComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RxDashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts new file mode 100644 index 0000000..d67f264 --- /dev/null +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts @@ -0,0 +1,223 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, DoCheck, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { BeneficiaryDetailsService } from '../../core/services/beneficiary-details.service'; +import { PrescribedDrugService } from './../shared/service/prescribed-drug.service'; +import { ConfirmationService } from '../../core/services/confirmation.service'; +import { LanguageService } from '../../core/services/language.service'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; + +@Component({ + selector: 'app-rx-dashboard', + templateUrl: './rx-dashboard.component.html', + styleUrls: ['./rx-dashboard.component.css'], +}) +export class RxDashboardComponent implements OnInit, DoCheck { + @ViewChild('prescribedList') public prescribedList: any; + + visitCode: any; + today: any; + beneficiaryDetailsSubscription: any; + prescription: any; + dispensed: any; + issueType: any = 1; + beneficiary: any; + username: any; + // issueType 0 means Manual and 1 means System + benRegID: any; + parent_url: any; + languageComponent!: SetLanguageComponent; + + currentLanguageSet: any; + constructor( + private route: ActivatedRoute, + private beneficiaryDetailsService: BeneficiaryDetailsService, + private prescribedDrugService: PrescribedDrugService, + private confirmationService: ConfirmationService, + private http_service: LanguageService, + ) {} + + ngOnInit() { + this.issueType = 1; + this.fetchLanguageResponse(); + this.parent_url = sessionStorage.getItem('return'); + this.username = localStorage.getItem('username'); + this.getBenDetails(); + this.getPrescriptionDetails(); + } + + getBenDetails() { + this.visitCode = sessionStorage.getItem('parentBenVisit'); + this.today = new Date(); + this.route.params.subscribe((param) => { + this.benRegID = param['beneficiaryRegID']; + const benFlowID: any = localStorage.getItem('benFlowID'); + this.beneficiaryDetailsService.getBeneficiaryDetails( + this.benRegID, + benFlowID, + ); + this.beneficiaryDetailsSubscription = + this.beneficiaryDetailsService.beneficiaryDetails$.subscribe((res) => { + if (res != null) { + console.log('response0', res); + if (res.serviceDate) { + console.log('response1', res); + this.beneficiary = res; + console.log('beneficiary', this.beneficiary); + this.today = res.serviceDate; + } + } + }); + }); + } + + sideNavModeChange(sidenav: any) { + const deviceHeight = window.screen.height; + const deviceWidth = window.screen.width; + + if (deviceWidth < 700) { + sidenav.mode = 'over'; + } else { + sidenav.mode = 'side'; + } + sidenav.toggle(); + } + + getPrescriptionDetails() { + const visitCode = sessionStorage.getItem('parentBenVisit'); + const facilityID = localStorage.getItem('facilityID'); + const beneficiaryRegID = this.benRegID; + this.prescribedDrugService + .getPrescription({ visitCode, facilityID, beneficiaryRegID }) + .subscribe( + (res: any) => { + if (res.data && res.statusCode == 200) { + console.log(res); + this.prescription = res.data || undefined; + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.errorinFetchingData, + 'warn', + ); + } + }, + (err: any) => {}, + ); + } + + submitForm(prescriptionForm: any): void { + this.confirmationService + .confirm( + 'Confirmation', + this.currentLanguageSet.alerts.confirmtoProceedFurther, + ) + .subscribe((res) => { + if (res) { + this.saveDispense(prescriptionForm); + } + + // console.log(JSON.stringify(prescription, null, 4)); + }); + } + + saveDispense(prescriptionForm: any) { + const prescription = prescriptionForm.value; + const reqObj = this.getSubmitObject(prescription); + return this.prescribedDrugService + .saveStockExit(reqObj) + .subscribe((res: any) => { + if (res.statusCode == 200) { + // this.confirmationService.confirm('info', 'Items Dispensed').subscribe( + // () => { + const language = localStorage.getItem('currentLanguage'); + window.location.href = `${this.parent_url}?resolve=Y¤tLanguage=${language}`; + // } + // ); + } else { + this.confirmationService.alert(res.errorMessage, 'warn'); + } + }); + } + + getSubmitObject(prescription: any) { + const facilityDetail: any = localStorage.getItem('facilityDetail'); + const facilityID = JSON.parse(facilityDetail).facilityID; + const facilityName = JSON.parse(facilityDetail).facilityName; + const visitCode = this.visitCode; + const beneficiary = this.beneficiary; + console.log('beneficiaryHKK', beneficiary); + const issuedBy = sessionStorage.getItem('host') + ? sessionStorage.getItem('host') + : 'STORE'; + const itemStockExit = this.getBatchObj(prescription.itemList); + const reqObj = { + issuedBy, + itemStockExit, + visitCode, + facilityID, + facilityName, + age: beneficiary.ageVal, + beneficiaryID: beneficiary.beneficiaryID, + benRegID: beneficiary.beneficiaryRegID, + createdBy: this.username, + providerServiceMapID: localStorage.getItem('providerServiceID'), + doctorName: prescription.consultantName, + gender: beneficiary.genderName, + issueType: this.issueType === 0 ? 'Manual' : 'System', + patientName: beneficiary.beneficiaryName, + prescriptionID: prescription.prescriptionID, + reference: `Prescribed by ${prescription.consultantName} from ${sessionStorage.getItem('host')}`, + visitID: beneficiary.benVisitID, + visitDate: beneficiary.serviceDate, + }; + + return reqObj; + } + + getBatchObj(itemList: any) { + const items: any = []; + itemList.forEach((item: any) => { + item.batchList.forEach((batch: any) => { + items.push({ + itemID: item.drugID, + itemStockEntryID: batch.itemStockEntryID, + quantity: batch.quantity, + createdBy: this.username, + }); + }); + }); + return items; + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css new file mode 100644 index 0000000..821aeb5 --- /dev/null +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css @@ -0,0 +1,78 @@ +.mat-expansion-panel-header { + background: rgba(37, 55, 70, 0.2); +} + +.mdPanel { + margin: 0.5%; +} + +/* ::ng-deep md-expansion-panel-header > .mat-content { + display: block; +} */ + +.input-full-width { + width: 100%; +} + +.select-full-width { + width: 100%; +} + +.mat-form-field { + line-height: unset !important; +} + +.add-button { + width: 100%; + min-height: 45px; + font-weight: bold; + height: 100% +} + +fieldset { + display: block; + -webkit-margin-start: 2px; + -webkit-margin-end: 2px; + -webkit-padding-before: 0.35em; + -webkit-padding-start: 0.75em; + -webkit-padding-end: 0.75em; + -webkit-padding-after: 0.625em; + min-width: -webkit-min-content; + border-width: 1px; + border-style: groove; + border-color: azure; + border-image: initial; +} + +legend { + display: block; + width: unset; + -webkit-padding-start: 2px; + -webkit-padding-end: 2px; + border: unset; +} + +.fieldset { + background-color: rgba(240, 245, 245, 0.5); +} + +@media only screen and (min-width: 980px) { + .right-padding-remove-desktop { + padding-right: 0 !important; + } + .left-padding-remove-desktop { + padding-left: 0 !important; + } +} + +.width5 { + width: 5%; +} + +.width10 { + width: 10%; +} + +.width20 { + width: 20%; +} diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html new file mode 100644 index 0000000..d2c07b4 --- /dev/null +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -0,0 +1,307 @@ +
+ + + + {{ currentLanguageSet?.itemDispense?.prescriptionID }}: + {{ prescriptionForm.value.prescriptionID }} + + | + + {{ currentLanguageSet?.itemDispense?.visitcode }}: + {{ prescriptionForm.value.visitCode }} + + | + + + {{ currentLanguageSet?.itemDispense?.consultantName }}: + + {{ prescriptionForm.value.consultantName }} + + +
+ + {{ currentLanguageSet?.inventory?.noMedicalitemstoDisptach }} + +
+
+
+
+ +
+ + {{ drug.value.genericDrugName }} {{ drug.value.drugStrength }} + +
+
+ + {{ + currentLanguageSet?.itemDispense?.form + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.duration + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.frequency + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.dose + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.quantityPrescribed + }} + + +
+
+ + {{ + currentLanguageSet?.itemDispense?.quantityDispensed + }} + + +
+
+ + + +
+
+ + + +
+
+ + +
+
+
+
+
+
+
+
+
+ +
+ + + + {{ + currentLanguageSet?.inventory?.nonEDLMedicalRecords + }} + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{ currentLanguageSet?.inventory?.sNo }} + + {{ i + 1 }} + + {{ currentLanguageSet?.inventory?.medicineName }} + + {{ test?.genericDrugName }} {{ test?.drugStrength }} + + {{ currentLanguageSet?.itemDispense?.form }} + {{ test?.drugForm }} + {{ currentLanguageSet?.itemDispense?.duration }} + + {{ test?.duration }} {{ test?.durationUnit }} + + {{ currentLanguageSet?.itemDispense?.frequency }} + {{ test?.frequency }} + {{ currentLanguageSet?.itemDispense?.dose }} + {{ test?.dose }} + {{ currentLanguageSet?.itemDispense?.quantityPrescribed }} + + {{ test?.qtyPrescribed }} + + {{ currentLanguageSet?.itemDispense?.route }} + {{ test?.route }} + {{ currentLanguageSet?.itemDispense?.specialInstructions }} + + {{ test?.specialInstruction }} +
+
+
+
+
+
+
diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.spec.ts b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.spec.ts new file mode 100644 index 0000000..03e4d2a --- /dev/null +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RxItemDispenseComponent } from './rx-item-dispense.component'; + +describe('RxItemDispenseComponent', () => { + let component: RxItemDispenseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RxItemDispenseComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RxItemDispenseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts new file mode 100644 index 0000000..86ebb9c --- /dev/null +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts @@ -0,0 +1,305 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { + Component, + OnInit, + OnChanges, + Input, + Output, + EventEmitter, + SimpleChanges, + DoCheck, +} from '@angular/core'; +import { FormBuilder, FormArray, FormControl, FormGroup } from '@angular/forms'; +import { PrescribedDrugsUtils } from '../shared/utility'; +import { BatchViewService } from './../../core/services/rx-batchview.service'; +import { PrescribedDrugService } from './../shared/service/prescribed-drug.service'; +import { ConfirmationService } from './../../core/services/confirmation.service'; +import { LanguageService } from '../../core/services/language.service'; +import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { MatTableDataSource } from '@angular/material/table'; +@Component({ + selector: 'app-rx-item-dispense', + templateUrl: './rx-item-dispense.component.html', + styleUrls: ['./rx-item-dispense.component.css'], +}) +export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { + utils = new PrescribedDrugsUtils(this.fb); + + @Input() prescription: any; + @Input() issueType!: number; + // issuteType 0 means Manual and 1 means System + + // @Output() public onDispense: EventEmitter = new EventEmitter(); + + prescriptionForm!: FormGroup; + prescriptionFormEDL!: FormGroup; + allocated = true; + facilityID: any; + currentLanguageSet: any; + copyprescription: any; + languageComponent!: SetLanguageComponent; + dataSourceList = new MatTableDataSource(); + displayedColumns: string[] = [ + 'medicineName', + 'form', + 'duration', + 'frequency', + 'dose', + 'quantityPrescribed', + 'route', + 'specialInstructions', + ]; + + constructor( + private fb: FormBuilder, + private batchViewService: BatchViewService, + private prescribedDrugService: PrescribedDrugService, + private confirmationService: ConfirmationService, + private http_service: LanguageService, + ) {} + + ngOnInit() { + this.fetchLanguageResponse(); + // this.http_service.currentLangugae$.subscribe(response =>this.currentLanguageSet = response); + this.facilityID = localStorage.getItem('facilityID'); + this.copyprescription = JSON.parse(JSON.stringify(this.prescription)); + this.loadForm(this.prescription); + } + + ngOnChanges(changes: SimpleChanges): void { + if (!changes['issueType'].firstChange) { + this.changeIssueType(); + } + } + filteredDrugMaster: any = []; + filteredDrugMasterEdl: any = []; + loadForm(prescription: any): void { + const drugMasterCopy = Object.assign([], prescription); + this.filteredDrugMaster = []; + drugMasterCopy.itemList.forEach((element: any) => { + if (element.isEDL === true || element.batchList.length > 0) { + this.filteredDrugMaster.push(element); + } else { + this.filteredDrugMasterEdl.push(element); + } + }); + prescription.itemList = this.filteredDrugMaster; + this.copyprescription.itemList = this.filteredDrugMasterEdl; + this.dataSourceList.data = this.copyprescription.itemList; + this.prescriptionForm = this.utils.initPrescriptionForm( + prescription, + this.issueType, + ); + console.log('knock knock'); + console.log(this.prescriptionForm); + console.log(this.prescription); + + this.changeIssueType(); + } + + allocate(): void { + this.getBatchList(); + } + + rxItemData(): any { + return (this.prescriptionForm.get('itemList') as FormArray).controls; + } + + getBatchList() { + const formItemValues = this.prescriptionForm.controls['itemList'].value; + const meds: any = []; + formItemValues.map((obj: any) => + meds.push({ itemID: obj.drugID, quantity: obj.qtyPrescribed }), + ); + this.prescribedDrugService + .allocateBatches(meds, this.facilityID) + .subscribe((batches: any) => { + if (batches.statusCode == 200) { + const data = batches.data; + data.map((batch: any) => + this.applyBatches(batch.itemID, batch.itemBatchList), + ); + this.allocated = true; + } else { + this.allocated = false; + this.confirmationService.alert( + this.currentLanguageSet.inventory.insufficientQuantity, + 'info', + ); + } + }); + } + + applyBatches(itemID: any, batches: any) { + console.log(itemID, batches, 'checko'); + const formItemValues = this.prescriptionForm.controls['itemList'].value; + const itemIndex = formItemValues + .map(function (e: any) { + return e.drugID; + }) + .indexOf(itemID); + console.log(itemIndex, 'indexx'); + this.allocateAtIndex(itemIndex, batches); + } + + allocateAtIndex(index: any, batches: any) { + const formItems = this.prescriptionForm.controls['itemList']; + const currentGroup: FormGroup = formItems.at(index); + const selectionBatchList: FormArray = ( + currentGroup.controls['selectionBatchList'] + ); + const batchList: FormArray = currentGroup.controls['batchList']; + this.clearBatchArray(batchList); + this.clearBatchArray(selectionBatchList); + let dispensed = 0; + batches.map((batch: any) => { + selectionBatchList.push( + this.utils.initBatchListElement(batch, this.issueType), + ); + batchList.push(this.utils.initBatchListElement(batch, this.issueType)); + dispensed += +batch.quantity; + }); + + currentGroup.patchValue({ + qtyDispensed: dispensed, + }); + currentGroup.controls['selectionBatchList'] = selectionBatchList; + currentGroup.controls['batchList'] = batchList; + } + + // saveCall(): void { + // this.onDispense.emit(this.prescription); + // } + changeIssueType() { + const formItems = this.prescriptionForm.controls['itemList']; + formItems.value.forEach((element: any, i: any) => { + const currentGroup: FormGroup = formItems.at(i); + const selectionBatchList: FormArray = ( + currentGroup.controls['selectionBatchList'] + ); + const batchList: FormArray = ( + currentGroup.controls['batchList'] + ); + + this.clearBatchArray(batchList); + this.clearBatchArray(selectionBatchList); + + if (this.issueType == 0) { + this.allocated = false; + element.preDefinedBatchList.forEach((batch: any) => { + selectionBatchList.push( + this.utils.initBatchListElement(batch, this.issueType), + ); + }); + } else if (this.issueType == 1) { + this.allocate(); + } + currentGroup.patchValue({ + qtyDispensed: null, + }); + currentGroup.controls['selectionBatchList'] = selectionBatchList; + }); + } + + clearBatchArray(formArray: any) { + while (formArray.length >= 1) { + formArray.removeAt(0); + } + } + + batchViewModal(index: any) { + const formItems = this.prescriptionForm.controls['itemList']; + const currentGroup: FormGroup = formItems.at(index); + + const selectionBatchListValue: FormArray = ( + currentGroup.controls['selectionBatchList'].value + ); + if (selectionBatchListValue.length) { + this.batchViewService + .batches( + currentGroup.value.qtyPrescribed, + selectionBatchListValue, + this.issueType, + ) + .subscribe((res: any) => { + if (res && this.issueType == 0) { + this.pushSavedBatches( + res.batchList, + res.selectionBatchList, + res.dispensed, + index, + ); + } + }); + } else { + this.confirmationService.alert( + this.currentLanguageSet.alerts.medicinenotavailable, + 'info', + ); + } + } + + pushSavedBatches( + selectedBatches: any, + selectionList: any, + dispensed: any, + index: any, + ) { + const formItems = this.prescriptionForm.controls['itemList']; + const currentGroup: FormGroup = formItems.at(index); + const selectionBatchList: FormArray = ( + currentGroup.controls['selectionBatchList'] + ); + const batchList: FormArray = currentGroup.controls['batchList']; + this.clearBatchArray(batchList); + this.clearBatchArray(selectionBatchList); + selectedBatches.map((element: any) => { + batchList.push(this.utils.initBatchListElement(element, this.issueType)); + }); + selectionList.map((element: any) => { + selectionBatchList.push( + this.utils.initBatchListElement(element, this.issueType), + ); + }); + // console.log(batchList.value, 'batch'); + // console.log(selectionList.value, 'selection'); + + currentGroup.controls['batchList'] = batchList; + currentGroup.controls['selectionBatchList'] = selectionBatchList; + currentGroup.patchValue({ + qtyDispensed: dispensed, + }); + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck() { + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + //--End-- +} diff --git a/src/app/app-modules/rx/rx-routing.module.ts b/src/app/app-modules/rx/rx-routing.module.ts new file mode 100644 index 0000000..eb94210 --- /dev/null +++ b/src/app/app-modules/rx/rx-routing.module.ts @@ -0,0 +1,37 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { RxDashboardComponent } from './rx-dashboard/rx-dashboard.component'; + +const routes: Routes = [ + { + path: 'disperse/:beneficiaryRegID', + component: RxDashboardComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class RxRoutingModule {} diff --git a/src/app/app-modules/rx/rx.module.ts b/src/app/app-modules/rx/rx.module.ts new file mode 100644 index 0000000..e391231 --- /dev/null +++ b/src/app/app-modules/rx/rx.module.ts @@ -0,0 +1,86 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule, FormsModule } from '@angular/forms'; +import { CoreModule } from '../core/core.module'; + +import { RxRoutingModule } from './rx-routing.module'; + +/*Components*/ + +import { RxDashboardComponent } from './rx-dashboard/rx-dashboard.component'; +import { RxItemDispenseComponent } from './rx-item-dispense/rx-item-dispense.component'; + +/*Services*/ +import { PrescribedDrugService } from './shared/service/prescribed-drug.service'; +import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav'; +import { MatAccordion, MatExpansionModule } from '@angular/material/expansion'; +import { MaterialModule } from '../core/material.module'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatListModule } from '@angular/material/list'; +import { MatSelectModule } from '@angular/material/select'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; + +@NgModule({ + imports: [ + CommonModule, + CoreModule, + RxRoutingModule, + ReactiveFormsModule, + FormsModule, + MatExpansionModule, + MaterialModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + MatTableModule, + MatTooltipModule, + MatMenuModule, + MatIconModule, + MatButtonModule, + MatCardModule, + MatRadioModule, + MatDatepickerModule, + MatListModule, + MatSelectModule, + MatProgressBarModule, + MatPaginatorModule, + MatSidenavModule, + MatProgressSpinnerModule, + ], + declarations: [RxDashboardComponent, RxItemDispenseComponent], + providers: [PrescribedDrugService], +}) +export class RxModule {} diff --git a/src/app/app-modules/rx/shared/service/prescribed-drug.service.spec.ts b/src/app/app-modules/rx/shared/service/prescribed-drug.service.spec.ts new file mode 100644 index 0000000..7e8dedc --- /dev/null +++ b/src/app/app-modules/rx/shared/service/prescribed-drug.service.spec.ts @@ -0,0 +1,39 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { TestBed, inject } from '@angular/core/testing'; + +import { PrescribedDrugService } from './prescribed-drug.service'; + +describe('PrescribedDrugService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PrescribedDrugService], + }); + }); + + it('should be created', inject( + [PrescribedDrugService], + (service: PrescribedDrugService) => { + expect(service).toBeTruthy(); + }, + )); +}); diff --git a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts new file mode 100644 index 0000000..670aa46 --- /dev/null +++ b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts @@ -0,0 +1,92 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; + +@Injectable() +export class PrescribedDrugService { + dummify = { + prescribed: { + prescriptionID: '1A22eddt5', + prescribedDate: '08/08/2018', + consultantName: 'Balu Lal', + status: false, + prescribedDrugs: [ + { + drugID: '123431', + drugName: 'SomeMed CapsoTableSyruped', + batchNumber: '245u67ujt', + qoh: 209, + quantityPrescribed: 203, + quantiyIssued: 209, + }, + { + drugID: '123431', + drugName: 'SomeMed CapsoTableSyruped', + batchNumber: '245u67ujt', + qoh: 209, + quantityPrescribed: 203, + quantiyIssued: 209, + }, + { + drugID: '123431', + drugName: 'SomeMed CapsoTableSyruped', + batchNumber: '245u67ujt', + qoh: 209, + quantityPrescribed: 203, + quantiyIssued: 209, + }, + ], + }, + }; + + constructor(private http: HttpClient) {} + + getPrescription(reqObj: any) { + const vanID = localStorage.getItem('vanID'); + const parkingPlaceID = localStorage.getItem('parkingPlaceID'); + const msgObj = Object.assign(reqObj, { vanID }, { parkingPlaceID }); + + // return Observable.of(this.dummify); + return this.http.post(environment.getPrescriptions, msgObj); + // .map(res => res.json()); + } + + allocateBatches(list: any, facilityID: any) { + return this.http.post( + `${environment.allocateBatchStockUrl}/${facilityID}`, + list, + ); + // .map(res => res.json()); + } + + saveStockExit(dispensingItem: any) { + const vanID = localStorage.getItem('vanID'); + const parkingPlaceID = localStorage.getItem('parkingPlaceID'); + const msgObj = Object.assign(dispensingItem, { vanID }, { parkingPlaceID }); + console.log('dispensingItem', JSON.stringify(dispensingItem, null, 4)); + + return this.http.post(environment.saveStockExitUrl, msgObj); + // .map(res => res.json()); + } +} diff --git a/src/app/app-modules/rx/shared/utility/index.ts b/src/app/app-modules/rx/shared/utility/index.ts new file mode 100644 index 0000000..e6feaab --- /dev/null +++ b/src/app/app-modules/rx/shared/utility/index.ts @@ -0,0 +1,22 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +export * from './prescribed-drug.utility'; diff --git a/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts b/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts new file mode 100644 index 0000000..515138e --- /dev/null +++ b/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts @@ -0,0 +1,87 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms'; + +export class PrescribedDrugsUtils { + constructor(private fb: FormBuilder) {} + + initBatchListElement(batch: any, selection: any): FormGroup { + return this.fb.group({ + expiryDate: batch.expiryDate, + batchNo: batch.batchNo, + quantity: batch.quantity, + quantityInHand: batch.qty || batch.quantityInHand, + expiresIn: batch.expiresIn, + selection: batch.selection && selection == '1' ? true : false, + itemStockEntryID: batch.itemStockEntryID, + }); + } + + initBatchListArray(batchList: any, selection: any): FormArray { + const batches: FormArray = this.fb.array([]); + batchList.forEach((element: any) => { + batches.push(this.initBatchListElement(element, selection)); + }); + return batches; + } + + initPrescribedDrugs(drug: any, selection: any): FormGroup { + return this.fb.group({ + duration: drug.duration, + durationUnit: drug.durationUnit, + durationView: `${drug.duration} ${drug.durationUnit}`, + dose: drug.dose, + route: drug.route, + genericDrugName: drug.genericDrugName, + drugStrength: drug.drugStrength, + specialInstruction: drug.specialInstruction, + qtyDispensed: null, + qtyPrescribed: drug.qtyPrescribed, + drugID: drug.drugID, + drugForm: drug.drugForm, + frequency: drug.frequency, + batchList: this.fb.array([]), + selectionBatchList: this.fb.array([]), + preDefinedBatchList: this.initBatchListArray(drug.batchList, selection), + }); + } + + initPrescribedDrugsArray(itemList: any, selection: any): FormArray { + const drugArray: FormArray = this.fb.array([]); + if (typeof itemList === 'object') { + itemList.forEach((element: any) => { + drugArray.push(this.initPrescribedDrugs(element, selection)); + }); + } + return drugArray; + } + + initPrescriptionForm(prescription: any, selection: any): FormGroup { + return this.fb.group({ + consultantName: prescription.consultantName, + prescriptionID: prescription.prescriptionID, + beneficiaryRegID: prescription.beneficiaryRegID, + visitCode: prescription.visitCode, + itemList: this.initPrescribedDrugsArray(prescription.itemList, selection), + }); + } +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 18373b4..157b06c 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,6 +1,14 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { LoginComponent } from './login/login.component'; +import { AuthGuard } from './app-modules/core/services/auth-guard.service'; +import { FacilitySelectionComponent } from './facility-selection/facility-selection.component'; +import { ServiceComponent } from './service/service.component'; +import { LoadStoreDetailsComponent } from './load-store-details/load-store-details.component'; +import { RedirInComponent } from './redir-in/redir-in.component'; +import { ResetPasswordComponent } from './reset-password/reset-password.component'; +import { SetPasswordComponent } from './set-password/set-password.component'; +import { SetSecurityQuestionsComponent } from './set-security-questions/set-security-questions.component'; // import { LoginComponent } from './login/login.component'; // import { ServiceComponent } from './service/service.component'; @@ -20,54 +28,55 @@ const routes: Routes = [ redirectTo: 'login', pathMatch: 'full' }, - // { - // path: 'redirin', - // component: RedirInComponent - // }, + { + path: 'redirin', + component: RedirInComponent + }, { path: 'login', component: LoginComponent }, - // { - // path: 'set-security-questions', - // component: SetSecurityQuestionsComponent, - // }, - // { - // path: 'reset-password', - // component: ResetPasswordComponent, - // }, - // { - // path: 'set-password', - // component: SetPasswordComponent, - // // canActivate: [AuthGuard], - // }, - // { - // path: 'service', - // component: ServiceComponent, - // canActivate: [AuthGuard], - // }, - // { - // path: 'facility', - // component: FacilitySelectionComponent, - // canActivate: [AuthGuard], - // }, - // { - // path:'loadStores', - // component:LoadStoreDetailsComponent, - // }, - // { - // path: 'inventory', - // canActivate: [AuthGuard], - // loadChildren: './app-modules/inventory/inventory.module#InventoryModule' - // }, - // { - // path: 'rx', - // canActivate: [AuthGuard], - // loadChildren: './app-modules/rx/rx.module#RxModule' - // }, - - - + { + path: 'set-security-questions', + component: SetSecurityQuestionsComponent, + }, + { + path: 'reset-password', + component: ResetPasswordComponent, + }, + { + path: 'set-password', + component: SetPasswordComponent, + // canActivate: [AuthGuard], + }, + { + path: 'service', + component: ServiceComponent, + canActivate: [AuthGuard], + }, + { + path: 'facility', + component: FacilitySelectionComponent, + canActivate: [AuthGuard], + }, + { + path:'loadStores', + component:LoadStoreDetailsComponent, + }, + { + path: 'inventory', + canActivate: [AuthGuard], + loadChildren: () => + import('./app-modules/inventory/inventory.module').then( + (x) => x.InventoryModule, + ), + }, + { + path: 'rx', + canActivate: [AuthGuard], + loadChildren: () => + import('./app-modules/rx/rx.module').then((x) => x.RxModule), + }, ]; @NgModule({ diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 0be7e46..06be132 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Router, NavigationStart, NavigationEnd, NavigationError } from '@angular/router'; +import { SpinnerService } from './app-modules/core/services/spinner.service'; // import { SpinnerService } from './app-modules/core/services/spinner.service'; @Component({ @@ -11,19 +12,19 @@ export class AppComponent implements OnInit { constructor( private router: Router, - // private spinnerService: SpinnerService + private spinnerService: SpinnerService ) { } ngOnInit() { this.router.events.subscribe(event => { if (event instanceof NavigationStart) { - // this.spinnerService.show(); + this.spinnerService.show(); } else if (event instanceof NavigationEnd) { - // setTimeout(this.spinnerService.hide(), 500); + setTimeout(()=> this.spinnerService.hide(), 500); } else if (event instanceof NavigationError) { - // setTimeout(this.spinnerService.hide(), 500); + setTimeout(()=>this.spinnerService.hide(), 500); } else { - // setTimeout(this.spinnerService.hide()); + setTimeout(()=>this.spinnerService.hide()); } }); } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index de808a4..402ff8f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -63,17 +63,26 @@ import { MatProgressBarModule } from "@angular/material/progress-bar"; import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; import { MaterialModule } from "./app-modules/core/material.module"; import { LoginComponent } from "./login/login.component"; +import { FaciltyService } from "./facility-selection/facilty.service"; +import { FacilitySelectionComponent } from "./facility-selection/facility-selection.component"; +import { ServiceComponent } from "./service/service.component"; +import { LoadStoreDetailsComponent } from "./load-store-details/load-store-details.component"; +import { RedirInComponent } from "./redir-in/redir-in.component"; +import { ResetPasswordComponent } from "./reset-password/reset-password.component"; +import { SetPasswordComponent } from "./set-password/set-password.component"; +import { SetSecurityQuestionsComponent } from "./set-security-questions/set-security-questions.component"; + @NgModule({ declarations: [ AppComponent, LoginComponent, - // ServiceComponent, - // ResetPasswordComponent, - // SetPasswordComponent, - // SetSecurityQuestionsComponent, - // FacilitySelectionComponent, - // RedirInComponent, - // LoadStoreDetailsComponent, + ServiceComponent, + ResetPasswordComponent, + SetPasswordComponent, + SetSecurityQuestionsComponent, + FacilitySelectionComponent, + RedirInComponent, + LoadStoreDetailsComponent, ], imports: [ BrowserModule, @@ -114,7 +123,7 @@ import { LoginComponent } from "./login/login.component"; useClass: HttpInterceptorService, multi: true, }, - // FaciltyService, + FaciltyService, // { provide: RouteReuseStrategy, useClass: CustomRouteReuseStrategy } ], bootstrap: [AppComponent] diff --git a/src/app/custom-route-reuse-strategy.ts b/src/app/custom-route-reuse-strategy.ts index 194ad9e..d9b67cd 100644 --- a/src/app/custom-route-reuse-strategy.ts +++ b/src/app/custom-route-reuse-strategy.ts @@ -3,12 +3,12 @@ import { RouteReuseStrategy, DefaultUrlSerializer, ActivatedRouteSnapshot, Detac export class CustomRouteReuseStrategy implements RouteReuseStrategy { handlers: { [key: string]: DetachedRouteHandle } = {}; - routesToBeReuse = [] + routesToBeReuse: any = []; // "medicineDispense/View", "storeSelfConsumption/View", "physicalStockEntry/View", "storeStockTransfer/View", "storeStockAdjustment/view", "storeStockAdjustmentDraft/view" calcKey(route: ActivatedRouteSnapshot) { - let next = route; - let url = ""; + let next: any = route; + let url = ''; while (next) { if (next.url) { url = next.url.join('/'); @@ -40,16 +40,23 @@ export class CustomRouteReuseStrategy implements RouteReuseStrategy { return false; } const url = this.calcKey(route); - return !!route.routeConfig && !route.routeConfig.loadChildren && !!this.handlers[this.calcKey(route)]; + return ( + !!route.routeConfig && + !route.routeConfig.loadChildren && + !!this.handlers[this.calcKey(route)] + ); } - retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle { + retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null { if (!route.routeConfig) return null; if (route.routeConfig.loadChildren) return null; return this.handlers[this.calcKey(route)]; } - shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean { + shouldReuseRoute( + future: ActivatedRouteSnapshot, + curr: ActivatedRouteSnapshot, + ): boolean { return this.calcKey(curr) === this.calcKey(future); } diff --git a/src/app/facility-selection/facility-selection.component.css b/src/app/facility-selection/facility-selection.component.css new file mode 100644 index 0000000..2fac64e --- /dev/null +++ b/src/app/facility-selection/facility-selection.component.css @@ -0,0 +1,30 @@ +.radio-btn { + margin-left: 8px; +} + +.m-t-25 { + margin-top: 25px; +} + +.m-t-10 { + margin-top: 10px; +} + +.submit{ + top: 10px; +} + +.button-disabled[disabled] { + opacity: 0.5; + cursor: not-allowed; + } + +.mdTitle { + text-align: center; + margin-bottom: 30px; +} + +h4 { + font-weight: bold; + color: #52575C !important; +} \ No newline at end of file diff --git a/src/app/facility-selection/facility-selection.component.html b/src/app/facility-selection/facility-selection.component.html new file mode 100644 index 0000000..f7dc68e --- /dev/null +++ b/src/app/facility-selection/facility-selection.component.html @@ -0,0 +1,88 @@ + + +
+
+
+
+
+ Logo +
+
+
+ +

{{currentLanguageSet?.inventory?.typeofStores}} + {{currentLanguageSet?.inventory?.mainStore}} + {{currentLanguageSet?.inventory?.subStore}} +

+
+
+
+ + + {{ facility.facilityName }} + + + +
+
+ + + {{ subFacility.facilityName }} + + + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/src/app/facility-selection/facility-selection.component.spec.ts b/src/app/facility-selection/facility-selection.component.spec.ts new file mode 100644 index 0000000..198387e --- /dev/null +++ b/src/app/facility-selection/facility-selection.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FacilitySelectionComponent } from './facility-selection.component'; + +describe('FacilitySelectionComponent', () => { + let component: FacilitySelectionComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FacilitySelectionComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FacilitySelectionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/facility-selection/facility-selection.component.ts b/src/app/facility-selection/facility-selection.component.ts new file mode 100644 index 0000000..816a635 --- /dev/null +++ b/src/app/facility-selection/facility-selection.component.ts @@ -0,0 +1,220 @@ +import { Component, DoCheck, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormBuilder, FormGroup, FormControl, FormArray } from '@angular/forms'; + +import { FaciltyService } from './facilty.service'; +import { ConfirmationService } from '../app-modules/core/services'; +import { SetLanguageComponent } from '../app-modules/core/components/set-language.component'; +import { LanguageService } from '../app-modules/core/services/language.service'; + + +@Component({ + selector: 'app-facility-selection', + templateUrl: './facility-selection.component.html', + styleUrls: ['./facility-selection.component.css'] +}) +export class FacilitySelectionComponent implements OnInit, DoCheck { + + serviceProviderId: any; + designation: any; + stores: any = []; + enableContinue = false; + facilities: any = []; + subFacilities: any = []; + languageComponent!: SetLanguageComponent; + currentLanguageSet: any; + isMainStoreBool: any; + + constructor( + private fb: FormBuilder, + private router: Router, + private faciltyService: FaciltyService, + private http_service: LanguageService, + private confirmationService: ConfirmationService, + ) {} + + facilityForm = this.fb.group({ + isMainStore: '', + facility: '', + subFacility: '', + }); + + ngOnInit() { + localStorage.removeItem('facilityDetail'); + localStorage.removeItem('facilityID'); + this.fetchLanguageResponse(); + this.serviceProviderId = localStorage.getItem('providerServiceID'); + this.getAllStores(); + } + + getAllStores() { + this.faciltyService + .getAllStores(this.serviceProviderId) + .subscribe((data: any) => { + this.stores = data.data; + }); + } + + checkStores() { + this.subFacilities = []; + this.facilities = []; + this.facilityForm.patchValue({ + facility: null, + subFacility: null, + }); + this.getFacility(); + } + + toContinue() { + const isMainStore: any = this.facilityForm.controls['isMainStore'].value; + const facility: any = this.facilityForm.controls['facility'].value; + const subFacility: any = this.facilityForm.controls['subFacility'].value; + if ( + this.facilityForm.controls.isMainStore.value && + this.facilityForm.controls.facility.value + ) { + this.enableContinue = true; + localStorage.setItem('facilityID', facility.facilityID); + localStorage.setItem('facilityDetail', JSON.stringify(facility)); + } else if (isMainStore == 'false' && facility && subFacility) { + this.enableContinue = true; + localStorage.setItem('facilityID', subFacility.facilityID); + localStorage.setItem('facilityDetail', JSON.stringify(subFacility)); + this.getFacilityMappedVanID(subFacility.facilityID); + } else { + this.enableContinue = false; + } + } + + getFacility() { + this.facilities = this.stores.filter((facility: any) => { + if (facility.isMainFacility == true && facility.deleted == false) { + return facility; + } + }) + } + + getSubFacility() { + const facility: any = this.facilityForm.controls['facility'].value; + this.facilityForm.patchValue({ subFacility: null }); + this.subFacilities = []; + this.subFacilities = this.stores.filter((subFacility: any) => { + if (!subFacility.deleted && subFacility.mainFacilityID && subFacility.mainFacilityID == facility.facilityID) { + return subFacility; + } + }) + } + + vanID: any; + parkingPlaceID: any; + + getFacilityMappedVanID(facilityID: any) { + this.faciltyService.getVanByStoreID(facilityID) + .subscribe(res => { + if (res.statusCode == 200 && res.data) { + this.vanID = res.data.vanID; + this.parkingPlaceID = res.data.parkingPlaceID; + } + }); + } + + checkSubFacility() { + + } + + proceedFurther() { + this.designation = 'Pharmacist'; + if (this.vanID && this.parkingPlaceID) { + localStorage.setItem('vanID', this.vanID); + localStorage.setItem('parkingPlaceID', this.parkingPlaceID); + } + this.routeToDesignation(this.designation); + } + + routeToDesignation(designation: any) { + switch (designation) { + case "Pharmacist": + this.router.navigate(['/loadStores']); + break; + default: + } + } + + goToWorkList() { + + } + + //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + ngDoCheck(){ + this.fetchLanguageResponse(); + } + + fetchLanguageResponse() { + this.languageComponent = new SetLanguageComponent(this.http_service); + this.languageComponent.setLanguage(); + this.currentLanguageSet = this.languageComponent.currentLanguageObject; + } + + // getFacility() { + // this.facilities = this.stores.filter((facility: any) => { + // if (facility.isMainFacility == true && facility.deleted == false) { + // return facility; + // } + // }); + // } + + // getSubFacility() { + // const facility: any = this.facilityForm.controls['facility'].value; + // this.facilityForm.patchValue({ subFacility: null }); + // this.subFacilities = []; + // this.subFacilities = this.stores.filter((subFacility: any) => { + // if ( + // !subFacility.deleted && + // subFacility.mainFacilityID && + // subFacility.mainFacilityID == facility.facilityID + // ) { + // return subFacility; + // } + // }); + // } + + // vanID: any; + // parkingPlaceID: any; + + // getFacilityMappedVanID(facilityID: any) { + // this.faciltyService.getVanByStoreID(facilityID).subscribe((res: any) => { + // if (res.statusCode == 200 && res.data) { + // this.vanID = res.data.vanID; + // this.parkingPlaceID = res.data.parkingPlaceID; + // } + // }); + // } + // proceedFurther() { + // this.designation = 'Pharmacist'; + // if (this.vanID && this.parkingPlaceID) { + // localStorage.setItem('vanID', this.vanID); + // localStorage.setItem('parkingPlaceID', this.parkingPlaceID); + // } + // this.routeToDesignation(this.designation); + // } + + // routeToDesignation(designation: any) { + // switch (designation) { + // case 'Pharmacist': + // this.router.navigate(['/loadStores']); + // break; + // default: + // } + // } + + // //AN40085822 29/9/2021 Integrating Multilingual Functionality --Start-- + // ngDoCheck() { + // this.fetchLanguageResponse(); + // } + + // fetchLanguageResponse() { + // this.languageComponent = new SetLanguageComponent(this.http_service); + // this.languageComponent.setLanguage(); + // this.currentLanguageSet = this.languageComponent.currentLanguageObject; + // } +} diff --git a/src/app/facility-selection/facilty-resolve.service.ts b/src/app/facility-selection/facilty-resolve.service.ts new file mode 100644 index 0000000..4124efb --- /dev/null +++ b/src/app/facility-selection/facilty-resolve.service.ts @@ -0,0 +1,25 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Injectable } from '@angular/core'; + +@Injectable() +export class FaciltyResolveService {} diff --git a/src/app/facility-selection/facilty.service.ts b/src/app/facility-selection/facilty.service.ts new file mode 100644 index 0000000..2beb46c --- /dev/null +++ b/src/app/facility-selection/facilty.service.ts @@ -0,0 +1,43 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; + +@Injectable() +export class FaciltyService { + constructor(private http: HttpClient) {} + + stores: any; + getAllStores(serviceProviderId: any) { + return this.http.post( + environment.getFacilityUrl + serviceProviderId, + {}, + ); + } + + getVanByStoreID(storeID: any) { + return this.http.post(environment.getVanByStoreIDUrl + '/' + storeID, { + storeID, + }); + } +} diff --git a/src/app/load-store-details/load-store-details.component.css b/src/app/load-store-details/load-store-details.component.css new file mode 100644 index 0000000..6d250a4 --- /dev/null +++ b/src/app/load-store-details/load-store-details.component.css @@ -0,0 +1,35 @@ +.overlay { + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + position: fixed; + z-index: 1001; + /* Sit on top */ + left: 0; + top: 0; + background-color: rgb(0, 0, 0); + /* Black fallback color */ + background-color: rgba(0, 0, 0, 0.3); + /* Black w/opacity */ +} + + +/* Position the content inside the overlay */ + + +/*.overlay-content { + position: relative; + top: 42%; 25% from the top + left: 46%; + width: 100%; 100% width +}*/ + +.overlay:root { + padding: 0px; +} + +.loader-hidden { + display: none; +} \ No newline at end of file diff --git a/src/app/load-store-details/load-store-details.component.html b/src/app/load-store-details/load-store-details.component.html new file mode 100644 index 0000000..2e8ae41 --- /dev/null +++ b/src/app/load-store-details/load-store-details.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/src/app/load-store-details/load-store-details.component.spec.ts b/src/app/load-store-details/load-store-details.component.spec.ts new file mode 100644 index 0000000..f363db0 --- /dev/null +++ b/src/app/load-store-details/load-store-details.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoadStoreDetailsComponent } from './load-store-details.component'; + +describe('LoadStoreDetailsComponent', () => { + let component: LoadStoreDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [LoadStoreDetailsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoadStoreDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/load-store-details/load-store-details.component.ts b/src/app/load-store-details/load-store-details.component.ts new file mode 100644 index 0000000..07e4b68 --- /dev/null +++ b/src/app/load-store-details/load-store-details.component.ts @@ -0,0 +1,35 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +@Component({ + selector: 'app-load-store-details', + templateUrl: './load-store-details.component.html', + styleUrls: ['./load-store-details.component.css'], +}) +export class LoadStoreDetailsComponent implements OnInit { + constructor(private router: Router) {} + showProgressBar = true; + ngOnInit() { + this.router.navigate(['/inventory']); + } +} diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 556dcb1..72fa9c3 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -203,7 +203,7 @@ export class LoginComponent implements OnInit { apimanClientKey: item.apimanClientKey, }; } - return null; + return; }) if (services.length > 0) { localStorage.setItem('services', JSON.stringify(services)); diff --git a/src/app/redir-in/redir-in.component.css b/src/app/redir-in/redir-in.component.css new file mode 100644 index 0000000..faa8b0d --- /dev/null +++ b/src/app/redir-in/redir-in.component.css @@ -0,0 +1,16 @@ +.overlay { + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + position: fixed; + z-index: 1001; + /* Sit on top */ + left: 0; + top: 0; + background-color: rgb(0, 0, 0); + /* Black fallback color */ + background-color: rgba(0, 0, 0, 0.3); + /* Black w/opacity */ +} diff --git a/src/app/redir-in/redir-in.component.html b/src/app/redir-in/redir-in.component.html new file mode 100644 index 0000000..3458648 --- /dev/null +++ b/src/app/redir-in/redir-in.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/src/app/redir-in/redir-in.component.spec.ts b/src/app/redir-in/redir-in.component.spec.ts new file mode 100644 index 0000000..703e899 --- /dev/null +++ b/src/app/redir-in/redir-in.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RedirInComponent } from './redir-in.component'; + +describe('RedirInComponent', () => { + let component: RedirInComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RedirInComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RedirInComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts new file mode 100644 index 0000000..48142a0 --- /dev/null +++ b/src/app/redir-in/redir-in.component.ts @@ -0,0 +1,338 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { + Params, + RouterModule, + Routes, + Router, + ActivatedRoute, + NavigationStart, + NavigationEnd, + NavigationError, +} from '@angular/router'; +import { Location } from '@angular/common'; +import { SpinnerService } from '../app-modules/core/services/spinner.service'; + +import { AuthenticationService } from '../login/authentication.service'; +@Component({ + selector: 'app-redir-in', + templateUrl: './redir-in.component.html', + styleUrls: ['./redir-in.component.css'], +}) +export class RedirInComponent implements OnInit { + externalSession = { + host: '', + protocol: '', + auth: '', + fallbackURL: '', + returnURL: '', + parentApp: '', + facility: '', + ben: '', + visit: '', + flowID: '', + benRegID: '', + vanID: '', + parkingPlaceID: '', + inventoryServiceName: '', + parentAPI: '', + currentLanguage: '', + healthID: '', + }; + + fallback: any; + requiredRole = 'Pharmacist'; + + constructor( + private router: Router, + private spinnerService: SpinnerService, + private route: ActivatedRoute, + private location: Location, + private authService: AuthenticationService, + ) {} + + ngOnInit() { + // localStorage.clear(); + + // sessionStorage.clear(); + sessionStorage.removeItem('parentBen'); + sessionStorage.removeItem('parentBenVisit'); + sessionStorage.removeItem('isExternal'); + sessionStorage.removeItem('host'); + sessionStorage.removeItem('fallback'); + sessionStorage.removeItem('return'); + localStorage.removeItem('facilityDetail'); + localStorage.removeItem('inventoryServiceName'); + this.setRouteStrate(); + this.getExternalSession(); + } + setRouteStrate() { + this.router.events.subscribe((event) => { + if (event instanceof NavigationStart) { + this.spinnerService.show(); + } else if (event instanceof NavigationEnd) { + setTimeout(() => this.spinnerService.hide(), 500); + } else if (event instanceof NavigationError) { + setTimeout(() => this.spinnerService.hide(), 500); + } else { + setTimeout(() => this.spinnerService.hide()); + } + }); + } + + getExternalSession() { + this.route.queryParams.subscribe((params) => { + this.externalSession.host = + params['host'] === 'undefined' ? undefined : params['host']; + this.externalSession.protocol = + params['protocol'] === 'undefined' ? undefined : params['protocol']; + this.externalSession.auth = + params['user'] === 'undefined' ? undefined : params['user']; + this.externalSession.fallbackURL = + params['fallback'] === 'undefined' ? undefined : params['fallback']; + this.externalSession.returnURL = + params['back'] === 'undefined' ? undefined : params['back']; + this.externalSession.parentApp = + params['app'] === 'undefined' ? undefined : params['app']; + this.externalSession.facility = + params['facility'] === 'undefined' ? undefined : params['facility']; + this.externalSession.ben = + params['ben'] === 'undefined' ? undefined : params['ben']; + this.externalSession.visit = + params['visit'] === 'undefined' ? undefined : params['visit']; + this.externalSession.flowID = + params['flow'] === 'undefined' ? undefined : params['flow']; + this.externalSession.benRegID = + params['reg'] === 'undefined' ? undefined : params['reg']; + this.externalSession.vanID = + params['vanID'] === 'undefined' ? undefined : params['vanID']; + this.externalSession.parkingPlaceID = + params['ppID'] === 'undefined' ? undefined : params['ppID']; + this.externalSession.inventoryServiceName = + params['serviceName'] === 'undefined' + ? undefined + : params['serviceName']; + this.externalSession.parentAPI = + params['parentAPI'] === 'undefined' ? undefined : params['parentAPI']; + this.externalSession.currentLanguage = + params['currentLanguage'] === 'undefined' + ? 'English' + : params['currentLanguage']; + this.externalSession.healthID = + params['healthID'] === 'undefined' ? undefined : params['healthID']; + }); + console.log('PSMRI', this.externalSession); + + // this.savetoStorage(); + this.storeSession(); + } + + storeSession() { + sessionStorage.setItem( + 'fallback', + `${this.externalSession.protocol}//${this.externalSession.host}#${this.externalSession.fallbackURL}`, + ); + sessionStorage.setItem( + 'return', + `${this.externalSession.protocol}//${this.externalSession.host}#${this.externalSession.returnURL}`, + ); + sessionStorage.setItem( + 'parentLogin', + `${this.externalSession.protocol}//${this.externalSession.host}`, + ); + sessionStorage.setItem('isExternal', 'true'); + sessionStorage.setItem('host', `${this.externalSession.parentApp}`); + sessionStorage.setItem('key', this.externalSession.auth); + localStorage.setItem('facilityID', this.externalSession.facility); + sessionStorage.setItem('parentBen', this.externalSession.ben); + sessionStorage.setItem('parentBenVisit', this.externalSession.visit); + localStorage.setItem('benFlowID', this.externalSession.flowID); + localStorage.setItem('vanID', this.externalSession.vanID); + localStorage.setItem('parkingPlaceID', this.externalSession.parkingPlaceID); + localStorage.setItem( + 'inventoryServiceName', + this.externalSession.inventoryServiceName, + ); + localStorage.setItem('parentAPI', this.externalSession.parentAPI); + localStorage.setItem( + 'currentLanguage', + this.externalSession.currentLanguage, + ); + localStorage.setItem('healthID', this.externalSession.healthID); + this.fallback = sessionStorage.getItem('fallback'); + + this.checkSession(); + } + + checkSession() { + if ( + this.externalSession.auth && + this.externalSession.flowID && + this.externalSession.ben && + this.externalSession.facility && + this.externalSession.returnURL && + this.externalSession.benRegID && + this.externalSession.vanID && + this.externalSession.parkingPlaceID + ) { + // session check + this.getSession(); + } else if ( + this.externalSession.fallbackURL && + this.externalSession.host && + this.externalSession.protocol + ) { + console.log(this.externalSession, 'exter'); + this.deleteParentSessioning(); + window.location.href = this.fallback; + } else { + // go back + this.location.back(); + } + } + + deleteParentSessioning() { + sessionStorage.removeItem('parentBen'); + sessionStorage.removeItem('parentBenVisit'); + sessionStorage.removeItem('isExternal'); + sessionStorage.removeItem('host'); + sessionStorage.removeItem('fallback'); + sessionStorage.removeItem('return'); + localStorage.removeItem('benFlowID'); + localStorage.removeItem('parkingPlaceID'); + localStorage.removeItem('vanID'); + localStorage.removeItem('inventoryServiceName'); + + // localStorage.removeItem('benRegID'); + + localStorage.removeItem('facilityDetail'); + } + + getSession() { + this.authService.getSessionExists().subscribe((res) => { + if (res && res.statusCode == 200) { + this.checkANDSetAuthenticatedDetails(res.data); + } else if (res.statusCode == 5002) { + // sessionStorage.clear(); + // localStorage.clear(); + this.deleteParentSessioning(); + + console.log(res, 'fallback'); + window.location.href = this.fallback; + } + }); + } + + checkANDSetAuthenticatedDetails(loginDataResponse: any) { + sessionStorage.setItem( + 'isAuthenticatedToTM', + loginDataResponse.isAuthenticated, + ); + + let serviceData; + if (loginDataResponse.previlegeObj) { + serviceData = loginDataResponse.previlegeObj.filter((item: any) => { + return item.serviceName == this.externalSession.inventoryServiceName; + })[0]; + if (serviceData != null) { + this.checkMappedRoleForService(loginDataResponse, serviceData); + } + } else { + this.deleteParentSessioning(); + window.location.href = this.fallback; + } + } + + roleArray: any = []; + checkMappedRoleForService(loginDataResponse: any, serviceData: any) { + console.log('serviceData', serviceData); + this.roleArray = []; + let roleData; + if (serviceData.roles) { + console.log('serviceData.roles', serviceData.roles); + + roleData = serviceData.roles; + if (roleData.length > 0) { + roleData.forEach((role: any) => { + role.serviceRoleScreenMappings.forEach((serviceRole: any) => { + this.roleArray.push(serviceRole.screen.screenName); + }); + }); + if (this.roleArray && this.roleArray.length > 0) { + localStorage.setItem('role', JSON.stringify(this.roleArray)); + sessionStorage.setItem( + 'isAuthenticated', + loginDataResponse.isAuthenticated, + ); + localStorage.setItem('username', loginDataResponse.userName); + localStorage.setItem('userName', loginDataResponse.userName); + localStorage.setItem('userID', loginDataResponse.userID); + localStorage.setItem( + 'designation', + loginDataResponse.designation.designationName, + ); + console.log('this.roleArray', this.roleArray); + localStorage.setItem( + 'providerServiceID', + serviceData.providerServiceMapID, + ); + localStorage.setItem( + 'services', + JSON.stringify({ + serviceID: + serviceData.roles[0].serviceRoleScreenMappings[0] + .providerServiceMapping.serviceID, + serviceName: serviceData.serviceName, + }), + ); + this.getFacility(); + } else { + this.deleteParentSessioning(); + window.location.href = this.fallback; + } + } else { + this.deleteParentSessioning(); + window.location.href = this.fallback; + } + } else { + this.deleteParentSessioning(); + window.location.href = this.fallback; + } + } + + getFacility() { + this.authService + .getFacilityDetails(this.externalSession.facility) + .subscribe((res) => { + if (res && res.statusCode == 200 && res.data) { + localStorage.setItem('facilityDetail', JSON.stringify(res.data)); + // this.router.navigate(['/inventory/medicineDispense']); + this.router.navigate([ + '/rx/disperse/' + this.externalSession.benRegID, + ]); + } else { + window.location.href = this.fallback; + } + }); + } +} diff --git a/src/app/reset-password/reset-password.component.css b/src/app/reset-password/reset-password.component.css new file mode 100644 index 0000000..c36b8d2 --- /dev/null +++ b/src/app/reset-password/reset-password.component.css @@ -0,0 +1,39 @@ +.mdList { + display: flex; + align-items: center; + justify-content: center; + height: 550px; +} + +.mdCard { + width: 400px; + margin-top: 5%; + margin-left: 10px; + margin-right: 10px; + margin-bottom: 5%; + border-radius: 5px; + box-shadow: 0px 0px 20px gray; +} +.mdTitle { + text-align: center; + margin-bottom: 30px; +} + +.formIcons { + padding-top: 30px; + color: gray; +} + +.full-width { + width: 100%; + margin-top: 10px; + margin-bottom: 10px; +} + +.f-c-54 { + color: #545454 !important; +} + +.error_text{ + color: red; +} diff --git a/src/app/reset-password/reset-password.component.html b/src/app/reset-password/reset-password.component.html new file mode 100644 index 0000000..c3bbbec --- /dev/null +++ b/src/app/reset-password/reset-password.component.html @@ -0,0 +1,134 @@ + + + + + + +
+ Logo +
+
+

Account Support

+
+ Follow the steps to change/reset the password +
+
+
+ +
+
+ account_box +
+
+ + + +
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ + {{ bufferQuestion }} + +
+
+
+ + + + + {{ wrong_answer_msg }} + + +
+
+
+
+ + +
+
+
+
+
+
+ + diff --git a/src/app/reset-password/reset-password.component.spec.ts b/src/app/reset-password/reset-password.component.spec.ts new file mode 100644 index 0000000..f514b8b --- /dev/null +++ b/src/app/reset-password/reset-password.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetPasswordComponent } from './reset-password.component'; + +describe('ResetPasswordComponent', () => { + let component: ResetPasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ResetPasswordComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetPasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/reset-password/reset-password.component.ts b/src/app/reset-password/reset-password.component.ts new file mode 100644 index 0000000..f1233ea --- /dev/null +++ b/src/app/reset-password/reset-password.component.ts @@ -0,0 +1,169 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component } from '@angular/core'; +import { Router } from '@angular/router'; + +import { AuthenticationService } from '../login/authentication.service'; +import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; + +@Component({ + selector: 'app-reset-password', + templateUrl: './reset-password.component.html', + styleUrls: ['./reset-password.component.css'], +}) +export class ResetPasswordComponent { + userFinalAnswers: any = []; + + constructor( + private router: Router, + private authService: AuthenticationService, + private confirmationService: ConfirmationService, + ) {} + + public response: any; + public error: any; + userID: any; + showQuestions = false; + hideOnGettingQuestions = true; + securityQuestions: any; + answer: any = undefined; + + dynamictype: any = 'password'; + + public questions: any[] = []; + public questionId: any[] = []; + public userAnswers: any[] = []; + + wrong_answer_msg: any = ''; + + getQuestions(username: any) { + localStorage.setItem('userID', username); + this.authService.getUserSecurityQuestionsAnswer(username).subscribe( + (response: any) => { + if (response !== undefined && response !== null) { + this.handleSuccess(response.data); + } else { + this.confirmationService.alert(response.errorMessage); + } + }, + (error: any) => (this.error = error), + ); + } + + handleSuccess(data: any) { + console.log(data); + if (data !== undefined && data.forgetPassword !== 'user Not Found') { + if (data.SecurityQuesAns.length > 0) { + this.securityQuestions = data.SecurityQuesAns; + this.showQuestions = true; + this.hideOnGettingQuestions = false; + + this.splitQuestionAndQuestionID(); + } else { + this.router.navigate(['/']); + this.confirmationService.alert( + 'Questions are not set for this User', + 'error', + ); + } + } else { + this.router.navigate(['/']); + this.confirmationService.alert('User Not Found', 'info'); + } + } + + showPWD() { + this.dynamictype = 'text'; + } + + hidePWD() { + this.dynamictype = 'password'; + } + + splitQuestionAndQuestionID() { + console.log('Q n A', this.securityQuestions); + for (const element of this.securityQuestions) { + this.questions.push(element.question); + this.questionId.push(element.questionId); + } + console.log('questions', this.questions); + console.log('questionId', this.questionId); + this.showMyQuestion(); + } + bufferQuestionId: any; + bufferQuestion: any; + counter = 0; + showMyQuestion() { + this.bufferQuestion = this.questions[this.counter]; + this.bufferQuestionId = this.questionId[this.counter]; + } + nextQuestion() { + if (this.counter < 3) { + const reqObj = { + questionId: this.questionId[this.counter], + answer: this.answer, + }; + this.userFinalAnswers.push(reqObj); + this.wrong_answer_msg = ''; + this.counter = this.counter + 1; + if (this.counter < 3) { + this.showMyQuestion(); + this.answer = undefined; + } else { + this.validatingAnswers(); + } + } + console.log('user Final Answers are:', this.userFinalAnswers); + } + // For validating final answers, If all answers are correct need to pass transaction ID + validatingAnswers() { + this.authService + .validateSecurityQuestionAndAnswer( + this.userFinalAnswers, + localStorage.getItem('userID'), + ) + .subscribe( + (response: any) => { + if (response.statusCode == 200) { + this.counter = 0; + this.router.navigate(['/set-password']); + this.authService.transactionId = response.data.transactionId; + } else { + this.getQuestions(localStorage.getItem('userID')); + this.onFailureNavigateToResetPassword(response); + } + }, + (error: any) => { + this.onFailureNavigateToResetPassword(error); + }, + ); + this.answer = null; + this.userFinalAnswers = []; + } + onFailureNavigateToResetPassword(error: any) { + this.showQuestions = true; + this.counter = 0; + this.confirmationService.alert(error.errorMessage, 'error'); + this.router.navigate(['/reset-password']); + this.splitQuestionAndQuestionID(); + } +} diff --git a/src/app/service/service.component.css b/src/app/service/service.component.css new file mode 100644 index 0000000..f999cf8 --- /dev/null +++ b/src/app/service/service.component.css @@ -0,0 +1,52 @@ +.circle { + position: relative; + padding: 0; + width: 300px; + height: 100px; + z-index: 1; + cursor: pointer; + background: #3175c0; + color: white; +} + +.width310px { + width: 310px; + cursor: pointer; +} + +.line-height-72 { + line-height: 72px !important; +} + +.f-s-48 { + font-size: 48px; +} + +.f-s-20 { + font-size: 20px; +} + +.f-c-w { + color: white +} + +.p-l-15 { + padding-left: 15px; +} + +.p-t-15 { + padding-top: 15px; +} + +#store { + font-size: 7em; + color: white; + height: 98px; + width: 136px; +} + +.container-fluid { + display: flex; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/src/app/service/service.component.html b/src/app/service/service.component.html new file mode 100644 index 0000000..0c801e5 --- /dev/null +++ b/src/app/service/service.component.html @@ -0,0 +1,29 @@ + + +
+
+
+ + +
+ store +
+ + +
+
+
+ + diff --git a/src/app/service/service.component.spec.ts b/src/app/service/service.component.spec.ts new file mode 100644 index 0000000..0bb3919 --- /dev/null +++ b/src/app/service/service.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ServiceComponent } from './service.component'; + +describe('ServiceComponent', () => { + let component: ServiceComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ServiceComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ServiceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/service/service.component.ts b/src/app/service/service.component.ts new file mode 100644 index 0000000..a24c865 --- /dev/null +++ b/src/app/service/service.component.ts @@ -0,0 +1,52 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-service', + templateUrl: './service.component.html', + styleUrls: ['./service.component.css'], +}) +export class ServiceComponent implements OnInit { + servicesList: any = []; + + constructor(private router: Router) {} + + ngOnInit() { + const servicesListStore = localStorage.getItem('services'); + if (servicesListStore !== null) { + this.servicesList = JSON.parse(servicesListStore); + } + } + handleKeyselectService(event: KeyboardEvent, service: any): void { + if (event.key == 'Enter' || event.key == 'Spacebar' || event.key == ' ') { + this.selectService(service); + } + } + + selectService(service: any): void { + localStorage.setItem('providerServiceID', service.providerServiceID); + sessionStorage.setItem('apimanClientKey', service.apimanClientKey); + this.router.navigate(['/facility']); + } +} diff --git a/src/app/set-password/set-password.component.css b/src/app/set-password/set-password.component.css new file mode 100644 index 0000000..09488aa --- /dev/null +++ b/src/app/set-password/set-password.component.css @@ -0,0 +1,31 @@ +.mdList { + display: flex; + align-items: center; + justify-content: center; + height: 550px; +} + +.mdCard { + width: 400px; + margin-top: 5%; + margin-left: 10px; + margin-right: 10px; + margin-bottom: 5%; + border-radius: 5px; + box-shadow: 0px 0px 20px gray; +} + +.formIcons { + padding-top: 30px; + color: gray; +} + +.full-width { + width: 100%; + margin-top: 10px; + margin-bottom: 10px; +} + +.f-c-54 { + color: #545454 !important; +} diff --git a/src/app/set-password/set-password.component.html b/src/app/set-password/set-password.component.html new file mode 100644 index 0000000..ec9ff7a --- /dev/null +++ b/src/app/set-password/set-password.component.html @@ -0,0 +1,98 @@ + + + + + + +
+ Logo +
+
+

Account Support

+
+ Follow the steps to change/reset the password +
+
+
+ +
+
+
+ lock +
+
+ + + + +
+
+ +
+
+ lock +
+
+ + + + +
+
+
+ +
+
+ +
+
+
+
+
+
+ + diff --git a/src/app/set-password/set-password.component.spec.ts b/src/app/set-password/set-password.component.spec.ts new file mode 100644 index 0000000..2cc7fff --- /dev/null +++ b/src/app/set-password/set-password.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SetPasswordComponent } from './set-password.component'; + +describe('SetPasswordComponent', () => { + let component: SetPasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SetPasswordComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SetPasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/set-password/set-password.component.ts b/src/app/set-password/set-password.component.ts new file mode 100644 index 0000000..9b8144f --- /dev/null +++ b/src/app/set-password/set-password.component.ts @@ -0,0 +1,156 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +import { AuthenticationService } from '../login/authentication.service'; +import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; +import * as CryptoJS from 'crypto-js'; +@Component({ + selector: 'app-set-password', + templateUrl: './set-password.component.html', + styleUrls: ['./set-password.component.css'], +}) +export class SetPasswordComponent implements OnInit { + newpwd: any; + confirmpwd: any; + uname: any; + dynamictype: any = 'password'; + key: any; + iv: any; + SALT = 'RandomInitVector'; + Key_IV = 'Piramal12Piramal'; + encPassword!: string; + _keySize: any; + _ivSize: any; + _iterationCount: any; + encryptedConfirmPwd: any; + password: any; + + constructor( + private router: Router, + private authService: AuthenticationService, + //private confirmationService: ConfirmationService) { } + + private confirmationService: ConfirmationService, + ) { + this._keySize = 256; + this._ivSize = 128; + this._iterationCount = 1989; + } + + get keySize() { + return this._keySize; + } + + set keySize(value) { + this._keySize = value; + } + + get iterationCount() { + return this._iterationCount; + } + + set iterationCount(value) { + this._iterationCount = value; + } + + generateKey(salt: any, passPhrase: any) { + return CryptoJS.PBKDF2(passPhrase, CryptoJS.enc.Hex.parse(salt), { + hasher: CryptoJS.algo.SHA512, + keySize: this.keySize / 32, + iterations: this._iterationCount, + }); + } + + encryptWithIvSalt(salt: any, iv: any, passPhrase: any, plainText: any) { + const key = this.generateKey(salt, passPhrase); + const encrypted = CryptoJS.AES.encrypt(plainText, key, { + iv: CryptoJS.enc.Hex.parse(iv), + }); + return encrypted.ciphertext.toString(CryptoJS.enc.Base64); + } + + encrypt(passPhrase: any, plainText: any) { + const iv = CryptoJS.lib.WordArray.random(this._ivSize / 8).toString( + CryptoJS.enc.Hex, + ); + const salt = CryptoJS.lib.WordArray.random(this.keySize / 8).toString( + CryptoJS.enc.Hex, + ); + const ciphertext = this.encryptWithIvSalt(salt, iv, passPhrase, plainText); + return salt + iv + ciphertext; + } + + ngOnInit() { + this.uname = localStorage.getItem('userID'); + } + + showPWD() { + this.dynamictype = 'text'; + } + + hidePWD() { + this.dynamictype = 'password'; + } + + updatePassword(new_pwd: any) { + const transactionId = this.authService.transactionId; + this.password = this.encrypt(this.Key_IV, new_pwd); + this.encryptedConfirmPwd = this.encrypt(this.Key_IV, this.confirmpwd); + + if (new_pwd === this.confirmpwd) { + this.authService + .setNewPassword(this.uname, this.password, transactionId) + .subscribe( + (response: any) => { + if ( + response !== undefined && + response !== null && + response.statusCode === 200 + ) { + this.successCallback(); + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + this.router.navigate(['/reset-password']); + } + }, + (error: any) => { + this.errorCallback(error); + this.router.navigate(['/reset-password']); + }, + (this.authService.transactionId = undefined), + ); + } else { + this.confirmationService.alert('Password does not match', 'error'); + } + } + + successCallback() { + this.confirmationService.alert('Password changed successfully', 'success'); + this.router.navigate(['/']); + } + + errorCallback(response: any) { + console.log(response); + } +} diff --git a/src/app/set-security-questions/set-security-questions.component.css b/src/app/set-security-questions/set-security-questions.component.css new file mode 100644 index 0000000..0fb40ce --- /dev/null +++ b/src/app/set-security-questions/set-security-questions.component.css @@ -0,0 +1,23 @@ +.mdList { + display: flex; + align-items: center; + justify-content: center; + height: 650px; +} + +.mdCard { + width: 600px; +} + +i { + margin-top: 18px; +} + +.full-width { + width: 90%; +} + +button { + margin: auto; + display: block; +} diff --git a/src/app/set-security-questions/set-security-questions.component.html b/src/app/set-security-questions/set-security-questions.component.html new file mode 100644 index 0000000..5cb46c1 --- /dev/null +++ b/src/app/set-security-questions/set-security-questions.component.html @@ -0,0 +1,218 @@ + + + + +
+ Logo +
+
+

Account Support

+
+ Follow the steps to change/reset the password +
+
+
+ +
+
+
+ + + {{ question.Question }} + + +
+
+ + + +
+
+
+
+ + + {{ question.Question }} + + +
+
+ + + +
+
+
+
+ + + {{ question.Question }} + + +
+
+ + + +
+
+
+
+ +
+
+
+ +
+
+
+ + + + + +
+
+ + + + + +
+
+
+ +
+
+
+
+
+
+
+
diff --git a/src/app/set-security-questions/set-security-questions.component.spec.ts b/src/app/set-security-questions/set-security-questions.component.spec.ts new file mode 100644 index 0000000..d0c2210 --- /dev/null +++ b/src/app/set-security-questions/set-security-questions.component.spec.ts @@ -0,0 +1,45 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SetSecurityQuestionsComponent } from './set-security-questions.component'; + +describe('SetSecurityQuestionsComponent', () => { + let component: SetSecurityQuestionsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SetSecurityQuestionsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SetSecurityQuestionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + xit('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/set-security-questions/set-security-questions.component.ts b/src/app/set-security-questions/set-security-questions.component.ts new file mode 100644 index 0000000..fbfa6ec --- /dev/null +++ b/src/app/set-security-questions/set-security-questions.component.ts @@ -0,0 +1,333 @@ +/* + * AMRIT – Accessible Medical Records via Integrated Technology + * Integrated EHR (Electronic Health Records) Solution + * + * Copyright (C) "Piramal Swasthya Management and Research Institute" + * + * This file is part of AMRIT. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +import { AuthenticationService } from '../login/authentication.service'; +import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; +import * as CryptoJS from 'crypto-js'; +import { AuthService } from '../app-modules/core/services/auth.service'; + +@Component({ + selector: 'app-set-security-questions', + templateUrl: './set-security-questions.component.html', + styleUrls: ['./set-security-questions.component.css'], +}) +export class SetSecurityQuestionsComponent implements OnInit { + constructor( + public router: Router, + private authService: AuthenticationService, + private confirmationService: ConfirmationService, + private auth: AuthService, + ) { + this._keySize = 256; + this._ivSize = 128; + this._iterationCount = 1989; + } + + handleSuccess(response: any) { + this.questions = response.data; + this.replica_questions = response.data; + console.log(this.questions); + } + + handleError(response: any) { + console.log('error', this.questions); + } + + ngOnInit() { + this.uid = localStorage.getItem('userID'); + this.uname = localStorage.getItem('username'); + this.authService.getSecurityQuestions().subscribe( + (response: any) => this.handleSuccess(response), + (error: any) => this.handleError(error), + ); + } + + uid: any; + uname: any; + passwordSection = false; + questionsection = true; + iv: any; + SALT = 'RandomInitVector'; + Key_IV = 'Piramal12Piramal'; + encPassword!: string; + _keySize: any; + _ivSize: any; + _iterationCount: any; + encryptedConfirmPwd: any; + password: any; + + switch() { + this.passwordSection = true; + this.questionsection = false; + } + + dynamictype: any = 'password'; + + showPWD() { + this.dynamictype = 'text'; + } + + hidePWD() { + this.dynamictype = 'password'; + } + + question1: any = ''; + question2: any = ''; + question3: any = ''; + + answer1: any = ''; + answer2: any = ''; + answer3: any = ''; + + questions: any = []; + replica_questions: any = []; + Q_array_one: any = []; + Q_array_two: any = []; + + selectedQuestions: any = []; + + updateQuestions(selectedques: any, position: any) { + console.log('position', position, 'Selected Question', selectedques); + console.log( + 'before if else block, selected questions', + this.selectedQuestions, + ); + + if (this.selectedQuestions.indexOf(selectedques) == -1) { + this.selectedQuestions[position] = selectedques; + if (position === 0) { + this.answer1 = ''; + } + if (position === 1) { + this.answer2 = ''; + } + if (position === 2) { + this.answer3 = ''; + } + console.log('if block, selected questions', this.selectedQuestions); + } else { + if (this.selectedQuestions.indexOf(selectedques) != position) { + this.confirmationService.alert( + 'This Question is already selected. Choose Unique Question', + ); + } else { + this.confirmationService.alert( + 'This question is mapped at this position already', + ); + } + console.log('else block, selected questions', this.selectedQuestions); + console.log('position else block', position); + + // this.disableAnswerField(position); + } + } + + filterArrayOne(questionID: any) { + /*reset the 2nd and 3rd question and answer fields */ + this.question2 = ''; + this.answer2 = ''; + + this.question3 = ''; + this.answer3 = ''; + + /*filter the primary array based on the selection and feed resultant to Q_array_one*/ + this.Q_array_one = this.filter_function(questionID, this.replica_questions); + // this.questions=this.Q_array_one; + } + + filterArrayTwo(questionID: any) { + /*reset the 3rd question and answer field */ + this.question3 = ''; + this.answer3 = ''; + + /*filter the Q_array_one based on the selection and feed resultant to Q_array_two*/ + this.Q_array_two = this.filter_function(questionID, this.Q_array_one); + } + + filter_function(questionID: any, array: any) { + const dummy_array = []; + for (let i = 0; i < array.length; i++) { + if (array[i].QuestionID === questionID) { + continue; + } else { + dummy_array.push(array[i]); + } + } + return dummy_array; + } + + dataArray: any = []; + + setSecurityQuestions() { + console.log(this.selectedQuestions, this.selectedQuestions.length, 'yo'); + if (this.answer1 && this.answer2 && this.answer3) { + this.dataArray = [ + { + userID: this.uid, + questionID: this.question1, + answers: this.answer1, + mobileNumber: '1234567890', + createdBy: this.uname, + }, + { + userID: this.uid, + questionID: this.question2, + answers: this.answer2, + mobileNumber: '1234567890', + createdBy: this.uname, + }, + { + userID: this.uid, + questionID: this.question3, + answers: this.answer3, + mobileNumber: '1234567890', + createdBy: this.uname, + }, + ]; + + console.log('Request Array', this.dataArray); + console.log('selected questions', this.selectedQuestions); + + this.switch(); + } else { + this.confirmationService.alert( + 'All 3 questions should be different. Please check your selected Questions', + ); + } + } + + oldpwd: any; + newpwd: any; + confirmpwd: any; + + get keySize() { + return this._keySize; + } + + set keySize(value) { + this._keySize = value; + } + + get iterationCount() { + return this._iterationCount; + } + + set iterationCount(value) { + this._iterationCount = value; + } + + generateKey(salt: any, passPhrase: any) { + return CryptoJS.PBKDF2(passPhrase, CryptoJS.enc.Hex.parse(salt), { + hasher: CryptoJS.algo.SHA512, + keySize: this.keySize / 32, + iterations: this._iterationCount, + }); + } + + encryptWithIvSalt(salt: any, iv: any, passPhrase: any, plainText: any) { + const key = this.generateKey(salt, passPhrase); + const encrypted = CryptoJS.AES.encrypt(plainText, key, { + iv: CryptoJS.enc.Hex.parse(iv), + }); + return encrypted.ciphertext.toString(CryptoJS.enc.Base64); + } + + encrypt(passPhrase: any, plainText: any) { + const iv = CryptoJS.lib.WordArray.random(this._ivSize / 8).toString( + CryptoJS.enc.Hex, + ); + const salt = CryptoJS.lib.WordArray.random(this.keySize / 8).toString( + CryptoJS.enc.Hex, + ); + const ciphertext = this.encryptWithIvSalt(salt, iv, passPhrase, plainText); + return salt + iv + ciphertext; + } + + updatePassword(new_pwd: any) { + this.password = this.encrypt(this.Key_IV, new_pwd); + this.encryptedConfirmPwd = this.encrypt(this.Key_IV, this.confirmpwd); + if (new_pwd === this.confirmpwd) { + this.authService + .saveUserSecurityQuestionsAnswer(this.dataArray) + .subscribe( + (response: any) => + this.handleQuestionSaveSuccess(response, this.encryptedConfirmPwd), + (error: any) => this.handleQuestionSaveError(error), + ); + } else { + this.confirmationService.alert("Password doesn't match"); + } + } + + handleQuestionSaveSuccess(response: any, encryptedConfirmPwd: any) { + if ( + response && + response.statusCode == 200 && + response.data.transactionId !== undefined && + response.data.transactionId !== null + ) { + const transactionId = this.authService.transactionId; + console.log('saved questions', response); + this.authService + .setNewPassword( + this.uname, + encryptedConfirmPwd, + response.data.transactionId, + ) + .subscribe( + (response: any) => this.successCallback(response), + (error: any) => this.errorCallback(error), + ); + } else { + this.confirmationService.alert(response.errorMessage, 'error'); + } + } + + handleQuestionSaveError(response: any) { + console.log('question save error', response); + } + + successCallback(response: any) { + console.log(response); + this.confirmationService.alert('Password changed successfully', 'success'); + this.logout(); + // localStorage.clear(); + // sessionStorage.clear(); + // this.router.navigate(['/']); + } + + logout() { + this.auth.logoutUser().subscribe((res: any) => { + if (res && res.statusCode == 200) { + this.router.navigate(['/login']); + localStorage.clear(); + sessionStorage.clear(); + } + }); + } + + errorCallback(response: any) { + console.log(response); + } +} diff --git a/src/environments/environment.ts b/src/environments/environment.ts index cdcaa1b..c68e8bc 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,19 +3,19 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "http://10.208.122.32:8080/"; -const inventoryIP = "http://10.208.122.32:8080/"; -const mmuIP = "http://10.208.122.38:8080/"; -const FHIRIP = "http://10.208.122.38:8080/"; +const commonIP = "https://amritwprdev.piramalswasthya.org/"; +const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; +const mmuIP = "https://amritwprdev.piramalswasthya.org/"; +const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}hwc-commonapi-v1.0/`; -const COMMON_API = `${commonIP}hwc-commonapi-v1.0/`; -const INVENTORY_API = `${inventoryIP}inventoryapi-v1.0/`; -const MMU_API = `${mmuIP}mmuapi-v1.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v0.1/`; +const COMMON_API = `${commonIP}commonapi-v0.1/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v0.1/`; +const MMU_API = `${mmuIP}mmuapi-v0.1/`; const FHIR_API = `${FHIRIP}/fhirapi-v1.0/`; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; @@ -57,9 +57,9 @@ export const environment = { getItem_Url: `${INVENTORY_API}getSubStoreitem/`, - savePhysicalStock_Url: `${INVENTORY_API}physicalStockEntry/`, + savePhysicalStock_Url: `${INVENTORY_API}physicalStockEntry`, - storeSelfConsumption: `${INVENTORY_API}storeSelfConsumption/`, + storeSelfConsumption: `${INVENTORY_API}storeSelfConsumption`, searchItemUrl: `${INVENTORY_API}itemPartialSearch`, searchBatchUrl: `${INVENTORY_API}itemBatchPartialSearch`, diff --git a/src/styles.css b/src/styles.css index 6594b15..a71d4a3 100644 --- a/src/styles.css +++ b/src/styles.css @@ -18,10 +18,16 @@ text-overflow: ellipsis; } */ +.mat-mdc-raised-button.mat-accent { + --mdc-protected-button-container-color: #336CFB !important; +} +.mat-mdc-raised-button.mat-primary { + --mdc-protected-button-container-color: #336CFB !important; +} .md-input-prefix md-icon, .md-input-suffix md-icon { - vertical-align: text-bottom; + vertical-align: text-bottom; } .odd { @@ -67,6 +73,36 @@ cursor: not-allowed; } +.mat-mdc-raised-button.mat-unthemed { + --mdc-protected-button-container-color: #43a047; + --mdc-protected-button-label-text-color: white; +} + +.mat-mdc-select-disabled{ + opacity: 0.5; +} + +.mat-mdc-checkbox.mat-primary { + --mdc-checkbox-disabled-selected-icon-color: rgba(0, 0, 0, .38); + --mdc-checkbox-disabled-unselected-icon-color: rgba(0, 0, 0, .38); + --mdc-checkbox-selected-checkmark-color: #fff; + --mdc-checkbox-selected-focus-icon-color: #336CFB; + --mdc-checkbox-selected-hover-icon-color: #336CFB; + --mdc-checkbox-selected-icon-color: #336CFB; + --mdc-checkbox-selected-pressed-icon-color: #336CFB; + --mdc-checkbox-unselected-focus-icon-color: #212121; + --mdc-checkbox-unselected-hover-icon-color: #212121; + --mdc-checkbox-unselected-icon-color: rgba(0, 0, 0, .54); + --mdc-checkbox-unselected-pressed-icon-color: rgba(0, 0, 0, .54); + --mdc-checkbox-selected-focus-state-layer-color: #336CFB; + --mdc-checkbox-selected-hover-state-layer-color: #336CFB; + --mdc-checkbox-selected-pressed-state-layer-color: #336CFB; + --mdc-checkbox-unselected-focus-state-layer-color: black; + --mdc-checkbox-unselected-hover-state-layer-color: black; + --mdc-checkbox-unselected-pressed-state-layer-color: black; +} + + .inline-block { display: inline-block; } diff --git a/tsconfig.app.json b/tsconfig.app.json index 374cc9d..9161a71 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -3,7 +3,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/app", - "types": [] + "types": ["node"] }, "files": [ "src/main.ts" diff --git a/tsconfig.json b/tsconfig.json index ed966d4..b690dae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,7 @@ "declaration": false, "downlevelIteration": true, "experimentalDecorators": true, + "types": ["node"], "moduleResolution": "node", "importHelpers": true, "target": "ES2022", @@ -28,6 +29,7 @@ "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, "strictInputAccessModifiers": true, - "strictTemplates": true + "strictTemplates": true, + "fullTemplateTypeCheck": true } } From 9abf1f3da23d642121101c1dca913890899ca998 Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Fri, 19 Apr 2024 16:48:32 +0530 Subject: [PATCH 02/80] Changes in hwc-inv as functionality --- .../app-footer/app-footer.component.ts | 1 - .../app-header/app-header.component.html | 275 ++++++----- .../batch-adjustment.component.css | 14 +- .../batch-adjustment.component.html | 22 +- .../batch-adjustment.component.ts | 49 +- .../batch-search/batch-search.component.html | 22 +- .../batch-search/batch-search.component.ts | 35 +- .../beneficiary-details.component.html | 83 +++- .../beneficiary-details.component.ts | 7 +- .../common-dialog/common-dialog.component.css | 5 +- .../common-dialog.component.html | 38 +- .../common-dialog/common-dialog.component.ts | 8 +- .../indent-item-list.component.html | 32 +- .../indent-item-list.component.ts | 54 ++- .../item-dispense.component.html | 15 +- .../item-dispense/item-dispense.component.ts | 42 +- .../item-search/item-search.component.css | 2 +- .../item-search/item-search.component.html | 227 +++++---- .../item-search/item-search.component.ts | 35 +- .../rx-batch-view/rx-batch-view.component.css | 36 +- .../rx-batch-view.component.html | 47 +- .../rx-batch-view/rx-batch-view.component.ts | 39 +- .../components/search/search.component.css | 7 +- .../components/search/search.component.html | 241 +++++----- .../components/search/search.component.ts | 23 +- ...w-commit-and-version-details.component.css | 2 +- .../components/spinner/spinner.component.css | 14 - .../components/spinner/spinner.component.ts | 5 +- .../transfer-search.component.html | 21 +- .../transfer-search.component.ts | 5 +- src/app/app-modules/core/core.module.ts | 112 +---- .../MobileNumber/myMobileNumber.directive.ts | 41 -- .../directives/batch-adjustment.directive.ts | 27 +- .../core/directives/batch-search.directive.ts | 19 +- .../disableFormControl.directive.ts | 14 +- .../directives/email/myEmail.directive.ts | 2 +- .../directives/indent-dispense.directive.ts | 28 +- .../directives/indent-request.directive.ts | 79 ++-- .../directives/item-dispense.directive.ts | 9 +- .../core/directives/item-search.directive.ts | 17 +- .../directives/item-transfer.directive.ts | 25 +- .../minNumberValidator.directive.ts | 1 - .../directives/numberValidator.directive.ts | 29 +- .../password/myPassword.directive.ts | 6 +- .../directives/stringValidator.directive.ts | 6 +- src/app/app-modules/core/material.module.ts | 20 - .../core/services/auth-guard.service.ts | 5 +- .../core/services/batch-search.service.ts | 1 - .../services/beneficiary-details.service.ts | 2 + .../core/services/confirmation.service.ts | 3 +- .../core/services/http-interceptor.service.ts | 9 +- .../core/services/language.service.ts | 2 +- .../core/services/rx-batchview.service.ts | 1 - .../core/services/spinner.service.ts | 4 +- .../dashboard/dashboard.component.css | 3 - .../dynamic-print.component.html | 76 +-- .../dynamic-print/dynamic-print.component.ts | 6 +- .../indent-order-worklist.component.css | 1 + .../indent-order-worklist.component.html | 3 + .../indent-order-worklist.component.spec.ts | 45 ++ .../indent-order-worklist.component.ts | 65 +++ .../indent-dispenses.component.css | 35 ++ .../indent-dispenses.component.html | 29 ++ .../indent-dispenses.component.spec.ts | 45 ++ .../indent-dispenses.component.ts | 56 +++ .../manual-indent-dispense.component.css | 14 + .../manual-indent-dispense.component.html | 389 +++++++++++++++ .../manual-indent-dispense.component.spec.ts | 45 ++ .../manual-indent-dispense.component.ts | 420 +++++++++++++++++ ...select-batch-for-indent-item.component.css | 58 +++ ...elect-batch-for-indent-item.component.html | 382 +++++++++++++++ ...ct-batch-for-indent-item.component.spec.ts | 45 ++ .../select-batch-for-indent-item.component.ts | 441 ++++++++++++++++++ .../show-indent-batch-details.component.css | 41 ++ .../show-indent-batch-details.component.html | 148 ++++++ ...how-indent-batch-details.component.spec.ts | 45 ++ .../show-indent-batch-details.component.ts | 83 ++++ .../system-indent-dispense.component.css | 19 + .../system-indent-dispense.component.html | 305 ++++++++++++ .../system-indent-dispense.component.spec.ts | 45 ++ .../system-indent-dispense.component.ts | 340 ++++++++++++++ ...-store-indent-order-worklist.component.css | 11 + ...store-indent-order-worklist.component.html | 210 +++++++++ ...re-indent-order-worklist.component.spec.ts | 45 ++ ...n-store-indent-order-worklist.component.ts | 155 ++++++ .../main-store-item-model.component.css | 42 ++ .../main-store-item-model.component.html | 170 +++++++ .../main-store-item-model.component.spec.ts | 45 ++ .../main-store-item-model.component.ts | 82 ++++ ...ct-item-from-mainstore-model.component.css | 17 + ...t-item-from-mainstore-model.component.html | 43 ++ ...tem-from-mainstore-model.component.spec.ts | 45 ++ ...ect-item-from-mainstore-model.component.ts | 121 +++++ .../indent-request.component.css | 32 ++ .../indent-request.component.html | 327 +++++++++++++ .../indent-request.component.spec.ts | 45 ++ .../indent-request.component.ts | 422 +++++++++++++++++ ...-store-indent-order-worklist.component.css | 11 + ...store-indent-order-worklist.component.html | 244 ++++++++++ ...re-indent-order-worklist.component.spec.ts | 45 ++ ...b-store-indent-order-worklist.component.ts | 142 ++++++ .../sub-store-item-model.component.css | 47 ++ .../sub-store-item-model.component.html | 147 ++++++ .../sub-store-item-model.component.spec.ts | 45 ++ .../sub-store-item-model.component.ts | 83 ++++ .../inventory/inventory-routing.module.ts | 110 ++--- .../app-modules/inventory/inventory.module.ts | 146 ++---- .../manual-medicine-dispense.component.css | 3 + .../manual-medicine-dispense.component.html | 54 +-- .../manual-medicine-dispense.component.ts | 50 +- .../select-batch/select-batch.component.html | 17 +- .../select-batch/select-batch.component.ts | 69 ++- .../medicine-dispense.component.css | 14 +- .../medicine-dispense.component.html | 47 +- .../medicine-dispense.component.ts | 29 +- .../show-batch-item.component.css | 3 + .../show-batch-item.component.html | 22 +- .../show-batch-item.component.ts | 1 - .../system-medicine-dispense.component.css | 3 + .../system-medicine-dispense.component.html | 99 ++-- .../system-medicine-dispense.component.ts | 31 +- ...ew-medicine-dispense-details.component.css | 9 +- ...w-medicine-dispense-details.component.html | 63 +-- ...iew-medicine-dispense-details.component.ts | 20 +- .../view-medicine-dispense.component.css | 9 +- .../view-medicine-dispense.component.html | 120 +++-- .../view-medicine-dispense.component.ts | 53 +-- .../benificiary-details.component.html | 119 +++-- .../benificiary-details.component.ts | 20 +- ...h-details-for-patient-return.component.css | 6 + ...-details-for-patient-return.component.html | 162 ++++--- ...ch-details-for-patient-return.component.ts | 44 +- ...atient-return-batch-details.component.html | 301 ++++++------ .../patient-return-batch-details.component.ts | 133 ++++-- ...tient-return-previous-record.component.css | 5 +- ...ient-return-previous-record.component.html | 14 +- ...atient-return-previous-record.component.ts | 16 +- .../patient-return.component.css | 4 + .../patient-return.component.html | 42 +- .../patient-return.component.ts | 19 +- .../physical-stock-entry.component.css | 29 +- .../physical-stock-entry.component.html | 181 ++++--- .../physical-stock-entry.component.ts | 29 +- .../view-physical-stock-details.component.css | 5 +- ...view-physical-stock-details.component.html | 42 +- .../view-physical-stock-details.component.ts | 28 +- .../view-physical-stock.component.css | 10 +- .../view-physical-stock.component.html | 36 +- .../view-physical-stock.component.ts | 25 +- ...eneficiary-drug-issue-report.component.css | 13 +- ...neficiary-drug-issue-report.component.html | 97 ++-- ...beneficiary-drug-issue-report.component.ts | 24 +- .../consumption-report.component.css | 14 +- .../consumption-report.component.html | 134 +++--- .../consumption-report.component.ts | 30 +- .../daily-stock-details-report.component.css | 13 +- .../daily-stock-details-report.component.html | 136 +++--- .../daily-stock-details-report.component.ts | 21 +- .../daily-stock-summary-report.component.css | 14 +- .../daily-stock-summary-report.component.html | 47 +- .../daily-stock-summary-report.component.ts | 23 +- .../expiry-report/expiry-report.component.css | 20 +- .../expiry-report.component.html | 104 +++-- .../expiry-report/expiry-report.component.ts | 25 +- .../inward-stock-report.component.css | 14 +- .../inward-stock-report.component.html | 129 ++--- .../inward-stock-report.component.ts | 27 +- .../monthly-report.component.css | 20 +- .../monthly-report.component.html | 104 +++-- .../monthly-report.component.ts | 20 +- .../short-expiry-report.component.css | 15 +- .../short-expiry-report.component.html | 19 +- .../short-expiry-report.component.ts | 25 +- .../transit-report.component.css | 15 +- .../transit-report.component.html | 25 +- .../transit-report.component.ts | 25 +- .../yearly-report/yearly-report.component.css | 18 +- .../yearly-report.component.html | 82 ++-- .../yearly-report/yearly-report.component.ts | 22 +- .../shared/service/indent-dispense.service.ts | 33 +- .../shared/service/inventory.service.ts | 10 +- .../store-self-consumption.component.css | 7 + .../store-self-consumption.component.html | 57 ++- .../store-self-consumption.component.ts | 25 +- ...re-self-consumption-details.component.html | 151 +++--- ...tore-self-consumption-details.component.ts | 29 +- .../view-store-self-consumption.component.css | 8 +- ...view-store-self-consumption.component.html | 104 +++-- .../view-store-self-consumption.component.ts | 33 +- .../store-stock-adjustment.component.css | 15 +- .../store-stock-adjustment.component.html | 94 ++-- .../store-stock-adjustment.component.ts | 106 +++-- ...iew-stock-adjustment-details.component.css | 5 +- ...ew-stock-adjustment-details.component.html | 149 +++--- ...view-stock-adjustment-details.component.ts | 40 +- ...ck-adjustment-draft-details.component.html | 150 +++--- ...tock-adjustment-draft-details.component.ts | 41 +- ...store-stock-adjustment-draft.component.css | 6 +- ...tore-stock-adjustment-draft.component.html | 130 +++--- ...-store-stock-adjustment-draft.component.ts | 48 +- .../view-store-stock-adjustment.component.css | 12 +- ...view-store-stock-adjustment.component.html | 108 +++-- .../view-store-stock-adjustment.component.ts | 80 ++-- .../store-stock-transfer.component.css | 12 +- .../store-stock-transfer.component.html | 180 ++++++- .../store-stock-transfer.component.ts | 16 +- ...tore-stock-transfer-details.component.html | 57 +-- ...-store-stock-transfer-details.component.ts | 34 +- .../view-store-stock-transfer.component.css | 5 +- .../view-store-stock-transfer.component.html | 39 +- .../view-store-stock-transfer.component.ts | 30 +- .../inventory/workarea/workarea.component.ts | 7 +- .../rx-dashboard/rx-dashboard.component.css | 38 +- .../rx-dashboard/rx-dashboard.component.html | 23 +- .../rx/rx-dashboard/rx-dashboard.component.ts | 10 +- .../rx-item-dispense.component.css | 34 +- .../rx-item-dispense.component.html | 39 +- .../rx-item-dispense.component.ts | 25 +- .../shared/service/prescribed-drug.service.ts | 5 - .../shared/utility/prescribed-drug.utility.ts | 2 +- src/app/app-routing.module.ts | 14 +- src/app/app.module.ts | 2 +- src/environments/environment.ts | 20 +- src/styles.css | 200 +++++++- 224 files changed, 10048 insertions(+), 3330 deletions(-) create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/indent-dispenses.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/indent-dispenses.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/indent-dispenses.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/indent-dispenses.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/show-indent-batch-details/show-indent-batch-details.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/show-indent-batch-details/show-indent-batch-details.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/show-indent-batch-details/show-indent-batch-details.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/show-indent-batch-details/show-indent-batch-details.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/system-indent-dispense.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/system-indent-dispense.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/system-indent-dispense.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/system-indent-dispense/system-indent-dispense.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-item-model/main-store-item-model.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-item-model/main-store-item-model.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-item-model/main-store-item-model.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-item-model/main-store-item-model.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/reject-item-from-mainstore-model/reject-item-from-mainstore-model.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/reject-item-from-mainstore-model/reject-item-from-mainstore-model.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/reject-item-from-mainstore-model/reject-item-from-mainstore-model.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/reject-item-from-mainstore-model/reject-item-from-mainstore-model.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.css create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.html create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.spec.ts create mode 100644 src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.ts diff --git a/src/app/app-modules/core/components/app-footer/app-footer.component.ts b/src/app/app-modules/core/components/app-footer/app-footer.component.ts index b896904..0f8ec96 100644 --- a/src/app/app-modules/core/components/app-footer/app-footer.component.ts +++ b/src/app/app-modules/core/components/app-footer/app-footer.component.ts @@ -22,7 +22,6 @@ import { Component, DoCheck, OnInit } from '@angular/core'; import { LanguageService } from '../../services/language.service'; import { SetLanguageComponent } from '../set-language.component'; -// import { SetLanguageComponent } from '../set-language.component'; @Component({ selector: 'app-footer', diff --git a/src/app/app-modules/core/components/app-header/app-header.component.html b/src/app/app-modules/core/components/app-header/app-header.component.html index 4df7729..45abbf8 100644 --- a/src/app/app-modules/core/components/app-header/app-header.component.html +++ b/src/app/app-modules/core/components/app-header/app-header.component.html @@ -1,4 +1,4 @@ - +
- +
diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css index be91fd2..ab3b561 100644 --- a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.css @@ -1,6 +1,6 @@ .dialog-container { height: 100%; - overflow-x: hidden; + /* overflow-x: hidden; */ } .dialog-title { @@ -13,11 +13,6 @@ background: #336CFB; } - -/* mat-checkbox--selected { - --mat-option-selected-state-label-text-color: #336CFB !important; -} */ - .dialog-title h4 { display: inline-block; } @@ -28,7 +23,7 @@ .scrolling-content { max-height: 75vh; - overflow-y: hidden; + overflow-y: auto !important; overflow-x: hidden; } @@ -49,5 +44,8 @@ width: 100%; } } +.mat_form_field_background_color_table >>>.mat-mdc-row:hover { + color: unset !important; + } + -.enableScroll { height: 250px; flex: auto; } \ No newline at end of file diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html index c95bc17..9b808c2 100644 --- a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.html @@ -1,12 +1,13 @@

{{ currentLanguageSet?.inventory?.batchSelection }}

-
- +
-
- -
+ diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css index 7cbd257..f42b267 100644 --- a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css @@ -1,13 +1,6 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html index b1d9661..e74e0cd 100644 --- a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.html @@ -8,9 +8,9 @@

{{ currentLanguageSet?.inventory?.consumptionReport }}

-
+
{{ currentLanguageSet?.inventory?.startDate }} @@ -32,9 +32,9 @@

{{ currentLanguageSet?.inventory?.consumptionReport }}

-
+
{{ currentLanguageSet?.inventory?.endDate }} @@ -56,9 +56,9 @@

{{ currentLanguageSet?.inventory?.consumptionReport }}

-
+
{{ currentLanguageSet?.inventory?.facility }} @@ -74,20 +74,21 @@

{{ currentLanguageSet?.inventory?.consumptionReport }}

+
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css index 514beb3..f42b267 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css @@ -1,12 +1,6 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html index 0b8b5b4..2e5c5b7 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.html @@ -8,9 +8,9 @@

{{ currentLanguageSet?.inventory?.dailyStockDetailsReport }}

-
+
{{ currentLanguageSet?.inventory?.startDate }} @@ -32,9 +32,9 @@

{{ currentLanguageSet?.inventory?.dailyStockDetailsReport }}

-
+
{{ currentLanguageSet?.inventory?.endDate }} @@ -57,9 +57,9 @@

{{ currentLanguageSet?.inventory?.dailyStockDetailsReport }}

-
+
{{ currentLanguageSet?.inventory?.facility }} @@ -75,10 +75,8 @@

{{ currentLanguageSet?.inventory?.dailyStockDetailsReport }}

- -
- -
+ +
+ +
+
diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css index 7cbd257..720aa50 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css @@ -1,13 +1,7 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html index f74cd26..c3e936c 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.html @@ -5,11 +5,11 @@

{{ currentLanguageSet?.inventory?.dailyStockSummaryReport }}

-
+
-
+
{{ currentLanguageSet?.inventory?.startDate }} @@ -31,9 +31,9 @@

{{ currentLanguageSet?.inventory?.dailyStockSummaryReport }}

-
+
{{ currentLanguageSet?.inventory?.endDate }} @@ -56,9 +56,9 @@

{{ currentLanguageSet?.inventory?.dailyStockSummaryReport }}

-
+
{{ currentLanguageSet?.inventory?.facility }} @@ -70,18 +70,19 @@

{{ currentLanguageSet?.inventory?.dailyStockSummaryReport }}

+
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css index c0f728e..3a8600c 100644 --- a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css @@ -1,15 +1,8 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } /* CSS files should not be empty SonarQube Bug Fix */mat-form-field { margin-right: 40px; diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html index dc50b2e..211d5d3 100644 --- a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.html @@ -8,9 +8,9 @@

{{ currentLanguageSet?.inventory?.expiryReport }}

-
+
{{ currentLanguageSet?.inventory?.startDate }} @@ -32,9 +32,9 @@

{{ currentLanguageSet?.inventory?.expiryReport }}

-
+
{{ currentLanguageSet?.inventory?.endDate }} @@ -56,10 +56,8 @@

{{ currentLanguageSet?.inventory?.expiryReport }}

- -
- -
+ +
+ +
+
diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css index 7cbd257..720aa50 100644 --- a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css @@ -1,13 +1,7 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html index 22dc6e0..87357c9 100644 --- a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.html @@ -8,9 +8,9 @@

{{ currentLanguageSet?.inventory?.inwardStockReport }}

-
+
{{ currentLanguageSet?.inventory?.startDate }} @@ -32,9 +32,9 @@

{{ currentLanguageSet?.inventory?.inwardStockReport }}

-
+
{{ currentLanguageSet?.inventory?.endDate }} @@ -56,9 +56,9 @@

{{ currentLanguageSet?.inventory?.inwardStockReport }}

-
+
{{ currentLanguageSet?.inventory?.facility }} @@ -70,19 +70,20 @@

{{ currentLanguageSet?.inventory?.inwardStockReport }}

+
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css index 0e3f38e..2ee3e16 100644 --- a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.css @@ -45,17 +45,7 @@ margin-right: 5px; } - .mat_form_field_background_margin>>>.mat-mdc-select-trigger { - width: 85% !important; -} -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html index c62e458..5002ede 100644 --- a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.html @@ -8,9 +8,9 @@

{{ currentLanguageSet?.inventory?.monthlyReport }}

-
+
{{ currentLanguageSet?.inventory?.selectmonth }} @@ -29,9 +29,9 @@

{{ currentLanguageSet?.inventory?.monthlyReport }}

-
+
{{ currentLanguageSet?.inventory?.selectyear }} @@ -49,9 +49,9 @@

{{ currentLanguageSet?.inventory?.monthlyReport }}

-
+
{{ currentLanguageSet?.inventory?.facility }} @@ -63,20 +63,21 @@

{{ currentLanguageSet?.inventory?.monthlyReport }}

+
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css index 433e408..fff2476 100644 --- a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css +++ b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.css @@ -1,12 +1,6 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { diff --git a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html index 18784f4..893a8ee 100644 --- a/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html +++ b/src/app/app-modules/inventory/reports/short-expiry-report/short-expiry-report.component.html @@ -5,11 +5,11 @@

{{ currentLanguageSet?.inventory?.shortExpiryReport }}

-
-
-
+
+ +
{{ currentLanguageSet?.inventory?.date }} @@ -35,17 +35,18 @@

{{ currentLanguageSet?.inventory?.shortExpiryReport }}

>
+
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css index 433e408..b248896 100644 --- a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css @@ -1,14 +1,6 @@ /* CSS files should not be empty SonarQube Bug Fix */ -.mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} - .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html index 438a0f3..b562c33 100644 --- a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.html @@ -7,9 +7,9 @@

{{ currentLanguageSet?.inventory?.transitReport }}

-
+
{{ currentLanguageSet?.inventory?.startDate }} @@ -31,9 +31,9 @@

{{ currentLanguageSet?.inventory?.transitReport }}

-
+
{{ currentLanguageSet?.inventory?.endDate }} @@ -55,18 +55,19 @@

{{ currentLanguageSet?.inventory?.transitReport }}

+
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css index a225868..6f0977f 100644 --- a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.css @@ -50,15 +50,9 @@ margin-right: 5px; } - .mat_form_field_background_color>>>.mdc-text-field--filled, -.mdc-text-field--focused, -.mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, -.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 150% !important; + width: 140% !important; } diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html index 5171223..963bfd7 100644 --- a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.html @@ -8,9 +8,9 @@

{{ currentLanguageSet?.inventory?.yearlyReport }}

-
+
{{ currentLanguageSet?.inventory?.selectyear }} @@ -28,9 +28,9 @@

{{ currentLanguageSet?.inventory?.yearlyReport }}

-
+
{{ currentLanguageSet?.inventory?.facility }} @@ -46,22 +46,22 @@

{{ currentLanguageSet?.inventory?.yearlyReport }}

- +
+ +
-
- -
+
diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css index 98e671c..c46afb1 100644 --- a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.css @@ -56,9 +56,7 @@ .width20 { width: 20%; } -.mat_form_field_background_color >>> .mdc-text-field--filled:not(.mdc-text-field--disabled) { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_color_table >>> .mdc-text-field{ padding: unset !important; background-color:unset !important; diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html index a188e09..b1daf9c 100644 --- a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.html @@ -22,7 +22,7 @@

{{ @@ -53,7 +53,7 @@

{{ currentLanguageSet?.inventory?.consumptionReason diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css index b112693..a1c8a5d 100644 --- a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.css @@ -34,9 +34,4 @@ width: 100%; } } -.mat_form_field_background_color >>> .mdc-text-field--filled, .mdc-text-field--focused, .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} -/* .mat_form_field_background_color_table >>>.mat-mdc-row:hover { - color: unset !important; -} */ + diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html index e0f548a..92cbf6d 100644 --- a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.html @@ -7,7 +7,7 @@

{{ currentLanguageSet?.inventory?.fromDate }} @@ -20,7 +20,6 @@

readonly="true" [min]="_minDate" [max]="_today" - placeholder="{{ currentLanguageSet?.inventory?.fromDate }}" required="true" id="from-input" [(ngModel)]="_dateRange[0]" @@ -36,7 +35,7 @@

{{ currentLanguageSet?.inventory?.toDate }} @@ -50,7 +49,6 @@

readonly="true" [min]="_dateRange[0]" [max]="_today" - placeholder="{{ currentLanguageSet?.inventory?.toDate }}" required="true" id="to-input" [(ngModel)]="_dateRange[1]" diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css index e0463bb..0bd82e5 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.css @@ -76,9 +76,7 @@ justify-content: flex-end; padding-top: 12px; } -.mat_form_field_background_color >>> .mdc-text-field--filled { - background-color: #f2f2f0 !important; -} + .mat_form_field_background_color_table >>> .mdc-text-field{ padding: unset !important; diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html index 7a7558f..e7c7a94 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.html @@ -51,10 +51,10 @@

-
+
{{ currentLanguageSet?.inventory?.adjustmentDate @@ -76,7 +76,7 @@
{{ currentLanguageSet?.inventory?.referenceNumber diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css index 88f2e7a..918f911 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.css @@ -34,7 +34,5 @@ } } -.mat_form_field_background_color >>> .mdc-text-field--filled, .mdc-text-field--focused, .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; - } + diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html index 1a65f2e..56b3508 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html @@ -11,7 +11,6 @@

>> .mdc-text-field--filled, .mdc-text-field--focused, .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; - } + diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html index 5a528a2..a62901d 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.html @@ -7,7 +7,7 @@

{{ currentLanguageSet?.inventory?.fromDate }} @@ -30,7 +30,7 @@

{{ currentLanguageSet?.inventory?.toDate }} diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css index 6ff7fc3..ad33f14 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.css @@ -53,12 +53,9 @@ justify-content: flex-end; padding-top: 12px; } -.mat_form_field_background_color >>> .mdc-text-field--filled { - background-color: #f2f2f0 !important; -} -.mat_form_field_background_color_padding >>> .mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix { - padding-top: 24px !important; +.mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { + width: 150% !important; } .mat_form_field_background_color_table >>> .mdc-text-field{ padding: unset !important; diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html index 9ad7d39..9cb7232 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.html @@ -23,7 +23,6 @@

{{ currentLanguageSet?.inventory?.date }} @@ -32,7 +31,7 @@

{{ currentLanguageSet?.inventory?.referenceNumber @@ -48,19 +47,21 @@

+ + {{ currentLanguageSet?.inventory?.transferTo }} - - {{ store.facilityName }} - - + [style.width]="'100%'" + required="true" + formControlName="transferTo" + (selectionChange)="resetItemArray()" + > + + {{ store.facilityName }} + + + +

diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css index 9afff86..47c39d6 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.css @@ -86,6 +86,3 @@ ul li div { width: 100%; } } -.mat_form_field_background_color >>> .mdc-text-field--filled, .mdc-text-field--focused, .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { - background-color: #f2f2f0 !important; -} \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html index 76d7203..e99d217 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.html @@ -11,7 +11,7 @@

{{ currentLanguageSet?.inventory?.fromDate }} @@ -24,7 +24,6 @@

readonly="true" [min]="_minDate" [max]="_today" - placeholder="{{ currentLanguageSet?.inventory?.fromDate }}" required="true" id="from-input" [(ngModel)]="_dateRange[0]" @@ -41,7 +40,7 @@

{{ currentLanguageSet?.inventory?.toDate }} @@ -55,7 +54,6 @@

readonly="true" [min]="_dateRange[0]" [max]="_today" - placeholder="{{ currentLanguageSet?.inventory?.toDate }}" required="true" id="to-input" [(ngModel)]="_dateRange[1]" diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css index a1ccb7a..e055ece 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css @@ -72,9 +72,4 @@ legend { .width20 { width: 20%; } -/* .mat_form_field_background_color >>>.mdc-text-field--filled:not(.mdc-text-field--disabled) { - background-color: #f7fafa !important; -} */ -.mat_form_field_background_color >>>.mdc-text-field--filled, .mdc-text-field--focused { - background-color: #f7fafa !important; -} + diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html index b8fddc4..e78404f 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -34,7 +34,7 @@
{{ currentLanguageSet?.itemDispense?.form @@ -45,13 +45,12 @@ type="text" matInput formControlName="drugForm" - placeholder="{{ currentLanguageSet?.itemDispense?.form }}" />
{{ currentLanguageSet?.itemDispense?.duration @@ -62,9 +61,7 @@ type="text" matInput formControlName="durationView" - placeholder="{{ - currentLanguageSet?.itemDispense?.duration - }}" + />
@@ -72,7 +69,7 @@ class="col-md-2 left-padding-remove-desktop right-padding-remove-desktop" > {{ currentLanguageSet?.itemDispense?.frequency @@ -83,15 +80,13 @@ type="text" matInput formControlName="frequency" - placeholder="{{ - currentLanguageSet?.itemDispense?.frequency - }}" + />
{{ currentLanguageSet?.itemDispense?.dose @@ -102,13 +97,12 @@ type="text" matInput formControlName="dose" - placeholder="{{ currentLanguageSet?.itemDispense?.dose }}" />
{{ currentLanguageSet?.itemDispense?.quantityPrescribed @@ -119,15 +113,13 @@ type="text" matInput formControlName="qtyPrescribed" - placeholder="{{ - currentLanguageSet?.itemDispense?.quantityPrescribed - }}" + />
{{ currentLanguageSet?.itemDispense?.quantityDispensed @@ -139,26 +131,24 @@ matInput allowText="number" formControlName="qtyDispensed" - placeholder="{{ - currentLanguageSet?.itemDispense?.quantityDispensed - }}" + allowMax="drug.value.qtyPrescribed" />
+ {{ + currentLanguageSet?.itemDispense?.route + }}
@@ -169,17 +159,17 @@ }" > + {{ + currentLanguageSet?.itemDispense?.specialInstructions + }}

diff --git a/src/app/facility-selection/facility-selection.component.css b/src/app/facility-selection/facility-selection.component.css index 2fac64e..35966c5 100644 --- a/src/app/facility-selection/facility-selection.component.css +++ b/src/app/facility-selection/facility-selection.component.css @@ -27,4 +27,7 @@ h4 { font-weight: bold; color: #52575C !important; +} +.mat_form_field_background_width >>>.mat-mdc-text-field-wrapper { + width: 200% !important; } \ No newline at end of file diff --git a/src/app/facility-selection/facility-selection.component.html b/src/app/facility-selection/facility-selection.component.html index f7dc68e..bd42958 100644 --- a/src/app/facility-selection/facility-selection.component.html +++ b/src/app/facility-selection/facility-selection.component.html @@ -1,8 +1,9 @@ -
+
-
+
+
Logo @@ -17,12 +18,12 @@

{{currentLanguageSet?.inventory?.typeofStores}}

+ + {{ currentLanguageSet?.inventory?.facility }} @@ -33,6 +34,8 @@

{{currentLanguageSet?.inventory?.typeofStores}} {{ facility.facilityName }} + +

-
- + + {{ currentLanguageSet?.inventory?.subFacility }} + diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 2d6a0b5..5c2cb8e 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -7,22 +7,24 @@
- UsernameIcon + UsernameIcon
- + Enter User Name +
- UsernameIcon + UsernameIcon
- + Enter Password +
@@ -34,8 +36,8 @@
diff --git a/src/app/reset-password/reset-password.component.css b/src/app/reset-password/reset-password.component.css index c36b8d2..757609f 100644 --- a/src/app/reset-password/reset-password.component.css +++ b/src/app/reset-password/reset-password.component.css @@ -37,3 +37,7 @@ .error_text{ color: red; } +.mat-mdc-raised-button.mat-unthemed { + --mdc-protected-button-container-color: #C21F1F !important; + --mdc-protected-button-label-text-color: white; +} diff --git a/src/app/reset-password/reset-password.component.html b/src/app/reset-password/reset-password.component.html index c3bbbec..ab6e274 100644 --- a/src/app/reset-password/reset-password.component.html +++ b/src/app/reset-password/reset-password.component.html @@ -1,7 +1,7 @@ - +
@@ -21,13 +21,13 @@
+ Enter User Name style="display: flex; justify-content: left" mat-raised-button type="button" + class="button_color" [routerLink]="['/']" > Cancel @@ -51,7 +52,7 @@
+ Enter Answer Next
-
+
diff --git a/src/app/set-password/set-password.component.html b/src/app/set-password/set-password.component.html index ec9ff7a..6527a60 100644 --- a/src/app/set-password/set-password.component.html +++ b/src/app/set-password/set-password.component.html @@ -22,12 +22,12 @@
+ New Password
+ Confirm Password
- + Question 1 + {{ question.Question }} + +
+ Answer 1
- + Question 2 + {{ question.Question }} + +
+ Answer 2
+ + Question 3 +
+ Answer 3
+ New Password autocomplete="off" matInput type="{{ dynamictype }}" - placeholder="New Password" [(ngModel)]="newpwd" name="newpwd" required @@ -169,6 +177,7 @@
+ Confirm Password autocomplete="off" matInput type="{{ dynamictype }}" - placeholder="Confirm Password" [(ngModel)]="confirmpwd" name="confirmpwd" required diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 94fa812..2d6698b 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,20 +3,20 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "http://183.82.107.186:8080/"; -const inventoryIP = "http://183.82.107.186:8080/"; -const mmuIP = "http://183.82.107.186:8080/"; -const FHIRIP = "http://183.82.107.186:8080/"; +const commonIP = "https://amritwprdev.piramalswasthya.org/"; +const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; +const mmuIP = "https://amritwprdev.piramalswasthya.org/"; +const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; -const COMMON_API = `${commonIP}commonapi-v1.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; -const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}/fhirapi-v1.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v0.1/`; +const COMMON_API = `${commonIP}commonapi-v0.1/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v0.1/`; +const MMU_API = `${mmuIP}mmuapi-v0.1/`; +const FHIR_API = `${FHIRIP}/fhirapi-v0.1/`; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { diff --git a/src/styles.css b/src/styles.css index 0a9e963..5d51717 100644 --- a/src/styles.css +++ b/src/styles.css @@ -24,12 +24,20 @@ .mat-mdc-raised-button.mat-primary { --mdc-protected-button-container-color: #336CFB !important; + border-radius: 30px !important; +} +.mat-mdc-raised-button{ + border-radius: 30px !important; } - .md-input-prefix md-icon, .md-input-suffix md-icon { vertical-align: text-bottom; } +button.mat-button { + font-weight: bold !important; + width: 100%; +} + .odd { background-color: #f0f5f5; border-bottom: 1px solid #ddd; @@ -493,16 +501,20 @@ table thead tr th { border-color: unset !important; color: white; border: unset; - border-radius: 3px; + border-radius: 30px; line-height: 36px; min-width: 88px; } +.button-full-width{ + border-radius: 30px; + +} .mat_blue:disabled { - background-color: #e0e0e0 !important; + background-color: #d3dbef !important; border-color: unset !important; color: rgba(0, 0, 0, 0.38); border: unset; - border-radius: 3px; + border-radius: 30px; line-height: 36px; min-width: 88px; } @@ -511,18 +523,18 @@ table thead tr th { border-color: unset !important; color: white; border: unset; - border-radius: 3px; + border-radius: 16px; line-height: 36px; - min-width: 88px; + min-width: 100px; } .mat_green:disabled { - background-color: #e0e0e0 !important; + background-color: #d3dbef !important; border-color: unset !important; color: rgba(0, 0, 0, 0.38); border: unset; - border-radius: 3px; + border-radius: 16px; line-height: 36px; - min-width: 88px; + min-width: 100px; } .mat_gray { @@ -550,7 +562,7 @@ table thead tr th { z-index: 3; } .mat_blue_circle:disabled { - background-color: #e0e0e0; + background-color: #d3dbef; min-width: 0; border-radius: 50%; border-color: unset !important; @@ -661,4 +673,58 @@ table thead tr th { table-layout: auto; white-space: unset !important; background-color: var(--mat-table-background-color); +} + +/* .mat-select-disabled .mat-select-underline { + background-color: transparent !important; + background-position: 0 bottom; +} +[aria-disabled='true'] .mat-select-underline { + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.42)), color-stop(33%, rgba(0, 0, 0, 0.42)), color-stop(0%, transparent)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%); + background-size: 4px 1px; + background-repeat: repeat-x; +} +.mat-select-disabled .mat-select-underline { + background-color: transparent; + background-position: 0 bottom; +} + +.mat-form-field-underline { + background-color: #336CFB !important; + background-size: 4px 1px; + background-repeat: repeat-x; + background-color: unset; + position: absolute; + height: 2px; + width: 100%; +} */ + +.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before { + border-bottom-color:#336CFB !important; +} +.mdc-line-ripple::before, .mdc-line-ripple::after { + + background-color: transparent !important; + background-position: 0 bottom !important; + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.42)), color-stop(33%, rgba(0, 0, 0, 0.42)), color-stop(0%, transparent)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%); + background-size: 4px 1px; + background-repeat: repeat-x; +} + +.mdc-text-field--filled, .mdc-text-field--focused, .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field:hover .mat-mdc-form-field-focus-overlay, .mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay { + background-color: unset !important; +} + +.mat-select-underline { + background-color: #336CFB !important; + background-color: unset; + position: absolute; + height: 2px; + width: 100%; +} +.mat-mdc-button .mdc-button__label, .mat-mdc-unelevated-button .mdc-button__label, .mat-mdc-raised-button .mdc-button__label, .mat-mdc-outlined-button .mdc-button__label { + z-index: 1; + font-weight: bold !important; } \ No newline at end of file From 290363c10b124678e5a573cbe766145516e900b3 Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Mon, 22 Apr 2024 17:31:13 +0530 Subject: [PATCH 06/80] change in url in ev files --- src/environments/environment.prod.ts | 2 +- src/environments/environment.test.ts | 2 +- src/environments/environment.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 97ee1f8..8e25dee 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -80,7 +80,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index b6310cb..29c463c 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -81,7 +81,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 94fa812..5bf0244 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -82,7 +82,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, From 7ec25f470eed78b26aca174a58bfa90b9040aa27 Mon Sep 17 00:00:00 2001 From: Nagendra Babu Kokkiligadda Date: Mon, 22 Apr 2024 18:32:06 +0530 Subject: [PATCH 07/80] CSS changes --- .../core/components/app-header/app-header.component.css | 2 +- .../beneficiary-drug-issue-report.component.css | 2 +- .../consumption-report/consumption-report.component.css | 2 +- .../daily-stock-details-report.component.css | 2 +- .../daily-stock-summary-report.component.css | 2 +- .../reports/expiry-report/expiry-report.component.css | 2 +- .../inward-stock-report/inward-stock-report.component.css | 2 +- .../reports/transit-report/transit-report.component.css | 2 +- .../view-store-stock-adjustment-draft.component.html | 2 +- src/app/facility-selection/facility-selection.component.html | 4 ++-- src/app/service/service.component.css | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/app-modules/core/components/app-header/app-header.component.css b/src/app/app-modules/core/components/app-header/app-header.component.css index 90b8024..ba3c725 100644 --- a/src/app/app-modules/core/components/app-header/app-header.component.css +++ b/src/app/app-modules/core/components/app-header/app-header.component.css @@ -104,7 +104,7 @@ button.mat-button { } .alignDropDown { - margin-top: 3px; + margin-top: 2px; } .alignWord { margin: 8px 10px; diff --git a/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css index be7f812..fc621c5 100644 --- a/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css +++ b/src/app/app-modules/inventory/reports/beneficiary-drug-issue-report/beneficiary-drug-issue-report.component.css @@ -6,5 +6,5 @@ mat-form-field { .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } \ No newline at end of file diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css index f42b267..601974b 100644 --- a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.css @@ -1,6 +1,6 @@ /* CSS files should not be empty SonarQube Bug Fix */ .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css index f42b267..601974b 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.css @@ -1,6 +1,6 @@ /* CSS files should not be empty SonarQube Bug Fix */ .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css index 720aa50..bad2176 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.css @@ -2,6 +2,6 @@ .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } diff --git a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css index 3a8600c..fbd5113 100644 --- a/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css +++ b/src/app/app-modules/inventory/reports/expiry-report/expiry-report.component.css @@ -2,7 +2,7 @@ .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } /* CSS files should not be empty SonarQube Bug Fix */mat-form-field { margin-right: 40px; diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css index 720aa50..bad2176 100644 --- a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.css @@ -2,6 +2,6 @@ .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } diff --git a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css index b248896..75c3479 100644 --- a/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css +++ b/src/app/app-modules/inventory/reports/transit-report/transit-report.component.css @@ -2,5 +2,5 @@ .mat_form_field_background_width>>>.mat-mdc-text-field-wrapper { - width: 140% !important; + width: 125% !important; } \ No newline at end of file diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html index 56b3508..89c5e2d 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.html @@ -49,7 +49,7 @@

>{{ currentLanguageSet?.inventory?.toDateCannotBeBeforeFromDate }}

-
+

- - diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts index 99d4d3d..c80dcca 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts @@ -167,62 +167,6 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { }, disableClose: false, }); - // matDialogRef.afterClosed().subscribe((result) => { - // if (result) { - // console.log('Result', result); - - // if (editIndex !== null) { - // this.manualDispenseList.data.splice(editIndex, 1); - // this.manualDispenseList.data.push(result); - // console.log( - // 'this.manualDispenseList***********', - // JSON.stringify(this.manualDispenseList, null, 4), - // ); - // this.manualDispenseList.paginator = this.paginator; - // this.manualDispenseList.data.forEach((manualDispenseItem: any) => { - // this.batchNumberDataList = []; - // this.otherData = []; - // manualDispenseItem.batchDetails.batchList.forEach( - // (batchItem: any) => { - // this.batchNumberDataList.push(batchItem.batchNo); - // this.otherData.push(batchItem.quantityOfDispense); - // }, - // ); - // manualDispenseItem['batchNo'] = this.batchNumberDataList; - // manualDispenseItem['quantityOfDispense'] = this.otherData; - // console.log('manualDispenseList', this.manualDispenseList.data); - // }); - - // } else { - // this.manualDispenseList.data.push(result); - // console.log("this.manualDispenseList.data under else with empty",this.manualDispenseList.data); - // this.manualDispenseList.paginator = this.paginator; - // this.manualDispenseList.data.forEach((manualDispenseItem: any) => { - // this.batchNumberDataList = []; - // this.otherData = []; - // manualDispenseItem.batchDetails.batchList.forEach( - // (batchItem: any) => { - // this.batchNumberDataList.push(batchItem.batchNo); - // this.otherData.push(batchItem.quantityOfDispense); - // }, - // ); - // manualDispenseItem['batchNo'] = this.batchNumberDataList; - // manualDispenseItem['quantityOfDispense'] = this.otherData; - // console.log('manualDispenseList', this.manualDispenseList.data); - // }); - // this.disableBatchSelcetion( - // selectedItem, - // this.mainStoreItemListForDispense, - // ); - // this.manualDispenseList.data.push(result); - // console.log( - // 'this.manualDispenseList*********** in else', - // JSON.stringify(this.manualDispenseList.data), - // ); - // } - // } - // }); - matDialogRef.afterClosed().subscribe((result) => { if (result) { console.log('Result', result); diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.html index 85a1a15..852cc28 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/select-batch-for-indent-item/select-batch-for-indent-item.component.html @@ -51,77 +51,6 @@

{{ title }}

- - -
@@ -321,24 +250,6 @@

{{ title }}

No Record found -
-->
- -
-
{{ currentLanguageSet?.inventory?.dispensingItem }} class="table-responsive mat_form_field_background_color_table" *ngIf="systemDispenseList.length > 0" > - -
{{ currentLanguageSet?.inventory?.mainStoreIndentOrderWorklist }}
- -
@@ -117,12 +73,6 @@

{{ currentLanguageSet?.inventory?.mainStoreIndentOrderWorklist }}

>remove_red_eye -
@@ -160,20 +110,6 @@

{{ currentLanguageSet?.inventory?.mainStoreIndentOrderWorklist }}

*matRowDef="let row; columns: displayedColumns" >
- - - -
{{ currentLanguageSet?.inventory?.mainStoreIndentOrderWorklist }}

> No Record found
- - ItemList Details
- - @@ -104,24 +73,6 @@

ItemList Details

- - - - - -
{{ element.remarks }}
{{ currentLanguageSet?.inventory?.indentRequest }}
- {{ currentLanguageSet?.inventory?.indentDate }} @@ -30,17 +27,6 @@

{{ currentLanguageSet?.inventory?.indentRequest }}

>
- -
{{ currentLanguageSet?.inventory?.indentRequest }} *matRowDef="let row; columns: displayedColumns" >
- -
1) - if (IndentItemListArray.length > 1) { this.deleted = true; const temp = { diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.html index dc2ac8c..1de2eec 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.html @@ -25,57 +25,6 @@

{{ currentLanguageSet?.inventory?.subStoreIndentOrderWorklist }}

- - diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.html index 5b05689..2746b25 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-item-model/sub-store-item-model.component.html @@ -50,39 +50,6 @@

{{ currentLanguageSet?.inventory?.itemListDetails }}

- -
From e69ad486fbfcfec3d8936a619dfc19651be2c8d0 Mon Sep 17 00:00:00 2001 From: Bhallamudi Pratibha Date: Wed, 8 May 2024 16:45:37 +0530 Subject: [PATCH 11/80] ci build configurations changes --- angular.json | 30 +++ package-lock.json | 67 ++----- package.json | 7 +- pom.xml | 193 ++++++++++++++++++++ src/environments/environment.ci.ts.template | 5 +- 5 files changed, 249 insertions(+), 53 deletions(-) create mode 100644 pom.xml diff --git a/angular.json b/angular.json index a6f1c07..abc35e2 100644 --- a/angular.json +++ b/angular.json @@ -57,6 +57,36 @@ "extractLicenses": false, "sourceMap": true, "namedChunks": true + }, + "ci": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "5mb", + "maximumError": "6mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "1mb", + "maximumError": "2mb" + } + ], + "outputHashing": "all", + "optimization": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.ci.ts" + } + ] + }, + "test":{ + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.test.ts" + } + ] } }, "defaultConfiguration": "production" diff --git a/package-lock.json b/package-lock.json index 79be6a8..df61378 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4557,16 +4557,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -18358,8 +18348,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} + "dev": true }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -20444,8 +20433,7 @@ "version": "16.2.14", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", - "dev": true, - "requires": {} + "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -20744,12 +20732,6 @@ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true - }, "@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -21280,8 +21262,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "requires": {} + "dev": true }, "@webassemblyjs/ast": { "version": "1.12.1", @@ -21587,15 +21568,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -22117,8 +22096,7 @@ "bootstrap": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "requires": {} + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==" }, "brace-expansion": { "version": "1.1.11", @@ -23356,8 +23334,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -23726,8 +23703,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "5.1.3", @@ -24746,8 +24722,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -25575,8 +25550,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "requires": {} + "dev": true }, "karma-source-map-support": { "version": "1.4.0", @@ -27753,8 +27727,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.5", @@ -28900,8 +28873,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -29377,8 +29349,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "commander": { "version": "2.20.3", @@ -29519,8 +29490,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "requires": {} + "dev": true }, "tsconfig-paths": { "version": "4.2.0", @@ -29990,8 +29960,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -30096,8 +30065,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -30276,8 +30244,7 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "3.0.0", diff --git a/package.json b/package.json index c4d7a76..20c4564 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,12 @@ "watch": "ng build --watch --configuration development", "test": "ng test", "lint": "ng lint", - "prepare": "husky install" + "prepare": "husky install", + "e2e": "ng e2e", + "build-dev": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=development --aot", + "build-prod": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=production --aot", + "build-ci": "chmod +x ./scripts/*.js && ./scripts/ci-prebuild.js && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=ci --aot", + "build-test": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=test --aot" }, "lint-staged": { "src/**/*.{ts,css,html}": [ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c636e04 --- /dev/null +++ b/pom.xml @@ -0,0 +1,193 @@ + + + + 4.0.0 + com.iemr.hwc-inventory-ui-next + hwc-inventory-ui-next + 1.0 + hwc-inventory-ui-next + Piramal - inventory: Module ui + war + + + dev + + 10.208.122.38 + 10.208.122.38 + dev + + + true + + + + uat + + 10.208.122.38 + deviemr.piramalswasthya.org + uat + + + + local + + 10.208.122.38 + localhost + local + + + + test + + 10.208.122.38 + 10.208.122.32 + test + + + + ci + + ci + + + + + + + UTF-8 + hwc-inventory-ui-next-v1.0 + 10.208.122.32 + 9990 + localhost + 9990 + deviemr.piramalswasthya.org + 9990 + 10.208.122.38 + 9990 + wildfly-${environment} + {hostname-${environment}} + {port-${environment}} + + + + + hwc-inventory-ui-next-v1.0 + + + maven-clean-plugin + 3.3.2 + + + + dist + + + + false + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + npm-install + compile + + exec + + + npm + + install + --legacy-peer-deps + + + + + ng-build + compile + + exec + + + npm + + run + build-${environment} + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + + default-copy-resources + prepare-package + + true + ${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/ + + + ${project.basedir}/dist + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.4.0 + + false + + + + dist + + + true + src/packaging/ + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.1.0 + + + properties-updated + prepare-package + + run + + + + replacing/updating urls ${project.basedir} 2 + + + + + + + + + + + diff --git a/src/environments/environment.ci.ts.template b/src/environments/environment.ci.ts.template index 58cfd50..95138e4 100644 --- a/src/environments/environment.ci.ts.template +++ b/src/environments/environment.ci.ts.template @@ -73,7 +73,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, @@ -126,5 +126,6 @@ export const environment = { validateSecurityQuestions: `${COMMON_API}user/validateSecurityQuestionAndAnswer`, /* TransactionID for changing password */ - getTransacIDForPasswordChange: `${COMMON_API}user/getTransactionIdForChangePassword` + getTransacIDForPasswordChange: `${COMMON_API}user/getTransactionIdForChangePassword`, + saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha` }; From 594996a8dd0739557fd97080411404e287d93c45 Mon Sep 17 00:00:00 2001 From: Bhallamudi Pratibha Date: Thu, 9 May 2024 17:20:05 +0530 Subject: [PATCH 12/80] ci environmentfile changes --- src/environments/environment.ci.ts.template | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/environments/environment.ci.ts.template b/src/environments/environment.ci.ts.template index 95138e4..631ff26 100644 --- a/src/environments/environment.ci.ts.template +++ b/src/environments/environment.ci.ts.template @@ -48,9 +48,9 @@ export const environment = { getItem_Url: `${INVENTORY_API}getSubStoreitem/`, - savePhysicalStock_Url: `${INVENTORY_API}physicalStockEntry/`, + savePhysicalStock_Url: `${INVENTORY_API}physicalStockEntry`, - storeSelfConsumption: `${INVENTORY_API}storeSelfConsumption/`, + storeSelfConsumption: `${INVENTORY_API}storeSelfConsumption`, searchItemUrl: `${INVENTORY_API}itemPartialSearch`, searchBatchUrl: `${INVENTORY_API}itemBatchPartialSearch`, @@ -105,16 +105,16 @@ export const environment = { updateIndentOrderUrl: `${INVENTORY_API}indentController/updateIndentOrder`, /* Report URL's*/ - inwardStockReportUrl: `${INVENTORY_API}/crmReportController/getInwardStockReport`, - consumptionReportUrl: `${INVENTORY_API}/crmReportController/getConsumptionReport`, - expiryReportUrl: `${INVENTORY_API}/crmReportController/getExpiryReport`, - beneficiaryDrugIssueReportUrl: `${INVENTORY_API}/crmReportController/getBenDrugIssueReport`, - dailyStockDetailsReportUrl: `${INVENTORY_API}/crmReportController/getDailyStockDetailReport`, - dailyStockSummaryReportUrl: `${INVENTORY_API}/crmReportController/getDailyStockSummaryReport`, - monthlyReportUrl: `${INVENTORY_API}/crmReportController/getMonthlyReport`, - yearlyReportUrl: `${INVENTORY_API}/crmReportController/getYearlyReport`, - shortExpiryReportUrl: `${INVENTORY_API}/crmReportController/getShortExpiryReport`, - transitReportUrl: `${INVENTORY_API}/crmReportController/getTransitReport`, + inwardStockReportUrl: `${INVENTORY_API}crmReportController/getInwardStockReport`, + consumptionReportUrl: `${INVENTORY_API}crmReportController/getConsumptionReport`, + expiryReportUrl: `${INVENTORY_API}crmReportController/getExpiryReport`, + beneficiaryDrugIssueReportUrl: `${INVENTORY_API}crmReportController/getBenDrugIssueReport`, + dailyStockDetailsReportUrl: `${INVENTORY_API}crmReportController/getDailyStockDetailReport`, + dailyStockSummaryReportUrl: `${INVENTORY_API}crmReportController/getDailyStockSummaryReport`, + monthlyReportUrl: `${INVENTORY_API}crmReportController/getMonthlyReport`, + yearlyReportUrl: `${INVENTORY_API}crmReportController/getYearlyReport`, + shortExpiryReportUrl: `${INVENTORY_API}crmReportController/getShortExpiryReport`, + transitReportUrl: `${INVENTORY_API}crmReportController/getTransitReport`, licenseUrl: `${COMMON_API}license.html`, apiVersionUrl: `${INVENTORY_API}version`, getLanguageList: `${COMMON_API}beneficiary/getLanguageList`, From 3f12ff83b218e0c46a47c3d89ad782c12553de3e Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Tue, 14 May 2024 15:47:45 +0530 Subject: [PATCH 13/80] Bug fix for upgrad--url --- src/environments/environment.prod.ts | 4 ++-- src/environments/environment.test.ts | 4 ++-- src/environments/environment.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 8e25dee..6e89b44 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -15,7 +15,7 @@ const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; const COMMON_API = `${commonIP}commonapi-v1.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}/fhirapi-v1.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; export const environment = { production: true, @@ -80,7 +80,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 29c463c..d32e353 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -16,7 +16,7 @@ const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; const COMMON_API = `${commonIP}commonapi-v1.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}/fhirapi-v1.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; export const environment = { production: true, @@ -81,7 +81,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 5bf0244..c120580 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -16,7 +16,7 @@ const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; const COMMON_API = `${commonIP}commonapi-v1.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}/fhirapi-v1.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { @@ -82,7 +82,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, From 521b4d159d465ea1cb694ef6fca6b347469afe7f Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Wed, 15 May 2024 18:03:35 +0530 Subject: [PATCH 14/80] Bug fix for hwc-inv for upgrad --- .../item-batch-details-for-patient-return.component.css | 2 +- src/app/facility-selection/facility-selection.component.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css index a934642..93d5cb6 100644 --- a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.css @@ -83,7 +83,7 @@ #topBtn { display: flex; justify-content: flex-end; - padding-top: 12px; + padding-bottom: 40px; } .mat_form_field_background_width >>>.mat-mdc-text-field-wrapper { diff --git a/src/app/facility-selection/facility-selection.component.ts b/src/app/facility-selection/facility-selection.component.ts index 816a635..40d8d26 100644 --- a/src/app/facility-selection/facility-selection.component.ts +++ b/src/app/facility-selection/facility-selection.component.ts @@ -70,13 +70,13 @@ export class FacilitySelectionComponent implements OnInit, DoCheck { const facility: any = this.facilityForm.controls['facility'].value; const subFacility: any = this.facilityForm.controls['subFacility'].value; if ( - this.facilityForm.controls.isMainStore.value && + this.facilityForm.controls.isMainStore.value === 'true' && this.facilityForm.controls.facility.value ) { this.enableContinue = true; localStorage.setItem('facilityID', facility.facilityID); localStorage.setItem('facilityDetail', JSON.stringify(facility)); - } else if (isMainStore == 'false' && facility && subFacility) { + } else if (isMainStore === 'false' && facility && subFacility) { this.enableContinue = true; localStorage.setItem('facilityID', subFacility.facilityID); localStorage.setItem('facilityDetail', JSON.stringify(subFacility)); From 7fbc54ed0340b4c67cc384b42022efd6590ce665 Mon Sep 17 00:00:00 2001 From: nkokkiligadda87 Date: Mon, 20 May 2024 13:03:27 +0530 Subject: [PATCH 15/80] CSS changes --- .../rx/rx-dashboard/rx-dashboard.component.html | 8 +++++--- src/styles.css | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html index 57a68ea..ac9aa2c 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html @@ -10,7 +10,8 @@
- + @@ -31,7 +32,8 @@ {{ currentLanguageSet?.itemDispense?.manualIssue }} - +
diff --git a/src/styles.css b/src/styles.css index 5d51717..7eb3e73 100644 --- a/src/styles.css +++ b/src/styles.css @@ -727,4 +727,9 @@ table thead tr th { .mat-mdc-button .mdc-button__label, .mat-mdc-unelevated-button .mdc-button__label, .mat-mdc-raised-button .mdc-button__label, .mat-mdc-outlined-button .mdc-button__label { z-index: 1; font-weight: bold !important; +} +.mat-mdc-fab.mat-primary, .mat-mdc-mini-fab.mat-primary { + --mdc-fab-container-color: #336CFB !important; + --mdc-fab-icon-color: white; + --mat-mdc-fab-color: #fff; } \ No newline at end of file From 4bcba7d2faee2ceae5c6f7d1bdb42c88a1eca3ae Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Wed, 3 Jul 2024 10:04:51 +0530 Subject: [PATCH 16/80] Change in column name of table in item-dispense screen --- .../components/item-dispense/item-dispense.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/app-modules/core/components/item-dispense/item-dispense.component.html b/src/app/app-modules/core/components/item-dispense/item-dispense.component.html index 61648cd..baf1832 100644 --- a/src/app/app-modules/core/components/item-dispense/item-dispense.component.html +++ b/src/app/app-modules/core/components/item-dispense/item-dispense.component.html @@ -64,9 +64,9 @@

{{ currentLanguageSet?.inventory?.itemSelection }}

- +
- + - - - + diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts index c80dcca..a44c9b9 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts @@ -134,12 +134,19 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { console.log('Batch list response', batchlistResponse); this.batchlist = batchlistResponse.data; console.log('this.batchList', this.batchlist); + + if (this.batchlist.length > 0) { this.openSelectBatchDialog( selectedItem, this.batchlist, editIndex, editableItem, ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.noBatchavailableforthisItem, + ); + } } }); } diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css index e055ece..ce77773 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css @@ -72,4 +72,7 @@ legend { .width20 { width: 20%; } +.alignCenter { + justify-content: center; +} diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html index e78404f..541aa37 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -18,8 +18,8 @@ {{ prescriptionForm.value.consultantName }} -
- +
+ {{ currentLanguageSet?.inventory?.noMedicalitemstoDisptach }}
diff --git a/src/assets/English.json b/src/assets/English.json index fc07eb5..cfa87e7 100644 --- a/src/assets/English.json +++ b/src/assets/English.json @@ -191,7 +191,7 @@ "prescriptionID": "Prescription ID", "visitCode": "Visit Code", "consultantName": "Consultant Name", - "noMedicalitemstoDisptach": "No Medical items to Disptach", + "noMedicalitemstoDisptach": "No Medical items to Dispatch", "form": "Form", "duration": "Duration", "frequency": "Frequency", From 00f35c9baa65a176a32ae046500ad923af49b4d5 Mon Sep 17 00:00:00 2001 From: devikasuresh20 <57424483+devikasuresh20@users.noreply.github.com> Date: Fri, 27 Sep 2024 18:49:35 +0530 Subject: [PATCH 24/80] Added medicine batches empty condition for indent and also corrected alignment issues (#34) --- .../manual-indent-dispense.component.html | 17 ++--------------- .../manual-indent-dispense.component.ts | 7 +++++++ .../rx-item-dispense.component.css | 3 +++ .../rx-item-dispense.component.html | 4 ++-- src/assets/English.json | 2 +- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html index b31db16..08ca8d6 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html @@ -67,19 +67,7 @@
- - - - + diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts index c80dcca..a44c9b9 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts @@ -134,12 +134,19 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { console.log('Batch list response', batchlistResponse); this.batchlist = batchlistResponse.data; console.log('this.batchList', this.batchlist); + + if (this.batchlist.length > 0) { this.openSelectBatchDialog( selectedItem, this.batchlist, editIndex, editableItem, ); + } else { + this.confirmationService.alert( + this.currentLanguageSet.inventory.noBatchavailableforthisItem, + ); + } } }); } diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css index e055ece..ce77773 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css @@ -72,4 +72,7 @@ legend { .width20 { width: 20%; } +.alignCenter { + justify-content: center; +} diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html index e78404f..541aa37 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -18,8 +18,8 @@ {{ prescriptionForm.value.consultantName }} -
- +
+ {{ currentLanguageSet?.inventory?.noMedicalitemstoDisptach }}
diff --git a/src/assets/English.json b/src/assets/English.json index fc07eb5..cfa87e7 100644 --- a/src/assets/English.json +++ b/src/assets/English.json @@ -191,7 +191,7 @@ "prescriptionID": "Prescription ID", "visitCode": "Visit Code", "consultantName": "Consultant Name", - "noMedicalitemstoDisptach": "No Medical items to Disptach", + "noMedicalitemstoDisptach": "No Medical items to Dispatch", "form": "Form", "duration": "Duration", "frequency": "Frequency", From 48b7c586fa2e92f8f2f7b612c82121f5e0791427 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Tue, 1 Oct 2024 17:18:48 +0530 Subject: [PATCH 25/80] Removed extra slash from allocateStockFromItemID API URL --- .../app-modules/rx/shared/service/prescribed-drug.service.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts index 0d9bdec..808805a 100644 --- a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts +++ b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts @@ -70,10 +70,7 @@ export class PrescribedDrugService { } allocateBatches(list: any, facilityID: any) { - return this.http.post( - `${environment.allocateBatchStockUrl}/${facilityID}`, - list, - ); + return this.http.post(environment.allocateBatchStockUrl + facilityID, list); } saveStockExit(dispensingItem: any) { From f9ca2439b25b27404fcf73d2e3accbaf2ff7e5fe Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Thu, 3 Oct 2024 11:27:34 +0530 Subject: [PATCH 26/80] Corrected indedation --- .../manual-indent-dispense.component.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts index a44c9b9..231089a 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts @@ -136,12 +136,12 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { console.log('this.batchList', this.batchlist); if (this.batchlist.length > 0) { - this.openSelectBatchDialog( - selectedItem, - this.batchlist, - editIndex, - editableItem, - ); + this.openSelectBatchDialog( + selectedItem, + this.batchlist, + editIndex, + editableItem, + ); } else { this.confirmationService.alert( this.currentLanguageSet.inventory.noBatchavailableforthisItem, From 44125f5d4590fad7480d1b6588a554e7168396f8 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Wed, 9 Oct 2024 16:47:49 +0530 Subject: [PATCH 27/80] Set security question changes --- .../set-security-questions.component.html | 406 +++++++++--------- 1 file changed, 198 insertions(+), 208 deletions(-) diff --git a/src/app/set-security-questions/set-security-questions.component.html b/src/app/set-security-questions/set-security-questions.component.html index 7661c88..533ccbd 100644 --- a/src/app/set-security-questions/set-security-questions.component.html +++ b/src/app/set-security-questions/set-security-questions.component.html @@ -1,226 +1,216 @@ - - - - -
- Logo -
-
-

Account Support

-
- Follow the steps to change/reset the password -
-
-
- -
- -
- - Question 1 - + + +
+ Logo +
+
+

Account Support

+
+ Follow the steps to change/reset the password +
+
+
+ +
+ + + + + {{ question.Question }} + + + +
+ + + +
+ +
+ + + - - {{ question.Question }} - - - - -
-
- - Answer 1 - - -
- -
-
- - Question 2 - + + +
+ + + +
+ +
+ + + - - {{ question.Question }} - - - - -
-
- - Answer 2 - - -
- -
-
- - Question 3 - - + + +
+ + + +
+ +
+
+ +
+
+
+ +
+
+
+ + + + - - {{ question.Question }} - - -
-
- - Answer 3 - - -
- + +
+
+ + + + + +
- -
-
-
- - New Password - - - - -
-
- - Confirm Password - - - - -
-
-
- -
-
-
- - - - - + + + +
From 570b24acb6c67e5cf0942b1b9e84717a164f94ce Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Thu, 10 Oct 2024 09:19:39 +0530 Subject: [PATCH 28/80] Manual dispense related changes --- .../rx-batch-view/rx-batch-view.component.ts | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts index 586957f..a28f059 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts @@ -118,10 +118,35 @@ export class RxBatchViewComponent implements OnInit, DoCheck { item.expiryDate = newExpDate; }); console.log('formItems2', formItems.value); + + const finalBatchItemDetails: BatchItemDetail[] = []; + formItems.controls.forEach((control: any) => { + const { + batchNo, + expiresIn, + expiryDate, + itemStockEntryID, + quantity, + quantityInHand, + selection, + } = control.value; + + const batchItemDetails: BatchItemDetail = { + batchNo, + expiresIn, + expiryDate, + itemStockEntryID, + quantity, + quantityInHand, + selection, + }; + batchItemDetails.selection = control.controls.selection.value; + finalBatchItemDetails.push(batchItemDetails); + }); this.dialogRef.close({ - selectionBatchList: formItems.value, - batchList: formItems.value.filter( - (item: any) => item.selection === true, + selectionBatchList: finalBatchItemDetails, + batchList: finalBatchItemDetails.filter( + (item) => item.selection === true, ), dispensed: this.dispensed > 0 ? this.dispensed : null, }); @@ -201,5 +226,15 @@ export class RxBatchViewComponent implements OnInit, DoCheck { } return getRxBatch instanceof FormArray ? getRxBatch.controls : null; } - // -----End------ + // -----End------ +} + +interface BatchItemDetail { + batchNo: string | null; + expiresIn: number | null; + expiryDate: Date | null; + itemStockEntryID: number | null; + quantity: number | null; + quantityInHand: number | null; + selection?: boolean; } From 8cb553a1062f3e6c1f366f6fbea9bbd9416ae7d4 Mon Sep 17 00:00:00 2001 From: devikasuresh20 <57424483+devikasuresh20@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:38:33 +0530 Subject: [PATCH 29/80] AMM-1012 Set Questionnaire screen changes (#37) * Set security question changes * Manual dispense related changes --- .../rx-batch-view/rx-batch-view.component.ts | 43 +- .../set-security-questions.component.html | 406 +++++++++--------- 2 files changed, 237 insertions(+), 212 deletions(-) diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts index 586957f..a28f059 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts @@ -118,10 +118,35 @@ export class RxBatchViewComponent implements OnInit, DoCheck { item.expiryDate = newExpDate; }); console.log('formItems2', formItems.value); + + const finalBatchItemDetails: BatchItemDetail[] = []; + formItems.controls.forEach((control: any) => { + const { + batchNo, + expiresIn, + expiryDate, + itemStockEntryID, + quantity, + quantityInHand, + selection, + } = control.value; + + const batchItemDetails: BatchItemDetail = { + batchNo, + expiresIn, + expiryDate, + itemStockEntryID, + quantity, + quantityInHand, + selection, + }; + batchItemDetails.selection = control.controls.selection.value; + finalBatchItemDetails.push(batchItemDetails); + }); this.dialogRef.close({ - selectionBatchList: formItems.value, - batchList: formItems.value.filter( - (item: any) => item.selection === true, + selectionBatchList: finalBatchItemDetails, + batchList: finalBatchItemDetails.filter( + (item) => item.selection === true, ), dispensed: this.dispensed > 0 ? this.dispensed : null, }); @@ -201,5 +226,15 @@ export class RxBatchViewComponent implements OnInit, DoCheck { } return getRxBatch instanceof FormArray ? getRxBatch.controls : null; } - // -----End------ + // -----End------ +} + +interface BatchItemDetail { + batchNo: string | null; + expiresIn: number | null; + expiryDate: Date | null; + itemStockEntryID: number | null; + quantity: number | null; + quantityInHand: number | null; + selection?: boolean; } diff --git a/src/app/set-security-questions/set-security-questions.component.html b/src/app/set-security-questions/set-security-questions.component.html index 7661c88..533ccbd 100644 --- a/src/app/set-security-questions/set-security-questions.component.html +++ b/src/app/set-security-questions/set-security-questions.component.html @@ -1,226 +1,216 @@ - - - - -
- Logo -
-
-

Account Support

-
- Follow the steps to change/reset the password -
-
-
- -
-
-
- - Question 1 - + + +
+ Logo +
+
+

Account Support

+
+ Follow the steps to change/reset the password +
+
+
+ +
+ + + + + {{ question.Question }} + + + +
+ + + +
+ +
+ + + - - {{ question.Question }} - - - - -
-
- - Answer 1 - - -
- -
-
- - Question 2 - + + +
+ + + +
+ +
+ + + - - {{ question.Question }} - - - - -
-
- - Answer 2 - - -
- -
-
- - Question 3 - - + + +
+ + + +
+ +
+
+ +
+
+
+ +
+
+
+ + + + - - {{ question.Question }} - - -
-
- - Answer 3 - - -
- + +
+
+ + + + + +
- -
-
-
- - New Password - - - - -
-
- - Confirm Password - - - - -
-
-
- -
-
-
- - - - - + + + +
From 178a52b1ffbac661d924236ee859e894e268cdef Mon Sep 17 00:00:00 2001 From: Soham Gupta Date: Fri, 25 Oct 2024 23:31:38 +0530 Subject: [PATCH 30/80] Add ESLint and NPM Audit workflow --- .github/workflows/lint_audit.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/workflows/lint_audit.yml diff --git a/.github/workflows/lint_audit.yml b/.github/workflows/lint_audit.yml new file mode 100644 index 0000000..43a64ce --- /dev/null +++ b/.github/workflows/lint_audit.yml @@ -0,0 +1,11 @@ +name: ESLint and NPM Audit + +on: + push: + branches: [main, master, develop] + pull_request: + branches: [main, master, develop] + +jobs: + lint-and-audit: + uses: PSMRI/.github/.github/workflows/lint_audit.yml@main From 722b863765994d9352ca2ca8ca9804a8076fc509 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Thu, 21 Nov 2024 12:23:43 +0530 Subject: [PATCH 31/80] Added serviceProviderId in local storage --- src/app/redir-in/redir-in.component.ts | 32 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index 6434331..528cdb7 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -283,15 +283,29 @@ export class RedirInComponent implements OnInit { 'providerServiceID', serviceData.providerServiceMapID, ); - localStorage.setItem( - 'services', - JSON.stringify({ - serviceID: - serviceData.roles[0].serviceRoleScreenMappings[0] - .providerServiceMapping.serviceID, - serviceName: serviceData.serviceName, - }), - ); + const services: any = []; + loginDataResponse.previlegeObj.map((item: any) => { + if ( + item.roles[0].serviceRoleScreenMappings[0].providerServiceMapping + .serviceID === 9 + ) { + const service = { + providerServiceID: item.serviceID, + serviceName: item.serviceName, + apimanClientKey: item.apimanClientKey, + serviceID: + item.roles[0].serviceRoleScreenMappings[0] + .providerServiceMapping.serviceID, + serviceProviderID: + item.roles[0].serviceRoleScreenMappings[0] + .providerServiceMapping.serviceProviderID, + }; + services.push(service); + } + }); + if (services.length > 0) { + localStorage.setItem('services', JSON.stringify(services)); + } this.getFacility(); } else { this.deleteParentSessioning(); From 2a6f7b0673eab4dc1ae38fb6bd26835eed2ca536 Mon Sep 17 00:00:00 2001 From: Devika S <57424483+devikasuresh20@users.noreply.github.com> Date: Thu, 21 Nov 2024 12:49:15 +0530 Subject: [PATCH 32/80] AMM-880 serviceProviderId changes in redir-in component (#49) * Set security question changes * Manual dispense related changes * Added serviceProviderId in local storage --- src/app/redir-in/redir-in.component.ts | 32 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index 6434331..528cdb7 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -283,15 +283,29 @@ export class RedirInComponent implements OnInit { 'providerServiceID', serviceData.providerServiceMapID, ); - localStorage.setItem( - 'services', - JSON.stringify({ - serviceID: - serviceData.roles[0].serviceRoleScreenMappings[0] - .providerServiceMapping.serviceID, - serviceName: serviceData.serviceName, - }), - ); + const services: any = []; + loginDataResponse.previlegeObj.map((item: any) => { + if ( + item.roles[0].serviceRoleScreenMappings[0].providerServiceMapping + .serviceID === 9 + ) { + const service = { + providerServiceID: item.serviceID, + serviceName: item.serviceName, + apimanClientKey: item.apimanClientKey, + serviceID: + item.roles[0].serviceRoleScreenMappings[0] + .providerServiceMapping.serviceID, + serviceProviderID: + item.roles[0].serviceRoleScreenMappings[0] + .providerServiceMapping.serviceProviderID, + }; + services.push(service); + } + }); + if (services.length > 0) { + localStorage.setItem('services', JSON.stringify(services)); + } this.getFacility(); } else { this.deleteParentSessioning(); From fad42e0a7c470f7864e072f341502787eb26768c Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Sat, 30 Nov 2024 10:56:48 +0530 Subject: [PATCH 33/80] hwc inventory wasa first commit --- .gitignore | 1 + package-lock.json | 13935 +++++++++++++++- package.json | 3 + .../app-header/app-header.component.ts | 58 +- .../batch-adjustment.component.ts | 2 +- .../beneficiary-details.component.ts | 10 +- .../rx-batch-view/rx-batch-view.component.ts | 43 +- .../components/search/search.component.ts | 8 +- .../app-modules/core/services/auth.service.ts | 4 + .../core/services/batch-search.service.ts | 16 +- .../core/services/http-interceptor.service.ts | 5 +- .../core/services/item-search.service.ts | 14 +- .../services/session-storage.service.spec.ts | 16 + src/app/app.component.spec.ts | 6 +- src/app/app.module.ts | 2 + 15 files changed, 13597 insertions(+), 526 deletions(-) create mode 100644 src/app/app-modules/core/services/session-storage.service.spec.ts diff --git a/.gitignore b/.gitignore index 0711527..1d6e8df 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /tmp /out-tsc /bazel-out +/environments/enckey.ts # Node /node_modules diff --git a/package-lock.json b/package-lock.json index 837df7b..6f162a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,9 @@ "crypto-js": "^4.2.0", "exceljs": "^4.4.0", "file-saver": "^2.0.5", + "hwc-inventory-ui": "file:", + "ng-cryptostore": "^16.0.0", + "ngx-cookie-service": "^18.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -4557,6 +4560,16 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -9793,6 +9806,10 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/hwc-inventory-ui": { + "resolved": "", + "link": true + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -12541,6 +12558,31 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/ng-cryptostore": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ng-cryptostore/-/ng-cryptostore-16.0.0.tgz", + "integrity": "sha512-V4ZyzYgy6hAZIjNUZmPUraD11+8+c4c0DzYYvwBmj6Lf7GTgatrQveueHV1cCBwv1MMmI6x75n55H6+7JvLz2g==", + "dependencies": { + "crypto-js": "^4.2.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "*", + "@angular/core": "*" + } + }, + "node_modules/ngx-cookie-service": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", + "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "peerDependencies": { + "@angular/common": "^18.0.0-rc.0", + "@angular/core": "^18.0.0-rc.0" + } + }, "node_modules/nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -18348,7 +18390,8 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true + "dev": true, + "requires": {} }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -20433,7 +20476,8 @@ "version": "16.2.14", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", - "dev": true + "dev": true, + "requires": {} }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -20732,6 +20776,12 @@ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true + }, "@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -21262,7 +21312,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true + "dev": true, + "requires": {} }, "@webassemblyjs/ast": { "version": "1.12.1", @@ -21568,13 +21619,15 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -22096,7 +22149,8 @@ "bootstrap": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==" + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -23334,7 +23388,8 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -23703,7 +23758,8 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-prettier": { "version": "5.1.3", @@ -24709,456 +24765,13422 @@ "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", - "dev": true, + "hwc-inventory-ui": { + "version": "file:", "requires": { - "minimatch": "^9.0.0" + "@angular-devkit/build-angular": "^16.2.10", + "@angular-eslint/builder": "16.3.1", + "@angular-eslint/eslint-plugin": "16.3.1", + "@angular-eslint/eslint-plugin-template": "16.3.1", + "@angular-eslint/schematics": "16.3.1", + "@angular-eslint/template-parser": "16.3.1", + "@angular/animations": "^16.2.0", + "@angular/cdk": "^16.2.12", + "@angular/cli": "^16.2.10", + "@angular/common": "^16.2.0", + "@angular/compiler": "^16.2.0", + "@angular/compiler-cli": "^16.2.0", + "@angular/core": "^16.2.0", + "@angular/forms": "^16.2.0", + "@angular/material": "^16.2.12", + "@angular/platform-browser": "^16.2.0", + "@angular/platform-browser-dynamic": "^16.2.0", + "@angular/router": "^16.2.0", + "@types/crypto-js": "^4.2.2", + "@types/file-saver": "^2.0.7", + "@types/jasmine": "~4.3.0", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "angular": "^1.6.10", + "angular-moment": "^1.3.0", + "bootstrap": "^5.3.2", + "crypto-js": "^4.2.0", + "eslint": "^8.51.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "exceljs": "^4.4.0", + "file-saver": "^2.0.5", + "husky": "^9.0.11", + "hwc-inventory-ui": "file:", + "jasmine-core": "~4.6.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "lint-staged": "^15.2.2", + "ng-cryptostore": "^16.0.0", + "ngx-cookie-service": "^18.0.0", + "prettier": "^3.2.5", + "prettier-eslint": "^16.3.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "typescript": "~5.1.3", + "zone.js": "~0.13.0" }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "@angular-devkit/architect": { + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "@angular-devkit/core": "16.2.14", + "rxjs": "7.8.1" } - } - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + }, + "@angular-devkit/build-angular": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", + "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/build-webpack": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "16.2.14", + "@vitejs/plugin-basic-ssl": "1.0.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild": "0.18.17", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.19.2", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.6.1", + "vite": "4.5.3", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", + "webpack-subresource-integrity": "5.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + } } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "@angular-devkit/build-webpack": { + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", + "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@angular-devkit/architect": "0.1602.14", + "rxjs": "7.8.1" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "@angular-devkit/core": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "requires": { - "color-name": "~1.1.4" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "@angular-devkit/schematics": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.14.tgz", + "integrity": "sha512-B6LQKInCT8w5zx5Pbroext5eFFRTCJdTwHN8GhcVS8IeKCnkeqVTQLjB4lBUg7LEm8Y7UHXwzrVxmk+f+MBXhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "16.2.14", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", + "ora": "5.4.1", + "rxjs": "7.8.1" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "@angular-eslint/builder": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", + "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", + "dev": true, + "requires": { + "@nx/devkit": "16.5.1", + "nx": "16.5.1" + } + }, + "@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "@angular-eslint/eslint-plugin": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", + "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/utils": "5.62.0" } - } - } - }, - "ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - } - } - }, - "ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "@angular-eslint/eslint-plugin-template": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", + "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + }, + "@angular-eslint/schematics": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.3.1.tgz", + "integrity": "sha512-cqrdobdtRY2XjLa6PhuGOQ7UhTRk2AvWS01sKeGjZ94nQJm5NUtEUyf6u3deIPYllW7gSAWjYzKUObKcTW/R+g==", + "dev": true, + "requires": { + "@angular-eslint/eslint-plugin": "16.3.1", + "@angular-eslint/eslint-plugin-template": "16.3.1", + "@nx/devkit": "16.5.1", + "ignore": "5.2.4", + "nx": "16.5.1", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + } + }, + "@angular-eslint/template-parser": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-16.3.1.tgz", + "integrity": "sha512-9+SxUtxB2iOnm0ldS2ow0stMxe02rB/TxeMIe8fxsLFHZdw8RQvs/p3HLvVHXzv6gUblMHebIb/ubUmwEVb2SA==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "eslint-scope": "^7.0.0" + } + }, + "@angular-eslint/utils": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", + "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@typescript-eslint/utils": "5.62.0" + } + }, + "@angular/animations": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cdk": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", + "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", + "requires": { + "parse5": "^7.1.2", + "tslib": "^2.3.0" + } + }, + "@angular/cli": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.14.tgz", + "integrity": "sha512-0y71jtitigVolm4Rim1b8xPQ+B22cGp4Spef2Wunpqj67UowN6tsZaVuWBEQh4u5xauX8LAHKqsvy37ZPWCc4A==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "@schematics/angular": "16.2.14", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + } + }, + "@angular/common": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler-cli": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", + "dev": true, + "requires": { + "@babel/core": "7.23.2", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "dependencies": { + "@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "dev": true, + "requires": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + }, + "@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + } + } + } + }, + "@angular/core": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/forms": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/material": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.14.tgz", + "integrity": "sha512-zQIxUb23elPfiIvddqkIDYqQhAHa9ZwMblfbv+ug8bxr4D0Dw360jIarxCgMjAcLj7Ccl3GBqZMUnVeM6cjthw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/auto-init": "15.0.0-canary.bc9ae6c9c.0", + "@material/banner": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/card": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/chips": "15.0.0-canary.bc9ae6c9c.0", + "@material/circular-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/data-table": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dialog": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/drawer": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/fab": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/form-field": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/image-list": "15.0.0-canary.bc9ae6c9c.0", + "@material/layout-grid": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/radio": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/segmented-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/slider": "15.0.0-canary.bc9ae6c9c.0", + "@material/snackbar": "15.0.0-canary.bc9ae6c9c.0", + "@material/switch": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/textfield": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tooltip": "15.0.0-canary.bc9ae6c9c.0", + "@material/top-app-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/router": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true + }, + "@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + } + }, + "@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + } + } + } + }, + "@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "dev": true, + "requires": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + } + } + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + } + }, + "@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "dev": true, + "requires": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + } + } + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "@material/animation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/auto-init": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/banner": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/base": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw==", + "requires": { + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/card": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA==", + "requires": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/checkbox": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/chips": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "@material/circular-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/data-table": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/density": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/dialog": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/dom": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/drawer": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/elevation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/fab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/feature-targeting": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/floating-label": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/focus-ring": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w==", + "requires": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "@material/form-field": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/icon-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/image-list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/layout-grid": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/line-ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/linear-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/menu": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/menu-surface": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/notched-outline": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/progress-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/radio": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/rtl": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw==", + "requires": { + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/segmented-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/select": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/shape": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/slider": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/snackbar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/switch": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "@material/tab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-scroller": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/textfield": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/theme": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tokens": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q==", + "requires": { + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "@material/tooltip": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "@material/top-app-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/touch-target": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/typography": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@ngtools/webpack": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", + "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", + "dev": true, + "requires": {} + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "requires": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "requires": { + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "requires": { + "@nx/devkit": "16.5.1" + } + }, + "@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "requires": { + "nx": "16.5.1" + } + }, + "@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "requires": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "dev": true, + "optional": true + }, + "@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "dev": true, + "optional": true + }, + "@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "dev": true, + "optional": true + }, + "@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true + }, + "@schematics/angular": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", + "integrity": "sha512-YqIv727l9Qze8/OL6H9mBHc2jVXzAGRNBYnxYWqWhLbfvuVbbldo6NNIIjgv6lrl2LJSdPAAMNOD5m/f6210ug==", + "dev": true, + "requires": { + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "jsonc-parser": "3.2.0" + } + }, + "@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0" + } + }, + "@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true + }, + "@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + } + } + }, + "@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@socket.io/component-emitter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz", + "integrity": "sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==", + "dev": true + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true + }, + "@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "requires": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true + }, + "@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.6.tgz", + "integrity": "sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "requires": {} + }, + "@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } + } + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "angular": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz", + "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==" + }, + "angular-moment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz", + "integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==", + "requires": { + "moment": ">=2.8.0 <3.0.0" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "requires": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + } + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "requires": {} + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + }, + "builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "core-js-compat": { + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "dev": true, + "requires": { + "browserslist": "^4.23.0" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "requires": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "critters": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", + "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "dev": true + }, + "esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "esbuild-wasm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "dev": true + }, + "escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "exceljs": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + } + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "requires": { + "@wessberg/ts-evaluator": "0.0.27" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "requires": { + "minimatch": "^9.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + } + } + }, + "ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "karma": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "requires": { + "jasmine-core": "^4.1.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "requires": {} + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, + "launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true + }, + "lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true + }, + "lint-staged": { + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", + "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "dev": true, + "requires": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + } + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, + "listr2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", + "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "dev": true, + "requires": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + } + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "dev": true, + "requires": { + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "requires": { + "get-east-asian-width": "^1.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + } + }, + "string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + } + } + }, + "log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + } + }, + "loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "dev": true + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "ng-cryptostore": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ng-cryptostore/-/ng-cryptostore-16.0.0.tgz", + "integrity": "sha512-V4ZyzYgy6hAZIjNUZmPUraD11+8+c4c0DzYYvwBmj6Lf7GTgatrQveueHV1cCBwv1MMmI6x75n55H6+7JvLz2g==", + "requires": { + "crypto-js": "^4.2.0", + "tslib": "^2.3.0" + } + }, + "ngx-cookie-service": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", + "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + } + }, + "node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dev": true + }, + "node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^3.0.0" + } + }, + "npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "requires": { + "ignore-walk": "^6.0.0" + } + }, + "npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "requires": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + } + }, + "npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "requires": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + } + } + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", + "dev": true + }, + "nx": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "dev": true, + "requires": { + "@nrwl/tao": "16.5.1", + "@nx/nx-darwin-arm64": "16.5.1", + "@nx/nx-darwin-x64": "16.5.1", + "@nx/nx-freebsd-x64": "16.5.1", + "@nx/nx-linux-arm-gnueabihf": "16.5.1", + "@nx/nx-linux-arm64-gnu": "16.5.1", + "@nx/nx-linux-arm64-musl": "16.5.1", + "@nx/nx-linux-x64-gnu": "16.5.1", + "@nx/nx-linux-x64-musl": "16.5.1", + "@nx/nx-win32-arm64-msvc": "16.5.1", + "@nx/nx-win32-x64-msvc": "16.5.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true + }, + "object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "requires": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "dependencies": { + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + } + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "requires": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + } + }, + "parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "requires": { + "parse5": "^7.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.1.tgz", + "integrity": "sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==", + "dev": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "piscina": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + }, + "dependencies": { + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-loader": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "dev": true, + "requires": { + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", + "semver": "^7.3.8" + } + }, + "postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true + }, + "prettier-eslint": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", + "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + }, + "dependencies": { + "@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true + } + } + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", + "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", + "dev": true + }, + "read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "requires": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + } + }, + "json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + } + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, + "sass": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "requires": { + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "requires": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "dev": true, + "requires": { + "debug": "~4.3.4", + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "requires": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true + }, + "source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + }, + "streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "terser": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", + "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "requires": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "requires": { + "unique-slug": "^4.0.0" + } + }, + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true + }, + "vue-eslint-parser": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", + "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "dependencies": { + "webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "requires": {} + } + } + }, + "webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "requires": { + "typed-assert": "^1.0.8" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "requires": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "requires": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + } + } + }, + "zone.js": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", + "requires": { + "tslib": "^2.3.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "requires": { + "minimatch": "^9.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + } + } + }, + "ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { @@ -25550,7 +38572,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true + "dev": true, + "requires": {} }, "karma-source-map-support": { "version": "1.4.0", @@ -26787,6 +39810,23 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "ng-cryptostore": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ng-cryptostore/-/ng-cryptostore-16.0.0.tgz", + "integrity": "sha512-V4ZyzYgy6hAZIjNUZmPUraD11+8+c4c0DzYYvwBmj6Lf7GTgatrQveueHV1cCBwv1MMmI6x75n55H6+7JvLz2g==", + "requires": { + "crypto-js": "^4.2.0", + "tslib": "^2.3.0" + } + }, + "ngx-cookie-service": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", + "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "requires": { + "tslib": "^2.6.2" + } + }, "nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -27727,7 +40767,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.5", @@ -28873,7 +41914,8 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -29349,13 +42391,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "requires": {} }, "commander": { "version": "2.20.3", @@ -29496,7 +42533,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true + "dev": true, + "requires": {} }, "tsconfig-paths": { "version": "4.2.0", @@ -29966,23 +43004,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -30087,7 +43110,8 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -30266,7 +43290,8 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "3.0.0", diff --git a/package.json b/package.json index 68306c0..820879d 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,9 @@ "crypto-js": "^4.2.0", "exceljs": "^4.4.0", "file-saver": "^2.0.5", + "hwc-inventory-ui": "file:", + "ng-cryptostore": "^16.0.0", + "ngx-cookie-service": "^18.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" diff --git a/src/app/app-modules/core/components/app-header/app-header.component.ts b/src/app/app-modules/core/components/app-header/app-header.component.ts index da918f4..90e016b 100644 --- a/src/app/app-modules/core/components/app-header/app-header.component.ts +++ b/src/app/app-modules/core/components/app-header/app-header.component.ts @@ -19,6 +19,8 @@ import { LanguageService } from "../../services/language.service"; import { MatDialog } from "@angular/material/dialog"; import { environment } from "src/environments/environment"; import { ShowCommitAndVersionDetailsComponent } from "../show-commit-and-version-details/show-commit-and-version-details.component"; +import { CookieService } from 'ngx-cookie-service'; +import { SessionStorageService } from "../../services/session-storage.service"; @Component({ selector: "app-header", templateUrl: "./app-header.component.html", @@ -41,7 +43,7 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke filteredNavigation: any; roles: any; parent_app: any; - parent_url = sessionStorage.getItem("return"); + parent_url = this.sessionstorage.getItem("return"); reportsList:any = []; languageArray: any; language_file_path: any = "./assets/"; @@ -55,24 +57,29 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke private auth: AuthService, private dialog: MatDialog, private http_service: LanguageService, - private confirmationService: ConfirmationService + private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, + private cookieService: CookieService, ) {} license: any; ngOnInit() { // this.changeLanguage(this.language); this.getUIVersionAndCommitDetails(); // this.servicePoint = localStorage.getItem('servicePointName'); - const userName = localStorage.getItem('userName'); + // const userName = localStorage.getItem('userName'); + const userName = this.sessionstorage.userName; if (userName != null) { this.userName = userName; } - const designation = localStorage.getItem('designation'); + // const designation = localStorage.getItem('designation'); + const designation = this.sessionstorage.getItem('designation'); if (designation != null) { this.designation = designation; } - this.isExternal = sessionStorage.getItem('isExternal') == 'true'; - this.parent_app = sessionStorage.getItem('host'); - const providerServiceID = localStorage.getItem('providerServiceID'); + this.isExternal = this.sessionstorage.getItem('isExternal') == 'true'; + this.parent_app = this.sessionstorage.getItem('host'); + // const providerServiceID = localStorage.getItem('providerServiceID'); + const providerServiceID = this.sessionstorage.providerServiceID; if (providerServiceID != null) { this.providerServiceID = providerServiceID; } @@ -100,6 +107,7 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke // } if (this.isAuthenticated) { this.fetchLanguageSet(); + this.refreshLogin(); } } @@ -111,6 +119,29 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke } } + refreshLogin(){ + this.auth.getUserDetails().subscribe((res: any) => { + // console.log(">>>>>>", res); + if (res.statusCode == '200') { + if (res.data.previlegeObj && res.data.previlegeObj[0]) { + this.cookieService.set('Jwttoken', res.data.Jwttoken); + delete res.data.Jwttoken; + this.sessionstorage.setItem('loginDataResponse', JSON.stringify(res.data)); + if(res.data && res.data.key){ + sessionStorage.setItem('key', res.data.key); + } + + // sessionStorage.setItem('designation', this.designation); + this.sessionstorage.userID=res.data.userID; + this.sessionstorage.userName=res.data.userName; + this.sessionstorage.username=res.data.userName; + } else { + this.confirmationService.alert('Seems you are logged in from somewhere else, Logout from there & try back in.', 'error'); + } + } + }); + } + fetchLanguageSet() { this.http_service.fetchLanguageSet().subscribe((languageRes: any) => { if (languageRes && Array.isArray(languageRes.data)) { @@ -121,8 +152,8 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke } getLanguage() { - if (localStorage.getItem('currentLanguage') != null) { - this.changeLanguage(localStorage.getItem('currentLanguage')); + if (sessionStorage.getItem('currentLanguage') != null) { + this.changeLanguage(sessionStorage.getItem('currentLanguage')); } else { this.changeLanguage(this.language); } @@ -154,7 +185,8 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke } if (response[language] != undefined) { this.currentLanguageSet = response[language]; - localStorage.setItem('currentLanguage', language); + // localStorage.setItem('currentLanguage', language); + sessionStorage.setItem('currentLanguage', language); if (this.currentLanguageSet) { this.languageArray.forEach((item: any) => { if (item.languageName == language) { @@ -238,8 +270,10 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke ngOnChanges() { - const facility = localStorage.getItem('facilityDetail'); - if (facility != null) { + const facility = this.sessionstorage.getItem('facilityDetail'); + console.log(">>>sessionStorage", facility); + + if (facility) { this.facility = JSON.parse(facility); } if (this.facility) { diff --git a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts index 1bd77d4..05a2c0c 100644 --- a/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts +++ b/src/app/app-modules/core/components/batch-adjustment/batch-adjustment.component.ts @@ -49,7 +49,7 @@ export class BatchAdjustmentComponent implements OnInit, DoCheck { constructor( @Inject(MAT_DIALOG_DATA) public input: any, private confirmationService: ConfirmationService, - public dialogRef: MatDialogRef, + public dialogRef: MatDialogRef, public http_service: LanguageService, private batchSearchService: BatchSearchService, ) {} diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts index 31a2c22..9a5862f 100644 --- a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts @@ -26,6 +26,7 @@ import { BeneficiaryDetailsService } from '../../services/beneficiary-details.se import { LanguageService } from '../../services/language.service'; import { SetLanguageComponent } from '../set-language.component'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-beneficiary-details', @@ -45,15 +46,18 @@ export class BeneficiaryDetailsComponent implements OnInit, DoCheck, OnDestroy { private router: Router, private route: ActivatedRoute, private http_service: LanguageService, - private beneficiaryDetailsService: BeneficiaryDetailsService, + private beneficiaryDetailsService: BeneficiaryDetailsService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { this.today = new Date(); - const healthIDValue: any = localStorage.getItem('healthID'); + //const healthIDValue: any = localStorage.getItem('healthID'); + const healthIDValue: any = this.sessionstorage.healthID; this.healthIDValue = healthIDValue; this.route.params.subscribe((param) => { - const benFlowId: any = localStorage.getItem('benFlowID'); + // const benFlowId: any = localStorage.getItem('benFlowID'); + const benFlowId: any = this.sessionstorage.benFlowID; this.beneficiaryDetailsService.getBeneficiaryDetails( param['beneficiaryRegID'], benFlowId, diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts index a28f059..586957f 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts @@ -118,35 +118,10 @@ export class RxBatchViewComponent implements OnInit, DoCheck { item.expiryDate = newExpDate; }); console.log('formItems2', formItems.value); - - const finalBatchItemDetails: BatchItemDetail[] = []; - formItems.controls.forEach((control: any) => { - const { - batchNo, - expiresIn, - expiryDate, - itemStockEntryID, - quantity, - quantityInHand, - selection, - } = control.value; - - const batchItemDetails: BatchItemDetail = { - batchNo, - expiresIn, - expiryDate, - itemStockEntryID, - quantity, - quantityInHand, - selection, - }; - batchItemDetails.selection = control.controls.selection.value; - finalBatchItemDetails.push(batchItemDetails); - }); this.dialogRef.close({ - selectionBatchList: finalBatchItemDetails, - batchList: finalBatchItemDetails.filter( - (item) => item.selection === true, + selectionBatchList: formItems.value, + batchList: formItems.value.filter( + (item: any) => item.selection === true, ), dispensed: this.dispensed > 0 ? this.dispensed : null, }); @@ -226,15 +201,5 @@ export class RxBatchViewComponent implements OnInit, DoCheck { } return getRxBatch instanceof FormArray ? getRxBatch.controls : null; } - // -----End------ -} - -interface BatchItemDetail { - batchNo: string | null; - expiresIn: number | null; - expiryDate: Date | null; - itemStockEntryID: number | null; - quantity: number | null; - quantityInHand: number | null; - selection?: boolean; + // -----End------ } diff --git a/src/app/app-modules/core/components/search/search.component.ts b/src/app/app-modules/core/components/search/search.component.ts index 78cad09..92d5b09 100644 --- a/src/app/app-modules/core/components/search/search.component.ts +++ b/src/app/app-modules/core/components/search/search.component.ts @@ -35,6 +35,7 @@ import { environment } from 'src/environments/environment'; import { MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; interface Beneficary { firstName: string; @@ -84,6 +85,7 @@ export class SearchComponent implements OnInit, DoCheck { public http_service: LanguageService, private changeDetectorRef: ChangeDetectorRef, private inventoryService: InventoryService, + public sessionstorage: SessionStorageService ) {} ngOnInit() { @@ -146,7 +148,8 @@ export class SearchComponent implements OnInit, DoCheck { firstName: this.beneficiary.firstName, lastName: this.beneficiary.lastName, genderID: this.beneficiary.gender, - providerServiceMapID: localStorage.getItem('providerServiceID'), + // providerServiceMapID: localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.providerServiceID, i_bendemographics: { stateID: this.beneficiary.stateID, districtID: this.beneficiary.districtID, @@ -221,7 +224,8 @@ export class SearchComponent implements OnInit, DoCheck { if (benID) { this.inventoryService .getBeneficaryVisitDetail({ - providerServiceMapID: localStorage.getItem('providerServiceID'), + // providerServiceMapID: localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.providerServiceID, beneficiaryID: benID, }) .subscribe((res) => { diff --git a/src/app/app-modules/core/services/auth.service.ts b/src/app/app-modules/core/services/auth.service.ts index 42b8655..f7203d7 100644 --- a/src/app/app-modules/core/services/auth.service.ts +++ b/src/app/app-modules/core/services/auth.service.ts @@ -46,5 +46,9 @@ export class AuthService { }); } + getUserDetails() { + return this.http.post(environment.getUserAuth, {}); + } + // /* AN4085822 - Concurrent login issue*/ } diff --git a/src/app/app-modules/core/services/batch-search.service.ts b/src/app/app-modules/core/services/batch-search.service.ts index 25bf298..32e7ff5 100644 --- a/src/app/app-modules/core/services/batch-search.service.ts +++ b/src/app/app-modules/core/services/batch-search.service.ts @@ -20,17 +20,23 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { Injectable, Inject } from '@angular/core'; import { environment } from 'src/environments/environment'; +import { SessionStorageService } from './session-storage.service'; @Injectable() export class BatchSearchService { - constructor(private http: HttpClient) {} + constructor( + private http: HttpClient, + readonly sessionstorage:SessionStorageService + ) { + + } searchItemBatch(searchTerms: string) { const body = { itemName: searchTerms, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID') }; return this.http.post(environment.searchBatchUrl, body); @@ -39,7 +45,7 @@ export class BatchSearchService { searchAdjustmentBatch(searchTerms: string) { const body = { itemName: searchTerms, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; return this.http.post(environment.searchBatchUrl, body); @@ -47,7 +53,7 @@ export class BatchSearchService { searchItem(searchTerm: string) { const reqObj = { itemName: searchTerm, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; return this.http.post(environment.searchItemListUrl, reqObj); } diff --git a/src/app/app-modules/core/services/http-interceptor.service.ts b/src/app/app-modules/core/services/http-interceptor.service.ts index 1d047e1..1903c79 100644 --- a/src/app/app-modules/core/services/http-interceptor.service.ts +++ b/src/app/app-modules/core/services/http-interceptor.service.ts @@ -35,6 +35,7 @@ import { Router } from '@angular/router'; import { throwError } from 'rxjs/internal/observable/throwError'; import { SpinnerService } from './spinner.service'; import { ConfirmationService } from './confirmation.service'; +import { CookieService } from 'ngx-cookie-service'; import { environment } from 'src/environments/environment'; @Injectable({ @@ -48,6 +49,7 @@ export class HttpInterceptorService implements HttpInterceptor { private router: Router, private confirmationService: ConfirmationService, private http: HttpClient, + private cookieService: CookieService, ) {} intercept( @@ -56,9 +58,10 @@ export class HttpInterceptorService implements HttpInterceptor { ): Observable> { const key: any = sessionStorage.getItem('key'); let modifiedReq = null; + const tokn = this.cookieService.get('Jwttoken'); if (key !== undefined && key !== null) { modifiedReq = req.clone({ - headers: req.headers.set('Authorization', key), + headers: req.headers.set('Authorization', key).set('Jwttoken', tokn), }); } else { modifiedReq = req.clone({ diff --git a/src/app/app-modules/core/services/item-search.service.ts b/src/app/app-modules/core/services/item-search.service.ts index b103e79..81db106 100644 --- a/src/app/app-modules/core/services/item-search.service.ts +++ b/src/app/app-modules/core/services/item-search.service.ts @@ -20,16 +20,20 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { Injectable, Inject } from '@angular/core'; import { environment } from 'src/environments/environment'; +import { SessionStorageService } from './session-storage.service'; @Injectable() export class ItemSearchService { - constructor(private http: HttpClient) {} + constructor( + private http: HttpClient, + public sessionstorage:SessionStorageService) { + } searchDrugItem(searchTerms: string) { const body = { itemName: searchTerms, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; return this.http.post(environment.searchItemUrl, body); @@ -38,7 +42,7 @@ export class ItemSearchService { searchDrugItemforTransfer(search: any, facilityTo: any) { const body = { itemName: search, - transferFromFacilityID: localStorage.getItem('facilityID'), + transferFromFacilityID: this.sessionstorage.getItem('facilityID'), transferToFacilityID: facilityTo, }; @@ -48,7 +52,7 @@ export class ItemSearchService { getItemDetailsByName(searchTerms: string) { const searchedItem = { itemName: searchTerms, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; return this.http.post( environment.getItemDetailsByNameUrl, diff --git a/src/app/app-modules/core/services/session-storage.service.spec.ts b/src/app/app-modules/core/services/session-storage.service.spec.ts new file mode 100644 index 0000000..78a1335 --- /dev/null +++ b/src/app/app-modules/core/services/session-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SessionStorageService } from './session-storage.service'; + +describe('SessionStorageService', () => { + let service: SessionStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SessionStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 10365bc..cf801ff 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -14,16 +14,16 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); }); - it(`should have as title 'HWC-Inventory-UI'`, () => { + it(`should have as title 'HWC-Inventory-UI-NEXT'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('HWC-Inventory-UI'); + expect(app.title).toEqual('HWC-Inventory-UI-NEXT'); }); it('should render title', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI app is running!'); + expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI-NEXT app is running!'); }); }); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8586023..cb1a5fb 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -7,6 +7,7 @@ import { AppComponent } from "./app.component"; import { BrowserModule } from "@angular/platform-browser"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { AppRoutingModule } from "./app-routing.module"; +import { CookieService } from 'ngx-cookie-service'; // import { RouteReuseStrategy } from '@angular/router'; // import { CustomRouteReuseStrategy } from './custom-route-reuse-strategy'; @@ -117,6 +118,7 @@ import { AuthService } from "./app-modules/core/services/auth.service"; AuthenticationService, LanguageService, AuthService, + CookieService, HttpInterceptorService, { provide: HTTP_INTERCEPTORS, From a0d36c496cf4e56b8a1ed3c2c8dcae92f728b128 Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Sat, 30 Nov 2024 10:59:08 +0530 Subject: [PATCH 34/80] hwc inventory wasa second commit --- .../core/services/session-storage.service.ts | 43 +++++++++++++++++++ .../indent-order-worklist.component.ts | 6 ++- .../manual-indent-dispense.component.html | 17 +++++++- .../manual-indent-dispense.component.ts | 23 ++++------ ...n-store-indent-order-worklist.component.ts | 8 ++-- .../indent-request.component.ts | 30 +++++++------ ...b-store-indent-order-worklist.component.ts | 4 +- .../manual-medicine-dispense.component.ts | 15 ++++--- .../medicine-dispense.component.ts | 24 ++++++----- .../show-batch-item.component.ts | 13 +++--- ...iew-medicine-dispense-details.component.ts | 4 +- .../view-medicine-dispense.component.ts | 4 +- ...ch-details-for-patient-return.component.ts | 9 ++-- ...atient-return-previous-record.component.ts | 4 +- .../patient-return.component.ts | 4 +- 15 files changed, 145 insertions(+), 63 deletions(-) create mode 100644 src/app/app-modules/core/services/session-storage.service.ts diff --git a/src/app/app-modules/core/services/session-storage.service.ts b/src/app/app-modules/core/services/session-storage.service.ts new file mode 100644 index 0000000..d4732b9 --- /dev/null +++ b/src/app/app-modules/core/services/session-storage.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { environment } from "../../../../environments/environment"; +import { StorageService } from 'ng-cryptostore'; + +@Injectable({ + providedIn: 'root' +}) +export class SessionStorageService { + + userID:any; + userName:any; + username:any; + fullName:any; + facilityID:any; + facilityDetail:any; + benFlowID:any; + healthID:any; + providerServiceID:any; + services:any; + SECRET_KEY = environment.encKey; + + + constructor( + private store:StorageService + ) {} + + setItem(key: string, value: any): void { + this.store.set(key, value, this.SECRET_KEY); + } + + getItem(key: string): any | null { + return this.store.get(key, this.SECRET_KEY); + } + + removeItem(key: string): void { + sessionStorage.removeItem(key); + } + + clear(): void { + sessionStorage.clear(); + } + +} diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts index d4f08cf..f46170d 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts @@ -23,6 +23,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { ConfirmationService } from 'src/app/app-modules/core/services'; import { InventoryService } from '../../shared/service/inventory.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-indent-order-worklist', templateUrl: './indent-order-worklist.component.html', @@ -36,6 +37,7 @@ export class IndentOrderWorklistComponent implements OnInit { private router: Router, private inventoryService: InventoryService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -44,10 +46,10 @@ export class IndentOrderWorklistComponent implements OnInit { showOrderWorklistBasedOnID() { this.isMainStore = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', ).isMainFacility; this.mainFacilityID = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', ).mainFacilityID; if ( !this.isMainStore && diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html index 08ca8d6..b31db16 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html @@ -67,7 +67,19 @@
- + + + + diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts index 246b3b9..dfc4c3d 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts @@ -32,6 +32,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-manual-indent-dispense', @@ -79,6 +80,7 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private confirmationService: ConfirmationService, private activatedRoute: ActivatedRoute, + readonly sessionstorage:SessionStorageService ) {} ngOnInit() { @@ -125,7 +127,7 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { ) { const batchlistObj = { itemID: selectedItem.itemID, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; this.inventoryService .viewBatchlistForIndentItem(batchlistObj) @@ -134,19 +136,12 @@ export class ManualIndentDispenseComponent implements OnInit, DoCheck { console.log('Batch list response', batchlistResponse); this.batchlist = batchlistResponse.data; console.log('this.batchList', this.batchlist); - - if (this.batchlist.length > 0) { - this.openSelectBatchDialog( - selectedItem, - this.batchlist, - editIndex, - editableItem, - ); - } else { - this.confirmationService.alert( - this.currentLanguageSet.inventory.noBatchavailableforthisItem, - ); - } + this.openSelectBatchDialog( + selectedItem, + this.batchlist, + editIndex, + editableItem, + ); } }); } diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts index c6c21fc..1f63464 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts @@ -30,6 +30,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-main-store-indent-order-worklist', @@ -66,11 +67,12 @@ export class MainStoreIndentOrderWorklistComponent implements OnInit, DoCheck { public http_service: LanguageService, private confirmationService: ConfirmationService, private router: Router, + readonly sessionstorage:SessionStorageService ) {} ngOnInit() { this.orderReqObject = { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; this.showMainStoreOrderWorklist(this.orderReqObject); this.navigateToIndentReceipt(); @@ -125,10 +127,10 @@ export class MainStoreIndentOrderWorklistComponent implements OnInit, DoCheck { } navigateToIndentReceipt() { this.isMainStore = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', ).isMainFacility; this.mainFacilityID = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', ).mainFacilityID; if (this.isMainStore && this.mainFacilityID !== undefined) { diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts index c05aecc..66e7f5d 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts @@ -38,6 +38,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { Subscription } from 'rxjs'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-indent-request', @@ -75,6 +76,7 @@ export class IndentRequestComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private confirmationService: ConfirmationService, private dataStorageService: DataStorageService, + readonly sessionstorage:SessionStorageService, ) { this.subs = this.inventoryService .getDialogClosedObservable() @@ -264,17 +266,19 @@ export class IndentRequestComponent implements OnInit, DoCheck { const otherDetails = { refNo: indentRequestForm.value.referenceNumber, reason: indentRequestForm.value.indentReason, - fromFacilityID: localStorage.getItem('facilityID'), + fromFacilityID: this.sessionstorage.getItem('facilityID'), fromFacilityName: JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', ).facilityName, - toFacilityID: JSON.parse(localStorage.getItem('facilityDetail') || '{}') + toFacilityID: JSON.parse(this.sessionstorage.getItem('facilityDetail') || '{}') .mainFacilityID, - createdBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), + // createdBy: localStorage.getItem('username'), + createdBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), - userID: localStorage.getItem('userID'), + //userID: localStorage.getItem('userID'), + useriD: this.sessionstorage.userID }; console.log('otherDetails under submitIndentRequest', otherDetails); @@ -346,17 +350,19 @@ export class IndentRequestComponent implements OnInit, DoCheck { const otherDetails = { refNo: indentRequestForm.value.referenceNumber, reason: indentRequestForm.value.indentReason, - fromFacilityID: localStorage.getItem('facilityID'), + fromFacilityID: this.sessionstorage.getItem('facilityID'), fromFacilityName: JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName, - toFacilityID: JSON.parse(localStorage.getItem('facilityDetail') || '{}') + toFacilityID: JSON.parse(this.sessionstorage.getItem('facilityDetail') || '{}') //localStorage.getItem('facilityDetail') .mainFacilityID, - createdBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), + // createdBy: localStorage.getItem('username'), + createdBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), - userID: localStorage.getItem('userID'), + //userID: localStorage.getItem('userID'), + userID: this.sessionstorage.userID, indentID: this.dataStorageService.indentDetails.indentID, orderDate: this.dataStorageService.indentDetails.orderDate, status: this.dataStorageService.indentDetails.status, diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts index 22976fc..872a145 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts @@ -30,6 +30,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-sub-store-indent-order-worklist', @@ -58,11 +59,12 @@ export class SubStoreIndentOrderWorklistComponent implements OnInit, DoCheck { private router: Router, private confirmationService: ConfirmationService, private dataStorageService: DataStorageService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { this.orderReqObject = { - fromFacilityID: localStorage.getItem('facilityID'), + fromFacilityID: this.sessionstorage.getItem('facilityID'), }; this.showSubstoreOrderWorklist(this.orderReqObject); this.fetchLanguageResponse(); diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts index 2a71d5c..6f908df 100644 --- a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts @@ -41,6 +41,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-manual-medicine-dispense', templateUrl: './manual-medicine-dispense.component.html', @@ -82,7 +83,8 @@ export class ManualMedicineDispenseComponent implements OnInit, DoCheck { public http_service: LanguageService, private confirmationService: ConfirmationService, private dataStorageService: DataStorageService, - private inventoryService: InventoryService, + private inventoryService: InventoryService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -103,9 +105,9 @@ export class ManualMedicineDispenseComponent implements OnInit, DoCheck { ); } getApp() { - console.log(sessionStorage.getItem('host')); - if (sessionStorage.getItem('host')) { - return sessionStorage.getItem('host'); + console.log(this.sessionstorage.getItem('host')); + if (this.sessionstorage.getItem('host')) { + return this.sessionstorage.getItem('host'); } else { return 'STORE'; } @@ -160,7 +162,7 @@ export class ManualMedicineDispenseComponent implements OnInit, DoCheck { getItemBatchList(editIndex: any, formValue: any) { let itemBatchList = []; const requestObjectGetBatchList = { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), itemID: formValue.itemID, }; this.inventoryService.getItemBatchList(requestObjectGetBatchList).subscribe( @@ -256,7 +258,8 @@ export class ManualMedicineDispenseComponent implements OnInit, DoCheck { this.manualDispenseList.data.forEach((dispenseItem: any) => { dispenseItem.batchList.forEach((batch: any) => { const dispensedItem = { - createdBy: localStorage.getItem('userID'), + //createdBy: localStorage.getItem('userID'), + createdBy: sessionStorage['userID'], itemID: batch.batchNo.itemID, itemStockEntryID: batch.batchNo.itemStockEntryID, quantity: batch.quantityOfDispense, diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts index 642fd47..1578276 100644 --- a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts @@ -27,6 +27,7 @@ import { SetLanguageComponent } from '../../core/components/set-language.compone import { LanguageService } from '../../core/services/language.service'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { SearchComponent } from '../../core/components/search/search.component'; +import { SessionStorageService } from '../../core/services/session-storage.service'; @Component({ selector: 'app-medicine-dispense', @@ -48,6 +49,7 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { private inventoryService: InventoryService, public http_service: LanguageService, private dialog: MatDialog, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -79,13 +81,13 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { checkParentVisits() { this.parentBenID = - sessionStorage.getItem('parentBen') === 'undefined' + this.sessionstorage.getItem('parentBen') === 'undefined' ? undefined - : sessionStorage.getItem('parentBen'); + : this.sessionstorage.getItem('parentBen'); this.parentVisitID = - sessionStorage.getItem('parentBenVisit') === 'undefined' + this.sessionstorage.getItem('parentBenVisit') === 'undefined' ? undefined - : sessionStorage.getItem('parentBenVisit'); + : this.sessionstorage.getItem('parentBenVisit'); console.log(this.parentBenID, this.parentVisitID); if (this.parentBenID) { @@ -101,7 +103,7 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { this.inventoryService .getBeneficaryVisitDetail({ - providerServiceMapID: localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), beneficiaryID: this.beneficiaryDetailForm.controls['beneficiaryID'].value, }) @@ -163,7 +165,7 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { ) { this.inventoryService .getBeneficaryVisitDetail({ - providerServiceMapID: localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), beneficiaryID: this.beneficiaryDetailForm.controls['beneficiaryID'].value, }) @@ -245,18 +247,18 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { } getBeneficiaryDetail() { - const facilityDetailfromStorage: any = - localStorage.getItem('facilityDetail'); + const facilityDetailfromStorage: any = this.sessionstorage.getItem('facilityDetail'); // localStorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetailfromStorage); const facilityName = facilityDetail.facilityName; this.beneficaryDetail = { age: this.visitCode.ben_age_val, beneficiaryID: this.beneficiaryID, benRegID: this.beneficiaryVisitDetailList.beneficiaryRegID, - createdBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), + // createdBy: localStorage.getItem('username'), + createdBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), doctorName: this.visitCode.agentId, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), gender: this.visitCode.genderName, issueType: this.medicineDispenseType, patientName: this.visitCode.benName, diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts index 9caf391..516c93d 100644 --- a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts @@ -25,6 +25,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-show-batch-item', @@ -40,7 +41,8 @@ export class ShowBatchItemComponent implements OnInit, DoCheck { private inventoryService: InventoryService, public http_service: LanguageService, @Inject(MAT_DIALOG_DATA) public data: any, - public mdDialogRef: MatDialogRef, + public mdDialogRef: MatDialogRef, + readonly sessionstorage:SessionStorageService, ) {} issuedBatchList = new MatTableDataSource(); beneficaryDetail: any; @@ -56,9 +58,9 @@ export class ShowBatchItemComponent implements OnInit, DoCheck { } getApp() { - console.log(sessionStorage.getItem('host')); - if (sessionStorage.getItem('host')) { - return sessionStorage.getItem('host'); + console.log(this.sessionstorage.getItem('host')); + if (this.sessionstorage.getItem('host')) { + return this.sessionstorage.getItem('host'); } else { return 'STORE'; } @@ -68,7 +70,8 @@ export class ShowBatchItemComponent implements OnInit, DoCheck { this.issuedBatchList.data.forEach((dispenseItem: any) => { dispenseItem.itemBatchList.forEach((batch: any) => { const dispensedItem = { - createdBy: localStorage.getItem('userID'), + //createdBy: localStorage.getItem('userID'), + createdBy: sessionStorage['userID'], itemID: dispenseItem.itemID, itemStockEntryID: batch.itemStockEntryID, quantity: batch.quantity, diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts index 29e8ead..6a0e366 100644 --- a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts @@ -33,6 +33,7 @@ import { MatTableDataSource } from '@angular/material/table'; import * as moment from 'moment'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-medicine-dispense-details', @@ -63,6 +64,7 @@ export class ViewMedicineDispenseDetailsComponent constructor( public dialogRef: MatDialogRef, public http_service: LanguageService, + readonly sessionstorage:SessionStorageService, @Inject(MAT_DIALOG_DATA) public data: any, ) {} @@ -121,7 +123,7 @@ export class ViewMedicineDispenseDetailsComponent } createPrintableData() { - const facilityDetailStrorage: any = localStorage.getItem('facilityDetail'); + const facilityDetailStrorage: any = this.sessionstorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetailStrorage); const facilityName = facilityDetail.facilityName; const printableData: any = []; diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts index 81309b2..76c83d3 100644 --- a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts @@ -30,6 +30,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-medicine-dispense', @@ -59,6 +60,7 @@ export class ViewMedicineDispenseComponent implements OnInit, DoCheck { public http_service: LanguageService, private router: Router, private dataStorageService: DataStorageService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -106,7 +108,7 @@ export class ViewMedicineDispenseComponent implements OnInit, DoCheck { endDate.setMilliseconds(0); return { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), fromDate: new Date( startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, ), diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts index 8e46706..48a0124 100644 --- a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts @@ -45,6 +45,7 @@ import { LanguageService } from 'src/app/app-modules/core/services/language.serv import { PatientReturnBatchDetailsComponent } from '../patient-return-batch-details/patient-return-batch-details.component'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-item-batch-details-for-patient-return', @@ -92,6 +93,7 @@ export class ItemBatchDetailsForPatientReturnComponent private inventoryService: InventoryService, private confirmationService: ConfirmationService, private router: Router, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -125,7 +127,7 @@ export class ItemBatchDetailsForPatientReturnComponent batchReq = { benRegID: this.benRegId, itemID: formvalue.itemID, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; data = this.itemReturnForm.value; console.log('Data if editIndex is null', data); @@ -133,7 +135,7 @@ export class ItemBatchDetailsForPatientReturnComponent batchReq = { benRegID: this.benRegId, itemID: formvalue.itemName.itemID, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; data = formvalue; console.log('Data if editIndex is not null', data); @@ -240,7 +242,8 @@ export class ItemBatchDetailsForPatientReturnComponent this.selectedBatchList.data.forEach((item: any) => { item.batchList.forEach((batch: any) => { const returnQuantity = batch.returnQuantity; - const createdBy = localStorage.getItem('userName'); + // const createdBy = localStorage.getItem('userName'); + const createdBy = this.sessionstorage.userName; const batchNo = Object.assign(batch.batchNo, { returnQuantity, createdBy, diff --git a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts index 0843e01..7e19a52 100644 --- a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts +++ b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts @@ -28,6 +28,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { MatDialog } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-patient-return-previous-record', @@ -52,6 +53,7 @@ export class PatientReturnPreviousRecordComponent implements OnInit, DoCheck { private http_service: LanguageService, private dataStorageService: DataStorageService, private inventoryService: InventoryService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -79,7 +81,7 @@ export class PatientReturnPreviousRecordComponent implements OnInit, DoCheck { } viewRecords() { - const facilityID = localStorage.getItem('facilityID'); + const facilityID = this.sessionstorage.getItem('facilityID'); const startDate: Date = new Date(this.fromDate); startDate.setHours(0); startDate.setMinutes(0); diff --git a/src/app/app-modules/inventory/patient-return/patient-return.component.ts b/src/app/app-modules/inventory/patient-return/patient-return.component.ts index 473d47b..57af0a0 100644 --- a/src/app/app-modules/inventory/patient-return/patient-return.component.ts +++ b/src/app/app-modules/inventory/patient-return/patient-return.component.ts @@ -27,6 +27,7 @@ import { SetLanguageComponent } from '../../core/components/set-language.compone import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from '../../core/services/language.service'; import { BenificiaryDetailsComponent } from './benificiary-details/benificiary-details.component'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-patient-return', @@ -51,6 +52,7 @@ export class PatientReturnComponent implements OnInit, DoCheck { private http_service: LanguageService, private inventoryService: InventoryService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -184,7 +186,7 @@ export class PatientReturnComponent implements OnInit, DoCheck { this.inventoryService .getItemList({ benRegID: beneficiary.beneficiaryRegID, - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }) .subscribe((response) => { console.log(this.itemMasterList); From 4ba22ca11d23fb77f9648807979ac1b2aa145f53 Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Sat, 30 Nov 2024 11:00:54 +0530 Subject: [PATCH 35/80] hwc inventory wasa third commit --- .../e-aushadha/e-aushadha.component.ts | 6 +++-- .../physical-stock-entry.component.ts | 12 ++++++--- .../view-physical-stock.component.ts | 6 +++-- .../consumption-report.component.ts | 6 +++-- .../daily-stock-details-report.component.ts | 6 +++-- .../daily-stock-summary-report.component.ts | 6 +++-- .../inward-stock-report.component.ts | 6 +++-- .../monthly-report.component.ts | 6 +++-- .../yearly-report/yearly-report.component.ts | 6 +++-- .../shared/service/inventory.service.ts | 7 +++--- .../store-self-consumption.component.ts | 9 ++++--- .../store-stock-adjustment.component.ts | 25 +++++++++++-------- 12 files changed, 65 insertions(+), 36 deletions(-) diff --git a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts index 6e62d5a..33d1ebf 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts @@ -5,6 +5,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { ConfirmationService } from 'src/app/app-modules/core/services/confirmation.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-e-aushadha', @@ -28,10 +29,11 @@ export class EAushadhaComponent implements OnInit, DoCheck { private datePipe: DatePipe, private http_service: LanguageService, private dialogService: ConfirmationService, - private inventoryService: InventoryService) { } + private inventoryService: InventoryService, + readonly sessionstorage:SessionStorageService) { } ngOnInit() { - this.facilityID = localStorage.getItem('facilityID') + this.facilityID = this.sessionstorage.getItem('facilityID'); this.eAushadhaForm = this.createeAushadhaForm(); this.today = new Date(); if(this.failedRecordsArray === null || this.failedRecordsArray === undefined || this.failedRecordsArray.length === 0){ diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts index 85346f0..61020b0 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts @@ -40,6 +40,7 @@ import { animate, style, transition, trigger } from '@angular/animations'; import { SetLanguageComponent } from '../../core/components/set-language.component'; import { LanguageService } from '../../core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-physical-stock-entry', @@ -86,15 +87,18 @@ export class PhysicalStockEntryComponent implements OnInit, OnChanges, DoCheck { private http_service: LanguageService, private dialogService: ConfirmationService, private fb: FormBuilder, + readonly sessionstorage:SessionStorageService, ) {} dataSource = new MatTableDataSource(); ngOnInit() { this.otherDetails = { - createdBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), - userId: localStorage.getItem('userID'), - facilityID: localStorage.getItem('facilityID'), + // createdBy: localStorage.getItem('username'), + createdBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + // userId: localStorage.getItem('userID'), + userId: this.sessionstorage.userID, + facilityID: this.sessionstorage.getItem('facilityID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), }; diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts index 4a433ba..596e8d9 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts @@ -31,6 +31,7 @@ import { LanguageService } from 'src/app/app-modules/core/services/language.serv import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-physical-stock', @@ -68,6 +69,7 @@ export class ViewPhysicalStockComponent implements OnInit, DoCheck { private dataStorageService: DataStorageService, private dialog: MatDialog, private router: Router, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { @@ -108,7 +110,7 @@ export class ViewPhysicalStockComponent implements OnInit, DoCheck { endDate.setMilliseconds(0); return { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), fromDate: new Date( startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, ), @@ -199,7 +201,7 @@ export class ViewPhysicalStockComponent implements OnInit, DoCheck { } } createPrintableData(entry: any, stockEntryResponse: any) { - const facilityDetl: any = localStorage.getItem('facilityDetail'); + const facilityDetl: any = this.sessionstorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetl); const facilityName = facilityDetail.facilityName; const printableData: any = []; diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts index 0fec769..0ac91a6 100644 --- a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts @@ -28,6 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-consumption-report', @@ -45,6 +46,7 @@ export class ConsumptionReportComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} today!: Date; @@ -54,7 +56,7 @@ export class ConsumptionReportComponent implements OnInit, DoCheck { consumptionList = []; dateOffset: any; selectedFacilityName = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName; facilities = [this.selectedFacilityName, 'All']; //BU40088124 27/7/2022 Added Facility Name dropdown in reports @@ -129,7 +131,7 @@ export class ConsumptionReportComponent implements OnInit, DoCheck { facilityID: this.consumptionForm.value.facilityName === 'All' ? null - : localStorage.getItem('facilityID'), + : this.sessionstorage.facilityID, }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts index 8defb03..3a9d7b2 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts @@ -28,6 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-daily-stock-details-report', @@ -45,6 +46,7 @@ export class DailyStockDetailsReportComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} today!: Date; @@ -55,7 +57,7 @@ export class DailyStockDetailsReportComponent implements OnInit, DoCheck { dateOffset: any; selectedFacilityName = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName; facilities = [this.selectedFacilityName, 'All']; //BU40088124 27/7/2022 Added Facility Name dropdown in reports @@ -129,7 +131,7 @@ export class DailyStockDetailsReportComponent implements OnInit, DoCheck { facilityID: this.dailyStockDetailsForm.value.facilityName === 'All' ? null - : localStorage.getItem('facilityID'), + : this.sessionstorage.facilityID, }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts index 8272dde..d50acad 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts @@ -28,6 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-daily-stock-summary-report', templateUrl: './daily-stock-summary-report.component.html', @@ -44,6 +45,7 @@ export class DailyStockSummaryReportComponent implements OnInit, DoCheck { private http_service: LanguageService, private inventoryService: InventoryService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} today!: Date; @@ -53,7 +55,7 @@ export class DailyStockSummaryReportComponent implements OnInit, DoCheck { consumptionList = []; dateOffset: any; selectedFacilityName = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName; facilities = [this.selectedFacilityName, 'All']; @@ -128,7 +130,7 @@ export class DailyStockSummaryReportComponent implements OnInit, DoCheck { facilityID: this.dailyStockSummaryForm.value.facilityName === 'All' ? null - : localStorage.getItem('facilityID'), + : this.sessionstorage.facilityID, }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts index a80e967..f9ab913 100644 --- a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts @@ -30,6 +30,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-inward-stock-report', @@ -47,6 +48,7 @@ export class InwardStockReportComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} today!: Date; @@ -56,7 +58,7 @@ export class InwardStockReportComponent implements OnInit, DoCheck { inwardStockList = []; dateOffset: any; selectedFacilityName = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName; facilities = [this.selectedFacilityName, 'All']; @@ -131,7 +133,7 @@ export class InwardStockReportComponent implements OnInit, DoCheck { facilityID: this.inwardStockForm.value.facilityName === 'All' ? null - : localStorage.getItem('facilityID'), + : this.sessionstorage.facilityID, }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts index 39082e0..ce5a983 100644 --- a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts @@ -28,6 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-monthly-report', @@ -45,6 +46,7 @@ export class MonthlyReportComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} today!: Date; @@ -57,7 +59,7 @@ export class MonthlyReportComponent implements OnInit, DoCheck { years: any[] = []; yy!: number; selectedFacilityName = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName; facilities = [this.selectedFacilityName, 'All']; //BU40088124 27/7/2022 Added Facility Name dropdown in reports @@ -124,7 +126,7 @@ export class MonthlyReportComponent implements OnInit, DoCheck { facilityID: this.monthlyForm.value.facilityName === 'All' ? null - : localStorage.getItem('facilityID'), + : this.sessionstorage.facilityID, }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts index 3d172c6..7bee9b9 100644 --- a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts @@ -28,6 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-yearly-report', @@ -45,6 +46,7 @@ export class YearlyReportComponent implements OnInit, DoCheck { private inventoryService: InventoryService, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} today!: Date; @@ -57,7 +59,7 @@ export class YearlyReportComponent implements OnInit, DoCheck { years: any[] = []; yy!: number; selectedFacilityName = JSON.parse( - localStorage.getItem('facilityDetail') || '{}', + this.sessionstorage.getItem('facilityDetail') || '{}', //localStorage.getItem('facilityDetail') ).facilityName; facilities = [this.selectedFacilityName, 'All']; @@ -96,7 +98,7 @@ export class YearlyReportComponent implements OnInit, DoCheck { facilityID: this.yearlyForm.value.facilityName === 'All' ? null - : localStorage.getItem('facilityID'), + : this.sessionstorage.facilityID, }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/shared/service/inventory.service.ts b/src/app/app-modules/inventory/shared/service/inventory.service.ts index 0673682..0aa799d 100644 --- a/src/app/app-modules/inventory/shared/service/inventory.service.ts +++ b/src/app/app-modules/inventory/shared/service/inventory.service.ts @@ -24,11 +24,12 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Observable, Subject, throwError } from 'rxjs'; import { environment } from 'src/environments/environment'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Injectable() export class InventoryService { private dialogClosedSubject = new Subject(); - constructor(private http: HttpClient) {} + constructor(private http: HttpClient, readonly sessionstorage:SessionStorageService) {} dialogClosed(): void { this.dialogClosedSubject.next(); @@ -38,7 +39,7 @@ export class InventoryService { } getAvailableItemInStore() { - const storeID = localStorage.getItem('facilityID'); + const storeID = this.sessionstorage.getItem('facilityID'); console.log('this.itemInStore', storeID); return this.http.post( environment.getAvailableItemInStoreUrl + storeID, @@ -58,7 +59,7 @@ export class InventoryService { allocateBatch(itemList: any) { return this.http.post( - environment.allocateBatchStockUrl + localStorage.getItem('facilityID'), + environment.allocateBatchStockUrl + this.sessionstorage.getItem('facilityID'), itemList, ); } diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts index 6d20e3f..a5ed4e7 100644 --- a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts @@ -34,6 +34,7 @@ import { LanguageService } from '../../core/services/language.service'; import { SetLanguageComponent } from '../../core/components/set-language.component'; import { MatTableDataSource } from '@angular/material/table'; import { Subscription } from 'rxjs'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; export interface PeriodicElement { itemName: string; @@ -73,6 +74,7 @@ export class StoreSelfConsumptionComponent implements OnInit, DoCheck { private http_service: LanguageService, private inventoryService: InventoryService, private alertService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) { this.subs = this.inventoryService .getDialogClosedObservable() @@ -83,10 +85,11 @@ export class StoreSelfConsumptionComponent implements OnInit, DoCheck { dataSource = new MatTableDataSource(); ngOnInit() { - this.createdBy = localStorage.getItem('username'); - this.facilityID = localStorage.getItem('facilityID'); + // this.createdBy = localStorage.getItem('username'); + this.createdBy = this.sessionstorage.username; + this.facilityID = this.sessionstorage.getItem('facilityID'); this.fetchLanguageResponse(); - this.providerServiceMapID = localStorage.getItem('providerServiceID'); + this.providerServiceMapID = this.sessionstorage.providerServiceID; //localStorage.getItem('providerServiceID'); if (this.facilityID === null || this.facilityID <= 0) { this.router.navigate(['/inventory']); diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts index c2a1c7c..affacb1 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts @@ -35,6 +35,7 @@ import { ConfirmationService } from '../../core/services/confirmation.service'; import { InventoryService } from '../shared/service/inventory.service'; import { MatTableDataSource } from '@angular/material/table'; import { Subscription } from 'rxjs'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-store-stock-adjustment', @@ -75,6 +76,7 @@ export class StoreStockAdjustmentComponent private route: ActivatedRoute, private confirmationService: ConfirmationService, private inventoryService: InventoryService, + readonly sessionstorage:SessionStorageService, ) { this.subs = this.inventoryService .getDialogClosedObservable() @@ -104,7 +106,7 @@ export class StoreStockAdjustmentComponent // this.loadStockAdjData(); } - const isMainStore: any = localStorage.getItem('facilityDetail'); + const isMainStore: any = this.sessionstorage.getItem('facilityDetail'); //localStorage.getItem('facilityDetail'); this.isMainStore = JSON.parse(isMainStore).isMainFacility; this.showLastUpdatedStockLog(); this.loadStockAdjData(); @@ -213,10 +215,12 @@ export class StoreStockAdjustmentComponent ); const otherDetails = { - createdBy: localStorage.getItem('username'), - modifiedBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), - facilityID: localStorage.getItem('facilityID'), + // createdBy: localStorage.getItem('username'), + createdBy: this.sessionstorage.username, + // modifiedBy: localStorage.getItem('username'), + modifiedBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + facilityID: this.sessionstorage.getItem('facilityID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), }; @@ -278,9 +282,10 @@ export class StoreStockAdjustmentComponent ); const otherDetails = { - createdBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), - facilityID: localStorage.getItem('facilityID'), + // createdBy: localStorage.getItem('username'), + createdBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + facilityID: this.sessionstorage.getItem('facilityID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), }; @@ -409,7 +414,7 @@ export class StoreStockAdjustmentComponent addEAushadhiStock() { const reqObj = { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; this.inventoryService.addEAushadhiItemsToAmrit(reqObj).subscribe( (response) => { @@ -431,7 +436,7 @@ export class StoreStockAdjustmentComponent } showLastUpdatedStockLog() { const reqObj = { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), }; this.inventoryService.showLastUpdatedStockLogs(reqObj).subscribe( (logResponse) => { From 330208f1e7064fb9688a0e55c6ce745df2a94a9e Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Sat, 30 Nov 2024 11:02:01 +0530 Subject: [PATCH 36/80] hwc inventory wasa forth commit --- .../view-store-self-consumption.component.ts | 6 ++-- ...-store-stock-adjustment-draft.component.ts | 6 ++-- .../view-store-stock-adjustment.component.ts | 6 ++-- .../store-stock-transfer.component.ts | 11 ++++--- .../view-store-stock-transfer.component.ts | 8 +++-- .../rx/rx-dashboard/rx-dashboard.component.ts | 28 +++++++++-------- .../rx-item-dispense.component.css | 3 -- .../rx-item-dispense.component.html | 4 +-- .../rx-item-dispense.component.ts | 4 ++- .../shared/service/prescribed-drug.service.ts | 5 +++- .../facility-selection.component.ts | 12 ++++---- src/app/login/login.component.ts | 30 ++++++++++++++----- 12 files changed, 78 insertions(+), 45 deletions(-) diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts index 439d16a..811a716 100644 --- a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts @@ -31,6 +31,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { ViewStoreSelfConsumptionDetailsComponent } from './view-store-self-consumption-details/view-store-self-consumption-details.component'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-store-self-consumption', @@ -67,6 +68,7 @@ export class ViewStoreSelfConsumptionComponent implements OnInit, DoCheck { private http_service: LanguageService, private dialog: MatDialog, private router: Router, + private sessionstorage: SessionStorageService ) {} ngOnInit() { @@ -113,7 +115,7 @@ export class ViewStoreSelfConsumptionComponent implements OnInit, DoCheck { endDate.setMilliseconds(0); return { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), fromDate: new Date( startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, ), @@ -210,7 +212,7 @@ export class ViewStoreSelfConsumptionComponent implements OnInit, DoCheck { } createPrintableData(consumptionDetails: any, consumptionResponse: any) { - const facilityDetailStorage: any = localStorage.getItem('facilityDetail'); + const facilityDetailStorage: any = this.sessionstorage.getItem('facilityDetail'); //localStorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetailStorage); const facilityName = facilityDetail.facilityName; const printableData: any = []; diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts index d69c52a..a7fd3a2 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts @@ -31,6 +31,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ViewStockAdjustmentDraftDetailsComponent } from '../view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-store-stock-adjustment-draft', @@ -66,6 +67,7 @@ export class ViewStoreStockAdjustmentDraftComponent implements OnInit, DoCheck { private http_service: LanguageService, private dataStorageService: DataStorageService, private inventoryService: InventoryService, + private sessionstorage: SessionStorageService ) {} ngOnInit() { @@ -79,7 +81,7 @@ export class ViewStoreStockAdjustmentDraftComponent implements OnInit, DoCheck { } viewRecords() { - const facilityID: any = localStorage.getItem('facilityID'); + const facilityID: any = this.sessionstorage.getItem('facilityID'); const startDate: Date = new Date(this.fromDate); startDate.setHours(0); startDate.setMinutes(0); @@ -181,7 +183,7 @@ export class ViewStoreStockAdjustmentDraftComponent implements OnInit, DoCheck { this.router.navigate(['inventory/storeStockAdjustment/update', draftID]); } createPrintableData(adjustmentDetials: any) { - const facilityDetailStrorage: any = localStorage.getItem('facilityDetail'); + const facilityDetailStrorage: any = this.sessionstorage.getItem('facilityDetail'); //localStorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetailStrorage); const facilityName = facilityDetail.facilityName; const adjustedItemList: any = []; diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts index 0901a63..6c01773 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts @@ -31,6 +31,7 @@ import { ViewStockAdjustmentDetailsComponent } from '../view-stock-adjustment-de import { InventoryService } from '../../shared/service/inventory.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-store-stock-adjustment', @@ -65,6 +66,7 @@ export class ViewStoreStockAdjustmentComponent implements OnInit, DoCheck { private router: Router, private dataStorageService: DataStorageService, private inventoryService: InventoryService, + private sessionstorage: SessionStorageService ) {} ngOnInit() { @@ -78,7 +80,7 @@ export class ViewStoreStockAdjustmentComponent implements OnInit, DoCheck { } viewRecords() { - const facilityID = localStorage.getItem('facilityID'); + const facilityID = this.sessionstorage.getItem('facilityID'); const startDate: Date = new Date(this.fromDate); startDate.setHours(0); startDate.setMinutes(0); @@ -187,7 +189,7 @@ export class ViewStoreStockAdjustmentComponent implements OnInit, DoCheck { } createPrintableData(adjustmentDetials: any) { - const facilityDetailStorage: any = localStorage.getItem('facilityDetail'); + const facilityDetailStorage: any = this.sessionstorage.getItem('facilityDetail'); //localStorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetailStorage); const facilityName = facilityDetail.facilityName; const adjustedItemList: any = []; diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts index 052c9d3..582f8a3 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts @@ -35,6 +35,7 @@ import { SetLanguageComponent } from '../../core/components/set-language.compone import { LanguageService } from '../../core/services/language.service'; import * as moment from 'moment'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from '../../core/services/session-storage.service'; @Component({ selector: 'app-store-stock-transfer', templateUrl: './store-stock-transfer.component.html', @@ -76,6 +77,7 @@ export class StoreStockTransferComponent implements OnInit, DoCheck { private router: Router, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) { this.checkFacility(); } @@ -93,7 +95,7 @@ export class StoreStockTransferComponent implements OnInit, DoCheck { } checkFacility() { - this.facilityID = localStorage.getItem('facilityID'); + this.facilityID = this.sessionstorage.getItem('facilityID'); console.log('CSKDHONI**', this.facilityID); if (this.facilityID === null || this.facilityID <= 0) { this.router.navigate(['/inventory']); @@ -101,7 +103,7 @@ export class StoreStockTransferComponent implements OnInit, DoCheck { } getAllStore() { - const serviceProviderId = localStorage.getItem('providerServiceID'); + const serviceProviderId = this.sessionstorage.providerServiceID; //localStorage.getItem('providerServiceID'); this.inventoryService.getAllStore(serviceProviderId).subscribe((data) => { console.log('data****', data); const newArr: any = Object.entries(data).map(([key, value]) => value); @@ -180,8 +182,9 @@ export class StoreStockTransferComponent implements OnInit, DoCheck { updateTodaysData() { this.stockTransferForm.patchValue({ dated: moment(new Date()).format('DD/MM/YYYY'), - createdBy: localStorage.getItem('username'), - providerServiceMapID: localStorage.getItem('providerServiceID'), +// createdBy: localStorage.getItem('username'), +createdBy: this.sessionstorage.username, + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), }); } diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts index 470f92b..10241c9 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts @@ -31,6 +31,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-view-store-stock-transfer', templateUrl: './view-store-stock-transfer.component.html', @@ -60,6 +61,7 @@ export class ViewStoreStockTransferComponent implements OnInit, DoCheck { private dialog: MatDialog, private http_service: LanguageService, private router: Router, + public sessionstorage: SessionStorageService ) {} ngOnInit() { @@ -67,7 +69,7 @@ export class ViewStoreStockTransferComponent implements OnInit, DoCheck { this.fetchLanguageResponse(); this.getPastEntries(); - this.ourStore = localStorage.getItem('facilityID'); + this.ourStore = this.sessionstorage.getItem('facilityID'); } setDateDefault() { @@ -101,7 +103,7 @@ export class ViewStoreStockTransferComponent implements OnInit, DoCheck { endDate.setMilliseconds(0); return { - facilityID: localStorage.getItem('facilityID'), + facilityID: this.sessionstorage.getItem('facilityID'), fromDate: new Date( startDate.valueOf() - 1 * startDate.getTimezoneOffset() * 60 * 1000, ), @@ -217,7 +219,7 @@ export class ViewStoreStockTransferComponent implements OnInit, DoCheck { } createPrintableData(entry: any, stockEntryResponse: any) { - const facilityDetailStorage: any = localStorage.getItem('facilityDetail'); + const facilityDetailStorage: any = this.sessionstorage.getItem('facilityDetail'); //localStorage.getItem('facilityDetail'); const facilityDetail = JSON.parse(facilityDetailStorage); const facilityName = facilityDetail.facilityName; const printableData: any = []; diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts index 8ca0b7c..83d9dc3 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts @@ -26,6 +26,7 @@ import { PrescribedDrugService } from './../shared/service/prescribed-drug.servi import { ConfirmationService } from '../../core/services/confirmation.service'; import { LanguageService } from '../../core/services/language.service'; import { SetLanguageComponent } from '../../core/components/set-language.component'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-rx-dashboard', @@ -55,23 +56,26 @@ export class RxDashboardComponent implements OnInit, DoCheck { private prescribedDrugService: PrescribedDrugService, private confirmationService: ConfirmationService, private http_service: LanguageService, + readonly sessionstorage:SessionStorageService, ) {} ngOnInit() { this.issueType = 1; this.fetchLanguageResponse(); - this.parent_url = sessionStorage.getItem('return'); - this.username = localStorage.getItem('username'); + this.parent_url = this.sessionstorage.getItem('return'); + // this.username = localStorage.getItem('username'); + this.username = this.sessionstorage.username; this.getBenDetails(); this.getPrescriptionDetails(); } getBenDetails() { - this.visitCode = sessionStorage.getItem('parentBenVisit'); + this.visitCode = this.sessionstorage.getItem('parentBenVisit'); this.today = new Date(); this.route.params.subscribe((param) => { this.benRegID = param['beneficiaryRegID']; - const benFlowID: any = localStorage.getItem('benFlowID'); + // const benFlowID: any = localStorage.getItem('benFlowID'); + const benFlowID: any = this.sessionstorage.benFlowID; this.beneficiaryDetailsService.getBeneficiaryDetails( this.benRegID, benFlowID, @@ -104,8 +108,8 @@ export class RxDashboardComponent implements OnInit, DoCheck { } getPrescriptionDetails() { - const visitCode = sessionStorage.getItem('parentBenVisit'); - const facilityID = localStorage.getItem('facilityID'); + const visitCode = this.sessionstorage.getItem('parentBenVisit'); + const facilityID = this.sessionstorage.getItem('facilityID'); const beneficiaryRegID = this.benRegID; this.prescribedDrugService .getPrescription({ visitCode, facilityID, beneficiaryRegID }) @@ -147,7 +151,7 @@ export class RxDashboardComponent implements OnInit, DoCheck { .saveStockExit(reqObj) .subscribe((res: any) => { if (res.statusCode === 200) { - const language = localStorage.getItem('currentLanguage'); + const language = sessionStorage.getItem('currentLanguage'); window.location.href = `${this.parent_url}?resolve=Y¤tLanguage=${language}`; } else { this.confirmationService.alert(res.errorMessage, 'warn'); @@ -156,14 +160,14 @@ export class RxDashboardComponent implements OnInit, DoCheck { } getSubmitObject(prescription: any) { - const facilityDetail: any = localStorage.getItem('facilityDetail'); + const facilityDetail: any = this.sessionstorage.getItem('facilityDetail'); //localStorage.getItem('facilityDetail'); const facilityID = JSON.parse(facilityDetail).facilityID; const facilityName = JSON.parse(facilityDetail).facilityName; const visitCode = this.visitCode; const beneficiary = this.beneficiary; console.log('beneficiaryHKK', beneficiary); - const issuedBy = sessionStorage.getItem('host') - ? sessionStorage.getItem('host') + const issuedBy = this.sessionstorage.getItem('host') + ? this.sessionstorage.getItem('host') : 'STORE'; const itemStockExit = this.getBatchObj(prescription.itemList); const reqObj = { @@ -176,13 +180,13 @@ export class RxDashboardComponent implements OnInit, DoCheck { beneficiaryID: beneficiary.beneficiaryID, benRegID: beneficiary.beneficiaryRegID, createdBy: this.username, - providerServiceMapID: localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), doctorName: prescription.consultantName, gender: beneficiary.genderName, issueType: this.issueType === 0 ? 'Manual' : 'System', patientName: beneficiary.beneficiaryName, prescriptionID: prescription.prescriptionID, - reference: `Prescribed by ${prescription.consultantName} from ${sessionStorage.getItem('host')}`, + reference: `Prescribed by ${prescription.consultantName} from ${this.sessionstorage.getItem('host')}`, visitID: beneficiary.benVisitID, visitDate: beneficiary.serviceDate, }; diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css index ce77773..e055ece 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.css @@ -72,7 +72,4 @@ legend { .width20 { width: 20%; } -.alignCenter { - justify-content: center; -} diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html index 541aa37..e78404f 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -18,8 +18,8 @@ {{ prescriptionForm.value.consultantName }} -
- +
+ {{ currentLanguageSet?.inventory?.noMedicalitemstoDisptach }}
diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts index d5564c6..a44b8db 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts @@ -35,6 +35,7 @@ import { ConfirmationService } from './../../core/services/confirmation.service' import { LanguageService } from '../../core/services/language.service'; import { SetLanguageComponent } from '../../core/components/set-language.component'; import { MatTableDataSource } from '@angular/material/table'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-rx-item-dispense', templateUrl: './rx-item-dispense.component.html', @@ -71,11 +72,12 @@ export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { private prescribedDrugService: PrescribedDrugService, private confirmationService: ConfirmationService, private http_service: LanguageService, + public sessionstorage: SessionStorageService, ) {} ngOnInit() { this.fetchLanguageResponse(); - this.facilityID = localStorage.getItem('facilityID'); + this.facilityID = this.sessionstorage.getItem('facilityID'); this.copyprescription = JSON.parse(JSON.stringify(this.prescription)); this.loadForm(this.prescription); } diff --git a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts index 808805a..0d9bdec 100644 --- a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts +++ b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts @@ -70,7 +70,10 @@ export class PrescribedDrugService { } allocateBatches(list: any, facilityID: any) { - return this.http.post(environment.allocateBatchStockUrl + facilityID, list); + return this.http.post( + `${environment.allocateBatchStockUrl}/${facilityID}`, + list, + ); } saveStockExit(dispensingItem: any) { diff --git a/src/app/facility-selection/facility-selection.component.ts b/src/app/facility-selection/facility-selection.component.ts index 40d8d26..955e4e7 100644 --- a/src/app/facility-selection/facility-selection.component.ts +++ b/src/app/facility-selection/facility-selection.component.ts @@ -6,6 +6,7 @@ import { FaciltyService } from './facilty.service'; import { ConfirmationService } from '../app-modules/core/services'; import { SetLanguageComponent } from '../app-modules/core/components/set-language.component'; import { LanguageService } from '../app-modules/core/services/language.service'; +import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; @Component({ @@ -31,6 +32,7 @@ export class FacilitySelectionComponent implements OnInit, DoCheck { private faciltyService: FaciltyService, private http_service: LanguageService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} facilityForm = this.fb.group({ @@ -43,7 +45,7 @@ export class FacilitySelectionComponent implements OnInit, DoCheck { localStorage.removeItem('facilityDetail'); localStorage.removeItem('facilityID'); this.fetchLanguageResponse(); - this.serviceProviderId = localStorage.getItem('providerServiceID'); + this.serviceProviderId = this.sessionstorage.providerServiceID; //localStorage.getItem('providerServiceID'); this.getAllStores(); } @@ -74,12 +76,12 @@ export class FacilitySelectionComponent implements OnInit, DoCheck { this.facilityForm.controls.facility.value ) { this.enableContinue = true; - localStorage.setItem('facilityID', facility.facilityID); - localStorage.setItem('facilityDetail', JSON.stringify(facility)); + this.sessionstorage.setItem('facilityID', facility.facilityID); + this.sessionstorage.setItem('facilityDetail', JSON.stringify(facility)); } else if (isMainStore === 'false' && facility && subFacility) { this.enableContinue = true; - localStorage.setItem('facilityID', subFacility.facilityID); - localStorage.setItem('facilityDetail', JSON.stringify(subFacility)); + this.sessionstorage.setItem('facilityID', subFacility.facilityID); + this.sessionstorage.setItem('facilityDetail', JSON.stringify(subFacility)); this.getFacilityMappedVanID(subFacility.facilityID); } else { this.enableContinue = false; diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 72fa9c3..804e2eb 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -4,6 +4,8 @@ import { AuthenticationService } from './authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; // import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js'; +import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { CookieService } from 'ngx-cookie-service'; @Component({ selector: 'app-login-cmp', @@ -29,6 +31,8 @@ export class LoginComponent implements OnInit { constructor( private authService: AuthenticationService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, + private cookieService: CookieService, private router: Router) { this._keySize = 256; this._ivSize = 128; @@ -102,7 +106,9 @@ export class LoginComponent implements OnInit { .subscribe(res => { if (res.statusCode == '200') { if (res.data.previlegeObj && res.data.previlegeObj[0]) { - localStorage.setItem('loginDataResponse', JSON.stringify(res.data)); + this.cookieService.set('Jwttoken', res.data.Jwttoken); + delete res.data.Jwttoken; + this.sessionstorage.setItem('loginDataResponse', JSON.stringify(res.data)); this.checkRoleMapped(res.data); } else { this.confirmationService.alert('Seems you are logged in from somewhere else, Logout from there & try back in.', 'error'); @@ -116,6 +122,8 @@ export class LoginComponent implements OnInit { this.authService.login(this.userName, encryptPassword, true).subscribe((userLoggedIn) => { if (userLoggedIn.statusCode == '200') { if (userLoggedIn.data.previlegeObj != null && userLoggedIn.data.previlegeObj != undefined && userLoggedIn.data.previlegeObj[0]) { + this.cookieService.set('Jwttoken', userLoggedIn.data.Jwttoken); + delete userLoggedIn.data.Jwttoken; this.checkRoleMapped(userLoggedIn.data); } else { this.confirmationService.alert('Seems you are logged in from somewhere else, Logout from there & try back in.', 'error'); @@ -159,7 +167,8 @@ export class LoginComponent implements OnInit { }) }) if (this.roleArray && this.roleArray.length > 0) { - localStorage.setItem('role', JSON.stringify(this.roleArray)) + // localStorage.setItem('role', JSON.stringify(this.roleArray)) + this.sessionstorage.setItem('role', JSON.stringify(this.roleArray)) this.checkMappedDesignation(loginDataResponse); } else { this.confirmationService.alert('Role Features is not mapped for user , Please map a role feature', 'error'); @@ -188,11 +197,16 @@ export class LoginComponent implements OnInit { checkDesignationWithRole(loginDataResponse: any) { if (this.roleArray.includes(this.designation)) { + console.error("Nagendra-------------1",loginDataResponse.key); sessionStorage.setItem('key', loginDataResponse.key); - localStorage.setItem('designation', this.designation); - localStorage.setItem('userID', loginDataResponse.userID); - localStorage.setItem('userName', loginDataResponse.userName); - localStorage.setItem('username', this.userName); + this.sessionstorage.setItem('designation', this.designation); + // localStorage.setItem('designation', this.designation); + //localStorage.setItem('userID', loginDataResponse.userID); + // localStorage.setItem('userName', loginDataResponse.userName); + this.sessionstorage.userID=loginDataResponse.userID; + this.sessionstorage.userName=loginDataResponse.userName; + // localStorage.setItem('username', this.userName); + this.sessionstorage.username=loginDataResponse.userName; const services = loginDataResponse.previlegeObj.map((item: any) => { if (item.roles[0].serviceRoleScreenMappings[0].providerServiceMapping.serviceID == '9' || item.roles[0].serviceRoleScreenMappings[0].providerServiceMapping.serviceID == '2') { return { @@ -206,8 +220,8 @@ export class LoginComponent implements OnInit { return; }) if (services.length > 0) { - localStorage.setItem('services', JSON.stringify(services)); - + // localStorage.setItem('services', JSON.stringify(services)); + this.sessionstorage.setItem('services', JSON.stringify(services)); if (loginDataResponse.Status.toLowerCase() == 'new') { this.router.navigate(['/set-security-questions']) } From f913257c74d7313751e62a2501f2e9bbfa720f71 Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Sat, 30 Nov 2024 11:04:43 +0530 Subject: [PATCH 37/80] hwc inventory wasa fifth commit --- WEB-INF/jboss-web.xml | 2 +- src/app/redir-in/redir-in.component.ts | 47 +- .../reset-password.component.ts | 11 +- src/app/service/service.component.ts | 11 +- .../set-password/set-password.component.ts | 5 +- .../set-security-questions.component.html | 406 +++++++++--------- .../set-security-questions.component.ts | 8 +- src/assets/English.json | 2 +- src/environments/enckey.ts | 6 + src/environments/environment.prod.ts | 16 +- src/environments/environment.test.ts | 20 +- src/environments/environment.ts | 15 +- 12 files changed, 301 insertions(+), 248 deletions(-) create mode 100644 src/environments/enckey.ts diff --git a/WEB-INF/jboss-web.xml b/WEB-INF/jboss-web.xml index 4f8f2a4..cb191f6 100644 --- a/WEB-INF/jboss-web.xml +++ b/WEB-INF/jboss-web.xml @@ -1,3 +1,3 @@ - /hwc-inventory + /hwc-inventory-wasa \ No newline at end of file diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index 528cdb7..68ec9f0 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -31,6 +31,7 @@ import { Location } from '@angular/common'; import { SpinnerService } from '../app-modules/core/services/spinner.service'; import { AuthenticationService } from '../login/authentication.service'; +import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; @Component({ selector: 'app-redir-in', templateUrl: './redir-in.component.html', @@ -66,9 +67,10 @@ export class RedirInComponent implements OnInit { private route: ActivatedRoute, private location: Location, private authService: AuthenticationService, + readonly sessionstorage:SessionStorageService, ) {} - ngOnInit() { + ngOnInit() { sessionStorage.removeItem('parentBen'); sessionStorage.removeItem('parentBenVisit'); sessionStorage.removeItem('isExternal'); @@ -141,25 +143,29 @@ export class RedirInComponent implements OnInit { } storeSession() { - sessionStorage.setItem( + this.sessionstorage.setItem( 'fallback', `${this.externalSession.protocol}//${this.externalSession.host}#${this.externalSession.fallbackURL}`, ); - sessionStorage.setItem( + this.sessionstorage.setItem( 'return', `${this.externalSession.protocol}//${this.externalSession.host}#${this.externalSession.returnURL}`, ); - sessionStorage.setItem( + this.sessionstorage.setItem( 'parentLogin', `${this.externalSession.protocol}//${this.externalSession.host}`, ); - sessionStorage.setItem('isExternal', 'true'); - sessionStorage.setItem('host', `${this.externalSession.parentApp}`); - sessionStorage.setItem('key', this.externalSession.auth); - localStorage.setItem('facilityID', this.externalSession.facility); - sessionStorage.setItem('parentBen', this.externalSession.ben); - sessionStorage.setItem('parentBenVisit', this.externalSession.visit); - localStorage.setItem('benFlowID', this.externalSession.flowID); + this.sessionstorage.setItem('isExternal', 'true'); + this.sessionstorage.setItem('host', `${this.externalSession.parentApp}`); + //console.error("Nagendra--------------2,",this.externalSession, "<><><>", exAuth); + if(this.externalSession && this.externalSession.auth){ + sessionStorage.setItem('key', this.externalSession.auth); + } + this.sessionstorage.setItem('facilityID', this.externalSession.facility); + this.sessionstorage.setItem('parentBen', this.externalSession.ben); + this.sessionstorage.setItem('parentBenVisit', this.externalSession.visit); + // localStorage.setItem('benFlowID', this.externalSession.flowID); + this.sessionstorage.benFlowID = this.externalSession.flowID; localStorage.setItem('vanID', this.externalSession.vanID); localStorage.setItem('parkingPlaceID', this.externalSession.parkingPlaceID); localStorage.setItem( @@ -171,8 +177,9 @@ export class RedirInComponent implements OnInit { 'currentLanguage', this.externalSession.currentLanguage, ); - localStorage.setItem('healthID', this.externalSession.healthID); - this.fallback = sessionStorage.getItem('fallback'); + // localStorage.setItem('healthID', this.externalSession.healthID); + this.sessionstorage.healthID = this.externalSession.healthID; + this.fallback = this.sessionstorage.getItem('fallback'); this.checkSession(); } @@ -266,14 +273,18 @@ export class RedirInComponent implements OnInit { }); }); if (this.roleArray && this.roleArray.length > 0) { - localStorage.setItem('role', JSON.stringify(this.roleArray)); + //localStorage.setItem('role', JSON.stringify(this.roleArray)); + this.sessionstorage.setItem('role', JSON.stringify(this.roleArray)); sessionStorage.setItem( 'isAuthenticated', loginDataResponse.isAuthenticated, ); - localStorage.setItem('username', loginDataResponse.userName); - localStorage.setItem('userName', loginDataResponse.userName); - localStorage.setItem('userID', loginDataResponse.userID); + // localStorage.setItem('username', loginDataResponse.userName); + // localStorage.setItem('userName', loginDataResponse.userName); + this.sessionstorage.username=loginDataResponse.userName; + this.sessionstorage.userName=loginDataResponse.userName; + this.sessionstorage.userID=loginDataResponse.userID; + //localStorage.setItem('userID', loginDataResponse.userID); localStorage.setItem( 'designation', loginDataResponse.designation.designationName, @@ -326,7 +337,7 @@ export class RedirInComponent implements OnInit { .getFacilityDetails(this.externalSession.facility) .subscribe((res) => { if (res && res.statusCode === 200 && res.data) { - localStorage.setItem('facilityDetail', JSON.stringify(res.data)); + this.sessionstorage.setItem('facilityDetail', JSON.stringify(res.data)); this.router.navigate([ '/rx/disperse/' + this.externalSession.benRegID, ]); diff --git a/src/app/reset-password/reset-password.component.ts b/src/app/reset-password/reset-password.component.ts index f1233ea..14ce77a 100644 --- a/src/app/reset-password/reset-password.component.ts +++ b/src/app/reset-password/reset-password.component.ts @@ -24,6 +24,7 @@ import { Router } from '@angular/router'; import { AuthenticationService } from '../login/authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; +import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; @Component({ selector: 'app-reset-password', @@ -37,6 +38,7 @@ export class ResetPasswordComponent { private router: Router, private authService: AuthenticationService, private confirmationService: ConfirmationService, + readonly sessionstorage:SessionStorageService, ) {} public response: any; @@ -56,7 +58,8 @@ export class ResetPasswordComponent { wrong_answer_msg: any = ''; getQuestions(username: any) { - localStorage.setItem('userID', username); + this.sessionstorage.userID=username; + //localStorage.setItem('userID', username); this.authService.getUserSecurityQuestionsAnswer(username).subscribe( (response: any) => { if (response !== undefined && response !== null) { @@ -139,7 +142,8 @@ export class ResetPasswordComponent { this.authService .validateSecurityQuestionAndAnswer( this.userFinalAnswers, - localStorage.getItem('userID'), + // localStorage.getItem('userID'), + this.sessionstorage.userID ) .subscribe( (response: any) => { @@ -148,7 +152,8 @@ export class ResetPasswordComponent { this.router.navigate(['/set-password']); this.authService.transactionId = response.data.transactionId; } else { - this.getQuestions(localStorage.getItem('userID')); + //this.getQuestions(localStorage.getItem('userID')); + this.getQuestions(this.sessionstorage.userID); this.onFailureNavigateToResetPassword(response); } }, diff --git a/src/app/service/service.component.ts b/src/app/service/service.component.ts index a24c865..2430029 100644 --- a/src/app/service/service.component.ts +++ b/src/app/service/service.component.ts @@ -21,6 +21,7 @@ */ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; @Component({ selector: 'app-service', @@ -30,10 +31,11 @@ import { Router } from '@angular/router'; export class ServiceComponent implements OnInit { servicesList: any = []; - constructor(private router: Router) {} + constructor(private router: Router, public sessionstorage: SessionStorageService) {} ngOnInit() { - const servicesListStore = localStorage.getItem('services'); + // const servicesListStore = localStorage.getItem('services'); + const servicesListStore = this.sessionstorage.getItem('services'); if (servicesListStore !== null) { this.servicesList = JSON.parse(servicesListStore); } @@ -45,8 +47,9 @@ export class ServiceComponent implements OnInit { } selectService(service: any): void { - localStorage.setItem('providerServiceID', service.providerServiceID); - sessionStorage.setItem('apimanClientKey', service.apimanClientKey); + // localStorage.setItem('providerServiceID', service.providerServiceID); + this.sessionstorage.providerServiceID = service.providerServiceID; + this.sessionstorage.setItem('apimanClientKey', service.apimanClientKey); this.router.navigate(['/facility']); } } diff --git a/src/app/set-password/set-password.component.ts b/src/app/set-password/set-password.component.ts index 9b8144f..8638a13 100644 --- a/src/app/set-password/set-password.component.ts +++ b/src/app/set-password/set-password.component.ts @@ -25,6 +25,7 @@ import { Router } from '@angular/router'; import { AuthenticationService } from '../login/authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; import * as CryptoJS from 'crypto-js'; +import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; @Component({ selector: 'app-set-password', templateUrl: './set-password.component.html', @@ -49,6 +50,7 @@ export class SetPasswordComponent implements OnInit { constructor( private router: Router, private authService: AuthenticationService, + readonly sessionstorage:SessionStorageService, //private confirmationService: ConfirmationService) { } private confirmationService: ConfirmationService, @@ -102,7 +104,8 @@ export class SetPasswordComponent implements OnInit { } ngOnInit() { - this.uname = localStorage.getItem('userID'); + // this.uname = localStorage.getItem('userID'); + this.uname = this.sessionstorage.userID; } showPWD() { diff --git a/src/app/set-security-questions/set-security-questions.component.html b/src/app/set-security-questions/set-security-questions.component.html index 533ccbd..7661c88 100644 --- a/src/app/set-security-questions/set-security-questions.component.html +++ b/src/app/set-security-questions/set-security-questions.component.html @@ -1,216 +1,226 @@ -
- - -
- Logo -
-
-

Account Support

-
- Follow the steps to change/reset the password -
-
-
- -
-
- - - - {{ question.Question }} - - - -
- - + + + +
+ Logo +
+
+

Account Support

+
+ Follow the steps to change/reset the password +
+
+
+ +
+ +
+ + Question 1 + - -
- -
- - - - {{ question.Question }} - - - -
- - + {{ question.Question }} + + + + +
+
+ + Answer 1 + + +
+ +
+
+ + Question 2 + - -
- -
- - - - {{ question.Question }} - - - -
- - + {{ question.Question }} + + + + +
+
+ + Answer 2 + + +
+ +
+
+ + Question 3 + + - -
- -
-
- -
-
-
- -
-
-
- - - - - -
-
- - - - - -
+ + {{ question.Question }} + + +
+
+ + Answer 3 + + +
+
- - - -
+ +
+
+
+ + New Password + + + + +
+
+ + Confirm Password + + + + +
+
+
+ +
+
+
+ +
+
+ + diff --git a/src/app/set-security-questions/set-security-questions.component.ts b/src/app/set-security-questions/set-security-questions.component.ts index fbfa6ec..22f5044 100644 --- a/src/app/set-security-questions/set-security-questions.component.ts +++ b/src/app/set-security-questions/set-security-questions.component.ts @@ -26,6 +26,7 @@ import { AuthenticationService } from '../login/authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; import * as CryptoJS from 'crypto-js'; import { AuthService } from '../app-modules/core/services/auth.service'; +import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; @Component({ selector: 'app-set-security-questions', @@ -38,6 +39,7 @@ export class SetSecurityQuestionsComponent implements OnInit { private authService: AuthenticationService, private confirmationService: ConfirmationService, private auth: AuthService, + readonly sessionstorage:SessionStorageService, ) { this._keySize = 256; this._ivSize = 128; @@ -55,8 +57,10 @@ export class SetSecurityQuestionsComponent implements OnInit { } ngOnInit() { - this.uid = localStorage.getItem('userID'); - this.uname = localStorage.getItem('username'); + // this.uid = localStorage.getItem('userID'); + this.uid = this.sessionstorage.userID + // this.uname = localStorage.getItem('username'); + this.uname = this.sessionstorage.username; this.authService.getSecurityQuestions().subscribe( (response: any) => this.handleSuccess(response), (error: any) => this.handleError(error), diff --git a/src/assets/English.json b/src/assets/English.json index cfa87e7..fc07eb5 100644 --- a/src/assets/English.json +++ b/src/assets/English.json @@ -191,7 +191,7 @@ "prescriptionID": "Prescription ID", "visitCode": "Visit Code", "consultantName": "Consultant Name", - "noMedicalitemstoDisptach": "No Medical items to Dispatch", + "noMedicalitemstoDisptach": "No Medical items to Disptach", "form": "Form", "duration": "Duration", "frequency": "Frequency", diff --git a/src/environments/enckey.ts b/src/environments/enckey.ts new file mode 100644 index 0000000..3abc5b6 --- /dev/null +++ b/src/environments/enckey.ts @@ -0,0 +1,6 @@ +export const keys = { + dev: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', + test: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', + prod: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', + ci: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', +}; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index f49c60a..a343812 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -2,6 +2,10 @@ // The build system defaults to the dev environment which uses `environment.ts`, but if you do // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. +// const commonIP = "http://183.82.107.186:8080/"; +// const inventoryIP = "http://183.82.107.186:8080/"; +// const mmuIP = "http://183.82.107.186:8080/"; +// const FHIRIP = "http://183.82.107.186:8080/"; const commonIP = "https://amritwprdev.piramalswasthya.org/"; const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; const mmuIP = "https://amritwprdev.piramalswasthya.org/"; @@ -11,15 +15,17 @@ const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; -const COMMON_API = `${commonIP}commonapi-v1.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; -const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; +const COMMON_API = `${commonIP}commonapi-v3.0.0/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; +const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; +import { keys } from './enckey'; export const environment = { production: true, countryId: 1, + encKey: keys.prod, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index ee6727f..ee45de2 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -3,24 +3,26 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "https://amritwprdev.piramalswasthya.org/"; -const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; -const mmuIP = "https://amritwprdev.piramalswasthya.org/"; -const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; +const commonIP = "http://183.82.107.186:8080/"; +const inventoryIP = "http://183.82.107.186:8080/"; +const mmuIP = "http://183.82.107.186:8080/"; +const FHIRIP = "http://183.82.107.186:8080/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; -const COMMON_API = `${commonIP}commonapi-v1.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; -const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; +const COMMON_API = `${commonIP}commonapi-v3.0.0/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; +const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; +import { keys } from './enckey'; export const environment = { production: true, countryId: 1, + encKey: keys.test, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 3b2b488..7d2a9f8 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -12,16 +12,18 @@ const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; -const COMMON_API = `${commonIP}commonapi-v1.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; -const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; +const COMMON_API = `${commonIP}commonapi-v3.0.0/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; +const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; +import { keys } from './enckey'; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { production: false, countryId: 1, + encKey: keys.dev, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, @@ -32,6 +34,7 @@ export const environment = { loginUrl: `${COMMON_API_OPEN}user/userAuthenticate`, logoutUrl: `${COMMON_API_OPEN}user/userLogout`, userlogoutPreviousSessionUrl: `${COMMON_API_OPEN}user/logOutUserFromConcurrentSession`, + getUserAuth: `${COMMON_API_OPEN}user/getLoginResponse`, /** * Security Question and Forgot password Url @@ -82,7 +85,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, From f22346cdf2022ebd3cd719cd7adb888986d4d50b Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Mon, 2 Dec 2024 11:49:03 +0530 Subject: [PATCH 38/80] ngx cookie service version change --- package-lock.json | 32 ++++++++++++++++---------------- package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f162a5..5ab5796 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "file-saver": "^2.0.5", "hwc-inventory-ui": "file:", "ng-cryptostore": "^16.0.0", - "ngx-cookie-service": "^18.0.0", + "ngx-cookie-service": "^16.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -12572,15 +12572,15 @@ } }, "node_modules/ngx-cookie-service": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", - "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-16.1.0.tgz", + "integrity": "sha512-FrzMjsGCHZCd2sEucigMaGyzImBL0l6gwWn6jmLBhcNVx0D7P8Yvtgk9aUptlqBrVKy4c2upglSa3Ogv3679bw==", "dependencies": { - "tslib": "^2.6.2" + "tslib": "^2.0.0" }, "peerDependencies": { - "@angular/common": "^18.0.0-rc.0", - "@angular/core": "^18.0.0-rc.0" + "@angular/common": "^16.0.0", + "@angular/core": "^16.0.0" } }, "node_modules/nice-napi": { @@ -24810,7 +24810,7 @@ "karma-jasmine-html-reporter": "~2.1.0", "lint-staged": "^15.2.2", "ng-cryptostore": "^16.0.0", - "ngx-cookie-service": "^18.0.0", + "ngx-cookie-service": "^16.1.0", "prettier": "^3.2.5", "prettier-eslint": "^16.3.0", "rxjs": "~7.8.0", @@ -34149,11 +34149,11 @@ } }, "ngx-cookie-service": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", - "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-16.1.0.tgz", + "integrity": "sha512-FrzMjsGCHZCd2sEucigMaGyzImBL0l6gwWn6jmLBhcNVx0D7P8Yvtgk9aUptlqBrVKy4c2upglSa3Ogv3679bw==", "requires": { - "tslib": "^2.6.2" + "tslib": "^2.0.0" } }, "nice-napi": { @@ -39820,11 +39820,11 @@ } }, "ngx-cookie-service": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", - "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-16.1.0.tgz", + "integrity": "sha512-FrzMjsGCHZCd2sEucigMaGyzImBL0l6gwWn6jmLBhcNVx0D7P8Yvtgk9aUptlqBrVKy4c2upglSa3Ogv3679bw==", "requires": { - "tslib": "^2.6.2" + "tslib": "^2.0.0" } }, "nice-napi": { diff --git a/package.json b/package.json index 820879d..d55b4ab 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "file-saver": "^2.0.5", "hwc-inventory-ui": "file:", "ng-cryptostore": "^16.0.0", - "ngx-cookie-service": "^18.0.0", + "ngx-cookie-service": "^16.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" From 8fbed7a4873a5b77a3ab24762db92cd6667e4f0a Mon Sep 17 00:00:00 2001 From: sandipkarmakar3 Date: Tue, 10 Dec 2024 20:10:40 +0530 Subject: [PATCH 39/80] sonar issue fix with session service path change and encryption key location change --- .gitmodules | 3 +++ Common-UI | 1 + .../components/app-header/app-header.component.ts | 2 +- .../beneficiary-details.component.ts | 2 +- .../core/components/search/search.component.ts | 2 +- .../indent-order-worklist.component.ts | 2 +- .../manual-indent-dispense.component.ts | 2 +- .../main-store-indent-order-worklist.component.ts | 2 +- .../indent-request/indent-request.component.ts | 2 +- .../sub-store-indent-order-worklist.component.ts | 2 +- .../manual-medicine-dispense.component.ts | 2 +- .../medicine-dispense/medicine-dispense.component.ts | 2 +- .../show-batch-item/show-batch-item.component.ts | 2 +- .../view-medicine-dispense-details.component.ts | 2 +- .../view-medicine-dispense.component.ts | 2 +- ...tem-batch-details-for-patient-return.component.ts | 2 +- .../patient-return-previous-record.component.ts | 2 +- .../patient-return/patient-return.component.ts | 2 +- .../e-aushadha/e-aushadha.component.ts | 2 +- .../physical-stock-entry.component.ts | 2 +- .../view-physical-stock.component.ts | 2 +- .../consumption-report.component.ts | 2 +- .../daily-stock-details-report.component.ts | 2 +- .../daily-stock-summary-report.component.ts | 2 +- .../inward-stock-report.component.ts | 2 +- .../monthly-report/monthly-report.component.ts | 2 +- .../reports/yearly-report/yearly-report.component.ts | 2 +- .../inventory/shared/service/inventory.service.ts | 2 +- .../store-self-consumption.component.ts | 2 +- .../view-store-self-consumption.component.ts | 2 +- .../store-stock-adjustment.component.ts | 2 +- .../view-store-stock-adjustment-draft.component.ts | 2 +- .../view-store-stock-adjustment.component.ts | 2 +- .../store-stock-transfer.component.ts | 2 +- .../view-store-stock-transfer.component.ts | 2 +- .../rx/rx-dashboard/rx-dashboard.component.ts | 2 +- .../rx-item-dispense/rx-item-dispense.component.ts | 2 +- .../facility-selection.component.ts | 2 +- src/app/login/login.component.ts | 2 +- src/app/redir-in/redir-in.component.ts | 2 +- src/app/reset-password/reset-password.component.ts | 2 +- src/app/service/service.component.ts | 2 +- src/app/set-password/set-password.component.ts | 2 +- .../set-security-questions.component.ts | 2 +- src/environments/enckey.ts | 6 ------ src/environments/environment.ci.ts.template | 2 ++ src/environments/environment.prod.ts | 4 ++-- src/environments/environment.test.ts | 12 ++++++------ src/environments/environment.ts | 4 ++-- 49 files changed, 58 insertions(+), 58 deletions(-) create mode 100644 .gitmodules create mode 160000 Common-UI delete mode 100644 src/environments/enckey.ts diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e511780 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Common-UI"] + path = Common-UI + url = https://github.com/PSMRI/Common-UI.git diff --git a/Common-UI b/Common-UI new file mode 160000 index 0000000..d12389e --- /dev/null +++ b/Common-UI @@ -0,0 +1 @@ +Subproject commit d12389e2e433de99af585fef88d452ea137625e3 diff --git a/src/app/app-modules/core/components/app-header/app-header.component.ts b/src/app/app-modules/core/components/app-header/app-header.component.ts index 90e016b..fea3616 100644 --- a/src/app/app-modules/core/components/app-header/app-header.component.ts +++ b/src/app/app-modules/core/components/app-header/app-header.component.ts @@ -20,7 +20,7 @@ import { MatDialog } from "@angular/material/dialog"; import { environment } from "src/environments/environment"; import { ShowCommitAndVersionDetailsComponent } from "../show-commit-and-version-details/show-commit-and-version-details.component"; import { CookieService } from 'ngx-cookie-service'; -import { SessionStorageService } from "../../services/session-storage.service"; +import { SessionStorageService } from "Common-UI/src/registrar/services/session-storage.service"; @Component({ selector: "app-header", templateUrl: "./app-header.component.html", diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts index 9a5862f..a653ef0 100644 --- a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts @@ -26,7 +26,7 @@ import { BeneficiaryDetailsService } from '../../services/beneficiary-details.se import { LanguageService } from '../../services/language.service'; import { SetLanguageComponent } from '../set-language.component'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-beneficiary-details', diff --git a/src/app/app-modules/core/components/search/search.component.ts b/src/app/app-modules/core/components/search/search.component.ts index 92d5b09..d71e5aa 100644 --- a/src/app/app-modules/core/components/search/search.component.ts +++ b/src/app/app-modules/core/components/search/search.component.ts @@ -35,7 +35,7 @@ import { environment } from 'src/environments/environment'; import { MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; interface Beneficary { firstName: string; diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts index f46170d..6ad2a53 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/indent-order-worklist.component.ts @@ -23,7 +23,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { ConfirmationService } from 'src/app/app-modules/core/services'; import { InventoryService } from '../../shared/service/inventory.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-indent-order-worklist', templateUrl: './indent-order-worklist.component.html', diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts index dfc4c3d..13fd33b 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.ts @@ -32,7 +32,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-manual-indent-dispense', diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts index 1f63464..1a84836 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/main-store-indent-order-worklist.component.ts @@ -30,7 +30,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-main-store-indent-order-worklist', diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts index 66e7f5d..bc79928 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts @@ -38,7 +38,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { Subscription } from 'rxjs'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-indent-request', diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts index 872a145..cb7f3d1 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/sub-store-indent-order-worklist.component.ts @@ -30,7 +30,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatPaginator } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-sub-store-indent-order-worklist', diff --git a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts index 6f908df..90f6397 100644 --- a/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/manual-medicine-dispense/manual-medicine-dispense.component.ts @@ -41,7 +41,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-manual-medicine-dispense', templateUrl: './manual-medicine-dispense.component.html', diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts index 1578276..00c8b33 100644 --- a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts @@ -27,7 +27,7 @@ import { SetLanguageComponent } from '../../core/components/set-language.compone import { LanguageService } from '../../core/services/language.service'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { SearchComponent } from '../../core/components/search/search.component'; -import { SessionStorageService } from '../../core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-medicine-dispense', diff --git a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts index 516c93d..e84b5e4 100644 --- a/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/system-medicine-dispense/show-batch-item/show-batch-item.component.ts @@ -25,7 +25,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-show-batch-item', diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts index 6a0e366..24989aa 100644 --- a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense-details/view-medicine-dispense-details.component.ts @@ -33,7 +33,7 @@ import { MatTableDataSource } from '@angular/material/table'; import * as moment from 'moment'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-medicine-dispense-details', diff --git a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts index 76c83d3..4eba934 100644 --- a/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/view-medicine-dispense/view-medicine-dispense.component.ts @@ -30,7 +30,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-medicine-dispense', diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts index 48a0124..06a76ff 100644 --- a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts @@ -45,7 +45,7 @@ import { LanguageService } from 'src/app/app-modules/core/services/language.serv import { PatientReturnBatchDetailsComponent } from '../patient-return-batch-details/patient-return-batch-details.component'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-item-batch-details-for-patient-return', diff --git a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts index 7e19a52..f06db39 100644 --- a/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts +++ b/src/app/app-modules/inventory/patient-return/patient-return-previous-record/patient-return-previous-record.component.ts @@ -28,7 +28,7 @@ import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-la import { MatDialog } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-patient-return-previous-record', diff --git a/src/app/app-modules/inventory/patient-return/patient-return.component.ts b/src/app/app-modules/inventory/patient-return/patient-return.component.ts index 57af0a0..11335b5 100644 --- a/src/app/app-modules/inventory/patient-return/patient-return.component.ts +++ b/src/app/app-modules/inventory/patient-return/patient-return.component.ts @@ -27,7 +27,7 @@ import { SetLanguageComponent } from '../../core/components/set-language.compone import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from '../../core/services/language.service'; import { BenificiaryDetailsComponent } from './benificiary-details/benificiary-details.component'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-patient-return', diff --git a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts index 33d1ebf..61ca50f 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/e-aushadha/e-aushadha.component.ts @@ -5,7 +5,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { ConfirmationService } from 'src/app/app-modules/core/services/confirmation.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-e-aushadha', diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts index 61020b0..240a19d 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts @@ -40,7 +40,7 @@ import { animate, style, transition, trigger } from '@angular/animations'; import { SetLanguageComponent } from '../../core/components/set-language.component'; import { LanguageService } from '../../core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-physical-stock-entry', diff --git a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts index 596e8d9..cc2118e 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/view-physical-stock/view-physical-stock.component.ts @@ -31,7 +31,7 @@ import { LanguageService } from 'src/app/app-modules/core/services/language.serv import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-physical-stock', diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts index 0ac91a6..7d7b58b 100644 --- a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts @@ -28,7 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-consumption-report', diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts index 3a9d7b2..488399c 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts @@ -28,7 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-daily-stock-details-report', diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts index d50acad..bc28d6e 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts @@ -28,7 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-daily-stock-summary-report', templateUrl: './daily-stock-summary-report.component.html', diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts index f9ab913..a732531 100644 --- a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts @@ -30,7 +30,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-inward-stock-report', diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts index ce5a983..dc7afc5 100644 --- a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts @@ -28,7 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-monthly-report', diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts index 7bee9b9..a405ec2 100644 --- a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts @@ -28,7 +28,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ConfirmationService } from '../../../core/services/confirmation.service'; import { SetLanguageComponent } from 'src/app/app-modules/core/components/set-language.component'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-yearly-report', diff --git a/src/app/app-modules/inventory/shared/service/inventory.service.ts b/src/app/app-modules/inventory/shared/service/inventory.service.ts index 0aa799d..9068ebf 100644 --- a/src/app/app-modules/inventory/shared/service/inventory.service.ts +++ b/src/app/app-modules/inventory/shared/service/inventory.service.ts @@ -24,7 +24,7 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Observable, Subject, throwError } from 'rxjs'; import { environment } from 'src/environments/environment'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Injectable() export class InventoryService { diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts index a5ed4e7..6b7ab66 100644 --- a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts @@ -34,7 +34,7 @@ import { LanguageService } from '../../core/services/language.service'; import { SetLanguageComponent } from '../../core/components/set-language.component'; import { MatTableDataSource } from '@angular/material/table'; import { Subscription } from 'rxjs'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; export interface PeriodicElement { itemName: string; diff --git a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts index 811a716..bc1e01c 100644 --- a/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts +++ b/src/app/app-modules/inventory/store-self-consumption/view-store-self-consumption/view-store-self-consumption.component.ts @@ -31,7 +31,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { ViewStoreSelfConsumptionDetailsComponent } from './view-store-self-consumption-details/view-store-self-consumption-details.component'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-store-self-consumption', diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts index affacb1..bc29933 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts @@ -35,7 +35,7 @@ import { ConfirmationService } from '../../core/services/confirmation.service'; import { InventoryService } from '../shared/service/inventory.service'; import { MatTableDataSource } from '@angular/material/table'; import { Subscription } from 'rxjs'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-store-stock-adjustment', diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts index a7fd3a2..6c6f6cf 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment-draft/view-store-stock-adjustment-draft.component.ts @@ -31,7 +31,7 @@ import { InventoryService } from '../../shared/service/inventory.service'; import { ViewStockAdjustmentDraftDetailsComponent } from '../view-stock-adjustment-draft-details/view-stock-adjustment-draft-details.component'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-store-stock-adjustment-draft', diff --git a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts index 6c01773..3a0c72c 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/view-store-stock-adjustment/view-store-stock-adjustment.component.ts @@ -31,7 +31,7 @@ import { ViewStockAdjustmentDetailsComponent } from '../view-stock-adjustment-de import { InventoryService } from '../../shared/service/inventory.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-store-stock-adjustment', diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts index 582f8a3..3f9c702 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts @@ -35,7 +35,7 @@ import { SetLanguageComponent } from '../../core/components/set-language.compone import { LanguageService } from '../../core/services/language.service'; import * as moment from 'moment'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from '../../core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-store-stock-transfer', templateUrl: './store-stock-transfer.component.html', diff --git a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts index 10241c9..9c8a533 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts +++ b/src/app/app-modules/inventory/store-stock-transfer/view-store-stock-transfer/view-store-stock-transfer.component.ts @@ -31,7 +31,7 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LanguageService } from 'src/app/app-modules/core/services/language.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatPaginator } from '@angular/material/paginator'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-view-store-stock-transfer', templateUrl: './view-store-stock-transfer.component.html', diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts index 83d9dc3..8150a20 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts @@ -26,7 +26,7 @@ import { PrescribedDrugService } from './../shared/service/prescribed-drug.servi import { ConfirmationService } from '../../core/services/confirmation.service'; import { LanguageService } from '../../core/services/language.service'; import { SetLanguageComponent } from '../../core/components/set-language.component'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-rx-dashboard', diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts index a44b8db..45dc969 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts @@ -35,7 +35,7 @@ import { ConfirmationService } from './../../core/services/confirmation.service' import { LanguageService } from '../../core/services/language.service'; import { SetLanguageComponent } from '../../core/components/set-language.component'; import { MatTableDataSource } from '@angular/material/table'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-rx-item-dispense', templateUrl: './rx-item-dispense.component.html', diff --git a/src/app/facility-selection/facility-selection.component.ts b/src/app/facility-selection/facility-selection.component.ts index 955e4e7..e49033f 100644 --- a/src/app/facility-selection/facility-selection.component.ts +++ b/src/app/facility-selection/facility-selection.component.ts @@ -6,7 +6,7 @@ import { FaciltyService } from './facilty.service'; import { ConfirmationService } from '../app-modules/core/services'; import { SetLanguageComponent } from '../app-modules/core/components/set-language.component'; import { LanguageService } from '../app-modules/core/services/language.service'; -import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 804e2eb..8d3be99 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -4,7 +4,7 @@ import { AuthenticationService } from './authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; // import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js'; -import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; import { CookieService } from 'ngx-cookie-service'; @Component({ diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index 68ec9f0..30a3d67 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -31,7 +31,7 @@ import { Location } from '@angular/common'; import { SpinnerService } from '../app-modules/core/services/spinner.service'; import { AuthenticationService } from '../login/authentication.service'; -import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-redir-in', templateUrl: './redir-in.component.html', diff --git a/src/app/reset-password/reset-password.component.ts b/src/app/reset-password/reset-password.component.ts index 14ce77a..dc209ad 100644 --- a/src/app/reset-password/reset-password.component.ts +++ b/src/app/reset-password/reset-password.component.ts @@ -24,7 +24,7 @@ import { Router } from '@angular/router'; import { AuthenticationService } from '../login/authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; -import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-reset-password', diff --git a/src/app/service/service.component.ts b/src/app/service/service.component.ts index 2430029..59ffe2a 100644 --- a/src/app/service/service.component.ts +++ b/src/app/service/service.component.ts @@ -21,7 +21,7 @@ */ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { SessionStorageService } from 'src/app/app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-service', diff --git a/src/app/set-password/set-password.component.ts b/src/app/set-password/set-password.component.ts index 8638a13..0d358fb 100644 --- a/src/app/set-password/set-password.component.ts +++ b/src/app/set-password/set-password.component.ts @@ -25,7 +25,7 @@ import { Router } from '@angular/router'; import { AuthenticationService } from '../login/authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; import * as CryptoJS from 'crypto-js'; -import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-set-password', templateUrl: './set-password.component.html', diff --git a/src/app/set-security-questions/set-security-questions.component.ts b/src/app/set-security-questions/set-security-questions.component.ts index 22f5044..7440c98 100644 --- a/src/app/set-security-questions/set-security-questions.component.ts +++ b/src/app/set-security-questions/set-security-questions.component.ts @@ -26,7 +26,7 @@ import { AuthenticationService } from '../login/authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; import * as CryptoJS from 'crypto-js'; import { AuthService } from '../app-modules/core/services/auth.service'; -import { SessionStorageService } from '../app-modules/core/services/session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Component({ selector: 'app-set-security-questions', diff --git a/src/environments/enckey.ts b/src/environments/enckey.ts deleted file mode 100644 index 3abc5b6..0000000 --- a/src/environments/enckey.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const keys = { - dev: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', - test: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', - prod: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', - ci: '896Y7lbv0qFr1WgppH0NjSNRJZ9nDciBNeH6MA0F1MZDJb0SXhceLPw2kSpdObG1', -}; diff --git a/src/environments/environment.ci.ts.template b/src/environments/environment.ci.ts.template index 631ff26..68c9ad6 100644 --- a/src/environments/environment.ci.ts.template +++ b/src/environments/environment.ci.ts.template @@ -9,10 +9,12 @@ const COMMON_API = '<%= COMMON_API_BASE %>'; const INVENTORY_API = '<%= INVENTORY_API_BASE %>'; const MMU_API = '<%= MMU_API_BASE %>'; const FHIR_API = '<%= FHIR_API_BASE %>'; +const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; export const environment = { production: true, countryId: 1, + encKey: sessionStorageEncKey, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index a343812..6c0a12a 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -20,12 +20,12 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -import { keys } from './enckey'; +const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; export const environment = { production: true, countryId: 1, - encKey: keys.prod, + encKey: sessionStorageEncKey, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index ee45de2..9adb833 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -3,10 +3,10 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "http://183.82.107.186:8080/"; -const inventoryIP = "http://183.82.107.186:8080/"; -const mmuIP = "http://183.82.107.186:8080/"; -const FHIRIP = "http://183.82.107.186:8080/"; +const commonIP = "https://amritwprdev.piramalswasthya.org/"; +const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; +const mmuIP = "https://amritwprdev.piramalswasthya.org/"; +const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; @@ -17,12 +17,12 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -import { keys } from './enckey'; +const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; export const environment = { production: true, countryId: 1, - encKey: keys.test, + encKey: sessionStorageEncKey, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 7d2a9f8..a11997f 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -17,13 +17,13 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -import { keys } from './enckey'; +const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { production: false, countryId: 1, - encKey: keys.dev, + encKey: sessionStorageEncKey, getBeneficiaryDetail: `registrar/get/benDetailsByRegIDForLeftPanelNew`, getBeneficiaryImage: `registrar/getBenImage`, From 11246c40ce79cb763ed89ba3d117dcb8dcedc6ad Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Mon, 16 Dec 2024 13:33:03 +0530 Subject: [PATCH 40/80] sessionstorage service file moved to common-ui --- .../core/components/search/search.component.ts | 4 ++-- .../core/services/batch-search.service.ts | 2 +- .../app-modules/core/services/item-search.service.ts | 2 +- .../core/services/session-storage.service.spec.ts | 2 +- .../indent-request/indent-request.component.ts | 12 ++++++------ .../medicine-dispense/medicine-dispense.component.ts | 8 ++++---- ...tem-batch-details-for-patient-return.component.ts | 2 +- .../physical-stock-entry.component.ts | 6 +++--- .../consumption-report.component.ts | 2 +- .../daily-stock-details-report.component.ts | 2 +- .../daily-stock-summary-report.component.ts | 2 +- .../inward-stock-report.component.ts | 2 +- .../monthly-report/monthly-report.component.ts | 2 +- .../reports/yearly-report/yearly-report.component.ts | 2 +- .../store-stock-adjustment.component.ts | 10 +++++----- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/app/app-modules/core/components/search/search.component.ts b/src/app/app-modules/core/components/search/search.component.ts index d71e5aa..2a399a7 100644 --- a/src/app/app-modules/core/components/search/search.component.ts +++ b/src/app/app-modules/core/components/search/search.component.ts @@ -149,7 +149,7 @@ export class SearchComponent implements OnInit, DoCheck { lastName: this.beneficiary.lastName, genderID: this.beneficiary.gender, // providerServiceMapID: localStorage.getItem('providerServiceID'), - providerServiceMapID: this.sessionstorage.providerServiceID, + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), i_bendemographics: { stateID: this.beneficiary.stateID, districtID: this.beneficiary.districtID, @@ -225,7 +225,7 @@ export class SearchComponent implements OnInit, DoCheck { this.inventoryService .getBeneficaryVisitDetail({ // providerServiceMapID: localStorage.getItem('providerServiceID'), - providerServiceMapID: this.sessionstorage.providerServiceID, + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), beneficiaryID: benID, }) .subscribe((res) => { diff --git a/src/app/app-modules/core/services/batch-search.service.ts b/src/app/app-modules/core/services/batch-search.service.ts index 32e7ff5..dfb50d2 100644 --- a/src/app/app-modules/core/services/batch-search.service.ts +++ b/src/app/app-modules/core/services/batch-search.service.ts @@ -22,7 +22,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable, Inject } from '@angular/core'; import { environment } from 'src/environments/environment'; -import { SessionStorageService } from './session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Injectable() export class BatchSearchService { diff --git a/src/app/app-modules/core/services/item-search.service.ts b/src/app/app-modules/core/services/item-search.service.ts index 81db106..9703d3e 100644 --- a/src/app/app-modules/core/services/item-search.service.ts +++ b/src/app/app-modules/core/services/item-search.service.ts @@ -22,7 +22,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable, Inject } from '@angular/core'; import { environment } from 'src/environments/environment'; -import { SessionStorageService } from './session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; @Injectable() export class ItemSearchService { constructor( diff --git a/src/app/app-modules/core/services/session-storage.service.spec.ts b/src/app/app-modules/core/services/session-storage.service.spec.ts index 78a1335..a710205 100644 --- a/src/app/app-modules/core/services/session-storage.service.spec.ts +++ b/src/app/app-modules/core/services/session-storage.service.spec.ts @@ -1,6 +1,6 @@ import { TestBed } from '@angular/core/testing'; -import { SessionStorageService } from './session-storage.service'; +import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; describe('SessionStorageService', () => { let service: SessionStorageService; diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts index bc79928..677f370 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.ts @@ -273,12 +273,12 @@ export class IndentRequestComponent implements OnInit, DoCheck { toFacilityID: JSON.parse(this.sessionstorage.getItem('facilityDetail') || '{}') .mainFacilityID, // createdBy: localStorage.getItem('username'), - createdBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + createdBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), //userID: localStorage.getItem('userID'), - useriD: this.sessionstorage.userID + useriD: this.sessionstorage.getItem('userID') }; console.log('otherDetails under submitIndentRequest', otherDetails); @@ -357,12 +357,12 @@ export class IndentRequestComponent implements OnInit, DoCheck { toFacilityID: JSON.parse(this.sessionstorage.getItem('facilityDetail') || '{}') //localStorage.getItem('facilityDetail') .mainFacilityID, // createdBy: localStorage.getItem('username'), - createdBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + createdBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), //userID: localStorage.getItem('userID'), - userID: this.sessionstorage.userID, + userID: this.sessionstorage.getItem('userID'), indentID: this.dataStorageService.indentDetails.indentID, orderDate: this.dataStorageService.indentDetails.orderDate, status: this.dataStorageService.indentDetails.status, diff --git a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts index 00c8b33..db910be 100644 --- a/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts +++ b/src/app/app-modules/inventory/medicine-dispense/medicine-dispense.component.ts @@ -103,7 +103,7 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { this.inventoryService .getBeneficaryVisitDetail({ - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), beneficiaryID: this.beneficiaryDetailForm.controls['beneficiaryID'].value, }) @@ -165,7 +165,7 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { ) { this.inventoryService .getBeneficaryVisitDetail({ - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), beneficiaryID: this.beneficiaryDetailForm.controls['beneficiaryID'].value, }) @@ -255,8 +255,8 @@ export class MedicineDispenseComponent implements OnInit, OnDestroy, DoCheck { beneficiaryID: this.beneficiaryID, benRegID: this.beneficiaryVisitDetailList.beneficiaryRegID, // createdBy: localStorage.getItem('username'), - createdBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + createdBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), doctorName: this.visitCode.agentId, facilityID: this.sessionstorage.getItem('facilityID'), gender: this.visitCode.genderName, diff --git a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts index 06a76ff..a051217 100644 --- a/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts +++ b/src/app/app-modules/inventory/patient-return/item-batch-details-for-patient-return/item-batch-details-for-patient-return.component.ts @@ -243,7 +243,7 @@ export class ItemBatchDetailsForPatientReturnComponent item.batchList.forEach((batch: any) => { const returnQuantity = batch.returnQuantity; // const createdBy = localStorage.getItem('userName'); - const createdBy = this.sessionstorage.userName; + const createdBy = this.sessionstorage.getItem('userName'); const batchNo = Object.assign(batch.batchNo, { returnQuantity, createdBy, diff --git a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts index 240a19d..3c73ff1 100644 --- a/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts +++ b/src/app/app-modules/inventory/physical-stock-entry/physical-stock-entry.component.ts @@ -94,10 +94,10 @@ export class PhysicalStockEntryComponent implements OnInit, OnChanges, DoCheck { ngOnInit() { this.otherDetails = { // createdBy: localStorage.getItem('username'), - createdBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + createdBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), // userId: localStorage.getItem('userID'), - userId: this.sessionstorage.userID, + userId: this.sessionstorage.getItem('userID'), facilityID: this.sessionstorage.getItem('facilityID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), diff --git a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts index 7d7b58b..2cb1919 100644 --- a/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts +++ b/src/app/app-modules/inventory/reports/consumption-report/consumption-report.component.ts @@ -131,7 +131,7 @@ export class ConsumptionReportComponent implements OnInit, DoCheck { facilityID: this.consumptionForm.value.facilityName === 'All' ? null - : this.sessionstorage.facilityID, + : this.sessionstorage.getItem('facilityID'), }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts index 488399c..7962f63 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts +++ b/src/app/app-modules/inventory/reports/daily-stock-details-report/daily-stock-details-report.component.ts @@ -131,7 +131,7 @@ export class DailyStockDetailsReportComponent implements OnInit, DoCheck { facilityID: this.dailyStockDetailsForm.value.facilityName === 'All' ? null - : this.sessionstorage.facilityID, + : this.sessionstorage.getItem('facilityID'), }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts index bc28d6e..3a40086 100644 --- a/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts +++ b/src/app/app-modules/inventory/reports/daily-stock-summary-report/daily-stock-summary-report.component.ts @@ -130,7 +130,7 @@ export class DailyStockSummaryReportComponent implements OnInit, DoCheck { facilityID: this.dailyStockSummaryForm.value.facilityName === 'All' ? null - : this.sessionstorage.facilityID, + : this.sessionstorage.getItem('facilityID'), }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts index a732531..a76b7e1 100644 --- a/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts +++ b/src/app/app-modules/inventory/reports/inward-stock-report/inward-stock-report.component.ts @@ -133,7 +133,7 @@ export class InwardStockReportComponent implements OnInit, DoCheck { facilityID: this.inwardStockForm.value.facilityName === 'All' ? null - : this.sessionstorage.facilityID, + : this.sessionstorage.getItem('facilityID'), }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts index dc7afc5..906a68a 100644 --- a/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts +++ b/src/app/app-modules/inventory/reports/monthly-report/monthly-report.component.ts @@ -126,7 +126,7 @@ export class MonthlyReportComponent implements OnInit, DoCheck { facilityID: this.monthlyForm.value.facilityName === 'All' ? null - : this.sessionstorage.facilityID, + : this.sessionstorage.getItem('facilityID'), }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts index a405ec2..0a2379d 100644 --- a/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts +++ b/src/app/app-modules/inventory/reports/yearly-report/yearly-report.component.ts @@ -98,7 +98,7 @@ export class YearlyReportComponent implements OnInit, DoCheck { facilityID: this.yearlyForm.value.facilityName === 'All' ? null - : this.sessionstorage.facilityID, + : this.sessionstorage.getItem('facilityID'), }; console.log( 'Data form data', diff --git a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts index bc29933..fb2de1d 100644 --- a/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts +++ b/src/app/app-modules/inventory/store-stock-adjustment/store-stock-adjustment.component.ts @@ -216,10 +216,10 @@ export class StoreStockAdjustmentComponent const otherDetails = { // createdBy: localStorage.getItem('username'), - createdBy: this.sessionstorage.username, + createdBy: this.sessionstorage.getItem('username'), // modifiedBy: localStorage.getItem('username'), - modifiedBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + modifiedBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), facilityID: this.sessionstorage.getItem('facilityID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), @@ -283,8 +283,8 @@ export class StoreStockAdjustmentComponent const otherDetails = { // createdBy: localStorage.getItem('username'), - createdBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + createdBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), facilityID: this.sessionstorage.getItem('facilityID'), vanID: localStorage.getItem('vanID'), parkingPlaceID: localStorage.getItem('parkingPlaceID'), From c32ce8c7a142545d74e1b7a47ab21a3e1a666cbb Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Mon, 16 Dec 2024 13:34:33 +0530 Subject: [PATCH 41/80] sessionstorage import path change --- .../core/components/app-header/app-header.component.ts | 10 +++++----- .../beneficiary-details.component.ts | 4 ++-- .../store-self-consumption.component.ts | 4 ++-- .../store-stock-transfer.component.ts | 6 +++--- .../rx/rx-dashboard/rx-dashboard.component.ts | 6 +++--- .../facility-selection/facility-selection.component.ts | 2 +- src/app/login/login.component.ts | 6 +++--- src/app/redir-in/redir-in.component.ts | 10 +++++----- src/app/reset-password/reset-password.component.ts | 7 +++---- src/app/service/service.component.ts | 2 +- src/app/set-password/set-password.component.ts | 2 +- .../set-security-questions.component.ts | 4 ++-- 12 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/app/app-modules/core/components/app-header/app-header.component.ts b/src/app/app-modules/core/components/app-header/app-header.component.ts index fea3616..3d62cd0 100644 --- a/src/app/app-modules/core/components/app-header/app-header.component.ts +++ b/src/app/app-modules/core/components/app-header/app-header.component.ts @@ -67,7 +67,7 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke this.getUIVersionAndCommitDetails(); // this.servicePoint = localStorage.getItem('servicePointName'); // const userName = localStorage.getItem('userName'); - const userName = this.sessionstorage.userName; + const userName = this.sessionstorage.getItem('userName'); if (userName != null) { this.userName = userName; } @@ -79,7 +79,7 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke this.isExternal = this.sessionstorage.getItem('isExternal') == 'true'; this.parent_app = this.sessionstorage.getItem('host'); // const providerServiceID = localStorage.getItem('providerServiceID'); - const providerServiceID = this.sessionstorage.providerServiceID; + const providerServiceID = this.sessionstorage.getItem('providerServiceID'); if (providerServiceID != null) { this.providerServiceID = providerServiceID; } @@ -132,9 +132,9 @@ export class AppHeaderComponent implements OnInit, OnChanges, AfterContentChecke } // sessionStorage.setItem('designation', this.designation); - this.sessionstorage.userID=res.data.userID; - this.sessionstorage.userName=res.data.userName; - this.sessionstorage.username=res.data.userName; + this.sessionstorage.setItem('userID', res.data.userID); + this.sessionstorage.setItem('userName', res.data.userName); + this.sessionstorage.setItem('username', res.data.userName); } else { this.confirmationService.alert('Seems you are logged in from somewhere else, Logout from there & try back in.', 'error'); } diff --git a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts index a653ef0..8cd03f7 100644 --- a/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts +++ b/src/app/app-modules/core/components/beneficiary-details/beneficiary-details.component.ts @@ -53,11 +53,11 @@ export class BeneficiaryDetailsComponent implements OnInit, DoCheck, OnDestroy { ngOnInit() { this.today = new Date(); //const healthIDValue: any = localStorage.getItem('healthID'); - const healthIDValue: any = this.sessionstorage.healthID; + const healthIDValue: any = this.sessionstorage.getItem('healthID'); this.healthIDValue = healthIDValue; this.route.params.subscribe((param) => { // const benFlowId: any = localStorage.getItem('benFlowID'); - const benFlowId: any = this.sessionstorage.benFlowID; + const benFlowId: any = this.sessionstorage.getItem('benFlowID'); this.beneficiaryDetailsService.getBeneficiaryDetails( param['beneficiaryRegID'], benFlowId, diff --git a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts index 6b7ab66..860f3b9 100644 --- a/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts +++ b/src/app/app-modules/inventory/store-self-consumption/store-self-consumption.component.ts @@ -86,10 +86,10 @@ export class StoreSelfConsumptionComponent implements OnInit, DoCheck { ngOnInit() { // this.createdBy = localStorage.getItem('username'); - this.createdBy = this.sessionstorage.username; + this.createdBy = this.sessionstorage.getItem('username'); this.facilityID = this.sessionstorage.getItem('facilityID'); this.fetchLanguageResponse(); - this.providerServiceMapID = this.sessionstorage.providerServiceID; //localStorage.getItem('providerServiceID'); + this.providerServiceMapID = this.sessionstorage.getItem('providerServiceID'); //localStorage.getItem('providerServiceID'); if (this.facilityID === null || this.facilityID <= 0) { this.router.navigate(['/inventory']); diff --git a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts index 3f9c702..d3f7869 100644 --- a/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts +++ b/src/app/app-modules/inventory/store-stock-transfer/store-stock-transfer.component.ts @@ -103,7 +103,7 @@ export class StoreStockTransferComponent implements OnInit, DoCheck { } getAllStore() { - const serviceProviderId = this.sessionstorage.providerServiceID; //localStorage.getItem('providerServiceID'); + const serviceProviderId = this.sessionstorage.getItem('providerServiceID'); //localStorage.getItem('providerServiceID'); this.inventoryService.getAllStore(serviceProviderId).subscribe((data) => { console.log('data****', data); const newArr: any = Object.entries(data).map(([key, value]) => value); @@ -183,8 +183,8 @@ export class StoreStockTransferComponent implements OnInit, DoCheck { this.stockTransferForm.patchValue({ dated: moment(new Date()).format('DD/MM/YYYY'), // createdBy: localStorage.getItem('username'), -createdBy: this.sessionstorage.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), +createdBy: this.sessionstorage.getItem('username'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), }); } diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts index 8150a20..7e9dab1 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.ts @@ -64,7 +64,7 @@ export class RxDashboardComponent implements OnInit, DoCheck { this.fetchLanguageResponse(); this.parent_url = this.sessionstorage.getItem('return'); // this.username = localStorage.getItem('username'); - this.username = this.sessionstorage.username; + this.username = this.sessionstorage.getItem('username'); this.getBenDetails(); this.getPrescriptionDetails(); } @@ -75,7 +75,7 @@ export class RxDashboardComponent implements OnInit, DoCheck { this.route.params.subscribe((param) => { this.benRegID = param['beneficiaryRegID']; // const benFlowID: any = localStorage.getItem('benFlowID'); - const benFlowID: any = this.sessionstorage.benFlowID; + const benFlowID: any = this.sessionstorage.getItem('benFlowID'); this.beneficiaryDetailsService.getBeneficiaryDetails( this.benRegID, benFlowID, @@ -180,7 +180,7 @@ export class RxDashboardComponent implements OnInit, DoCheck { beneficiaryID: beneficiary.beneficiaryID, benRegID: beneficiary.beneficiaryRegID, createdBy: this.username, - providerServiceMapID: this.sessionstorage.providerServiceID, //localStorage.getItem('providerServiceID'), + providerServiceMapID: this.sessionstorage.getItem('providerServiceID'), //localStorage.getItem('providerServiceID'), doctorName: prescription.consultantName, gender: beneficiary.genderName, issueType: this.issueType === 0 ? 'Manual' : 'System', diff --git a/src/app/facility-selection/facility-selection.component.ts b/src/app/facility-selection/facility-selection.component.ts index e49033f..26611fd 100644 --- a/src/app/facility-selection/facility-selection.component.ts +++ b/src/app/facility-selection/facility-selection.component.ts @@ -45,7 +45,7 @@ export class FacilitySelectionComponent implements OnInit, DoCheck { localStorage.removeItem('facilityDetail'); localStorage.removeItem('facilityID'); this.fetchLanguageResponse(); - this.serviceProviderId = this.sessionstorage.providerServiceID; //localStorage.getItem('providerServiceID'); + this.serviceProviderId = this.sessionstorage.getItem('providerServiceID'); //localStorage.getItem('providerServiceID'); this.getAllStores(); } diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 8d3be99..3e7a2c6 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -203,10 +203,10 @@ export class LoginComponent implements OnInit { // localStorage.setItem('designation', this.designation); //localStorage.setItem('userID', loginDataResponse.userID); // localStorage.setItem('userName', loginDataResponse.userName); - this.sessionstorage.userID=loginDataResponse.userID; - this.sessionstorage.userName=loginDataResponse.userName; + this.sessionstorage.setItem('userID', loginDataResponse.userID); + this.sessionstorage.setItem('userName', loginDataResponse.userName); // localStorage.setItem('username', this.userName); - this.sessionstorage.username=loginDataResponse.userName; + this.sessionstorage.setItem('username', loginDataResponse.userName); const services = loginDataResponse.previlegeObj.map((item: any) => { if (item.roles[0].serviceRoleScreenMappings[0].providerServiceMapping.serviceID == '9' || item.roles[0].serviceRoleScreenMappings[0].providerServiceMapping.serviceID == '2') { return { diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index 30a3d67..f9a09df 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -165,7 +165,7 @@ export class RedirInComponent implements OnInit { this.sessionstorage.setItem('parentBen', this.externalSession.ben); this.sessionstorage.setItem('parentBenVisit', this.externalSession.visit); // localStorage.setItem('benFlowID', this.externalSession.flowID); - this.sessionstorage.benFlowID = this.externalSession.flowID; + this.sessionstorage.setItem('benFlowID', this.externalSession.flowID); localStorage.setItem('vanID', this.externalSession.vanID); localStorage.setItem('parkingPlaceID', this.externalSession.parkingPlaceID); localStorage.setItem( @@ -178,7 +178,7 @@ export class RedirInComponent implements OnInit { this.externalSession.currentLanguage, ); // localStorage.setItem('healthID', this.externalSession.healthID); - this.sessionstorage.healthID = this.externalSession.healthID; + this.sessionstorage.setItem('healthID', this.externalSession.healthID); this.fallback = this.sessionstorage.getItem('fallback'); this.checkSession(); @@ -281,9 +281,9 @@ export class RedirInComponent implements OnInit { ); // localStorage.setItem('username', loginDataResponse.userName); // localStorage.setItem('userName', loginDataResponse.userName); - this.sessionstorage.username=loginDataResponse.userName; - this.sessionstorage.userName=loginDataResponse.userName; - this.sessionstorage.userID=loginDataResponse.userID; + this.sessionstorage.setItem('username', loginDataResponse.userName); + this.sessionstorage.setItem('userName', loginDataResponse.userName); + this.sessionstorage.setItem('userID', loginDataResponse.userID); //localStorage.setItem('userID', loginDataResponse.userID); localStorage.setItem( 'designation', diff --git a/src/app/reset-password/reset-password.component.ts b/src/app/reset-password/reset-password.component.ts index dc209ad..b606a66 100644 --- a/src/app/reset-password/reset-password.component.ts +++ b/src/app/reset-password/reset-password.component.ts @@ -58,7 +58,7 @@ export class ResetPasswordComponent { wrong_answer_msg: any = ''; getQuestions(username: any) { - this.sessionstorage.userID=username; + this.sessionstorage.setItem('userID', username); //localStorage.setItem('userID', username); this.authService.getUserSecurityQuestionsAnswer(username).subscribe( (response: any) => { @@ -142,8 +142,7 @@ export class ResetPasswordComponent { this.authService .validateSecurityQuestionAndAnswer( this.userFinalAnswers, - // localStorage.getItem('userID'), - this.sessionstorage.userID + this.sessionstorage.getItem('userID'), ) .subscribe( (response: any) => { @@ -153,7 +152,7 @@ export class ResetPasswordComponent { this.authService.transactionId = response.data.transactionId; } else { //this.getQuestions(localStorage.getItem('userID')); - this.getQuestions(this.sessionstorage.userID); + this.getQuestions(this.sessionstorage.getItem('userID')); this.onFailureNavigateToResetPassword(response); } }, diff --git a/src/app/service/service.component.ts b/src/app/service/service.component.ts index 59ffe2a..eb4a82b 100644 --- a/src/app/service/service.component.ts +++ b/src/app/service/service.component.ts @@ -48,7 +48,7 @@ export class ServiceComponent implements OnInit { selectService(service: any): void { // localStorage.setItem('providerServiceID', service.providerServiceID); - this.sessionstorage.providerServiceID = service.providerServiceID; + this.sessionstorage.setItem('providerServiceID', service.providerServiceID); this.sessionstorage.setItem('apimanClientKey', service.apimanClientKey); this.router.navigate(['/facility']); } diff --git a/src/app/set-password/set-password.component.ts b/src/app/set-password/set-password.component.ts index 0d358fb..d9909ac 100644 --- a/src/app/set-password/set-password.component.ts +++ b/src/app/set-password/set-password.component.ts @@ -105,7 +105,7 @@ export class SetPasswordComponent implements OnInit { ngOnInit() { // this.uname = localStorage.getItem('userID'); - this.uname = this.sessionstorage.userID; + this.uname = this.sessionstorage.getItem('userID'); } showPWD() { diff --git a/src/app/set-security-questions/set-security-questions.component.ts b/src/app/set-security-questions/set-security-questions.component.ts index 7440c98..ec5315c 100644 --- a/src/app/set-security-questions/set-security-questions.component.ts +++ b/src/app/set-security-questions/set-security-questions.component.ts @@ -58,9 +58,9 @@ export class SetSecurityQuestionsComponent implements OnInit { ngOnInit() { // this.uid = localStorage.getItem('userID'); - this.uid = this.sessionstorage.userID + this.uid = this.sessionstorage.getItem('userID') // this.uname = localStorage.getItem('username'); - this.uname = this.sessionstorage.username; + this.uname = this.sessionstorage.getItem('username'); this.authService.getSecurityQuestions().subscribe( (response: any) => this.handleSuccess(response), (error: any) => this.handleError(error), From 20f449008c4c95241c18473ab70bed39db889ccc Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Wed, 18 Dec 2024 14:04:19 +0530 Subject: [PATCH 42/80] remove JWT tokken setItem --- .../core/services/http-interceptor.service.ts | 5 +---- src/app/login/login.component.ts | 9 ++------- src/environments/environment.prod.ts | 2 +- src/environments/environment.test.ts | 2 +- src/environments/environment.ts | 4 ++-- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/app/app-modules/core/services/http-interceptor.service.ts b/src/app/app-modules/core/services/http-interceptor.service.ts index 1903c79..1d047e1 100644 --- a/src/app/app-modules/core/services/http-interceptor.service.ts +++ b/src/app/app-modules/core/services/http-interceptor.service.ts @@ -35,7 +35,6 @@ import { Router } from '@angular/router'; import { throwError } from 'rxjs/internal/observable/throwError'; import { SpinnerService } from './spinner.service'; import { ConfirmationService } from './confirmation.service'; -import { CookieService } from 'ngx-cookie-service'; import { environment } from 'src/environments/environment'; @Injectable({ @@ -49,7 +48,6 @@ export class HttpInterceptorService implements HttpInterceptor { private router: Router, private confirmationService: ConfirmationService, private http: HttpClient, - private cookieService: CookieService, ) {} intercept( @@ -58,10 +56,9 @@ export class HttpInterceptorService implements HttpInterceptor { ): Observable> { const key: any = sessionStorage.getItem('key'); let modifiedReq = null; - const tokn = this.cookieService.get('Jwttoken'); if (key !== undefined && key !== null) { modifiedReq = req.clone({ - headers: req.headers.set('Authorization', key).set('Jwttoken', tokn), + headers: req.headers.set('Authorization', key), }); } else { modifiedReq = req.clone({ diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 3e7a2c6..8913874 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -5,7 +5,6 @@ import { ConfirmationService } from '../app-modules/core/services/confirmation.s // import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js'; import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; -import { CookieService } from 'ngx-cookie-service'; @Component({ selector: 'app-login-cmp', @@ -32,7 +31,6 @@ export class LoginComponent implements OnInit { private authService: AuthenticationService, private confirmationService: ConfirmationService, readonly sessionstorage:SessionStorageService, - private cookieService: CookieService, private router: Router) { this._keySize = 256; this._ivSize = 128; @@ -106,8 +104,7 @@ export class LoginComponent implements OnInit { .subscribe(res => { if (res.statusCode == '200') { if (res.data.previlegeObj && res.data.previlegeObj[0]) { - this.cookieService.set('Jwttoken', res.data.Jwttoken); - delete res.data.Jwttoken; + this.sessionstorage.setItem('loginDataResponse', JSON.stringify(res.data)); this.checkRoleMapped(res.data); } else { @@ -122,8 +119,7 @@ export class LoginComponent implements OnInit { this.authService.login(this.userName, encryptPassword, true).subscribe((userLoggedIn) => { if (userLoggedIn.statusCode == '200') { if (userLoggedIn.data.previlegeObj != null && userLoggedIn.data.previlegeObj != undefined && userLoggedIn.data.previlegeObj[0]) { - this.cookieService.set('Jwttoken', userLoggedIn.data.Jwttoken); - delete userLoggedIn.data.Jwttoken; + this.checkRoleMapped(userLoggedIn.data); } else { this.confirmationService.alert('Seems you are logged in from somewhere else, Logout from there & try back in.', 'error'); @@ -197,7 +193,6 @@ export class LoginComponent implements OnInit { checkDesignationWithRole(loginDataResponse: any) { if (this.roleArray.includes(this.designation)) { - console.error("Nagendra-------------1",loginDataResponse.key); sessionStorage.setItem('key', loginDataResponse.key); this.sessionstorage.setItem('designation', this.designation); // localStorage.setItem('designation', this.designation); diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 6c0a12a..2dfd1f2 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -20,7 +20,7 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; +const sessionStorageEncKey = '<>'; export const environment = { production: true, diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 9adb833..2eaa0f8 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -17,7 +17,7 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; +const sessionStorageEncKey = '<>'; export const environment = { production: true, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index a11997f..ca50c64 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -16,8 +16,8 @@ const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; +const FHIR_API = `${FHIRIP}fhirapi-v3.0.0/`; +const sessionStorageEncKey = 'asdfghjklkjhgfd'; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { From 524a65026c2f2fecd5434e5469a45e17e8f2aaf1 Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Wed, 18 Dec 2024 17:56:29 +0530 Subject: [PATCH 43/80] remove Enckey --- src/environments/environment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/environments/environment.ts b/src/environments/environment.ts index ca50c64..845d633 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -17,7 +17,7 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v3.0.0/`; -const sessionStorageEncKey = 'asdfghjklkjhgfd'; +const sessionStorageEncKey = '<>'; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { From dce649cac3a317a63b40f7eb50410f3d1366a740 Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Sat, 21 Dec 2024 09:30:11 +0530 Subject: [PATCH 44/80] sessionStorageEncKey value emity --- src/environments/environment.prod.ts | 2 +- src/environments/environment.test.ts | 2 +- src/environments/environment.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 2dfd1f2..d6333d0 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -20,7 +20,7 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -const sessionStorageEncKey = '<>'; +const sessionStorageEncKey = ''; export const environment = { production: true, diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 2eaa0f8..2c8877c 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -17,7 +17,7 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; -const sessionStorageEncKey = '<>'; +const sessionStorageEncKey = ''; export const environment = { production: true, diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 845d633..58ed669 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -17,7 +17,7 @@ const COMMON_API = `${commonIP}commonapi-v3.0.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; const FHIR_API = `${FHIRIP}fhirapi-v3.0.0/`; -const sessionStorageEncKey = '<>'; +const sessionStorageEncKey = ''; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { From 7c05fc33b956d95a3aa5318032b49b46857ca8e8 Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Tue, 24 Dec 2024 17:07:30 +0530 Subject: [PATCH 45/80] login request body --- src/app/app-modules/core/services/auth.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/app-modules/core/services/auth.service.ts b/src/app/app-modules/core/services/auth.service.ts index f7203d7..9d4469e 100644 --- a/src/app/app-modules/core/services/auth.service.ts +++ b/src/app/app-modules/core/services/auth.service.ts @@ -43,6 +43,7 @@ export class AuthService { userName: userName, password: password, doLogout: doLogout, + withCredentials: true, }); } From e199d53fef7e242cad7632f8063fe76176a4b7ea Mon Sep 17 00:00:00 2001 From: NKOKKILIGADDA87 Date: Tue, 24 Dec 2024 17:50:25 +0530 Subject: [PATCH 46/80] login request body --- src/app/login/authentication.service.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/login/authentication.service.ts b/src/app/login/authentication.service.ts index 3ba6745..b69fafc 100644 --- a/src/app/login/authentication.service.ts +++ b/src/app/login/authentication.service.ts @@ -40,6 +40,8 @@ export class AuthenticationService { userName: userName, password: password, doLogout: doLogout, + withCredentials: true, + }); } From f260bbddf794b3bdc73621bddc94e30810546d50 Mon Sep 17 00:00:00 2001 From: Sneha6003 <147996970+Sneha6003@users.noreply.github.com> Date: Tue, 21 Jan 2025 10:13:26 +0530 Subject: [PATCH 47/80] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 6bf6bba..cee1891 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,12 @@ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To u ## Further help To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. + +## Filing Issues + +If you encounter any issues, bugs, or have feature requests, please file them in the [main AMRIT repository](https://github.com/PSMRI/AMRIT/issues). Centralizing all feedback helps us streamline improvements and address concerns efficiently. + +## Join Our Community + +We’d love to have you join our community discussions and get real-time support! +Join our [Discord server](https://discord.gg/FVQWsf5ENS) to connect with contributors, ask questions, and stay updated. From bf8f503f6229a7cc445544d3265719600b6df3bd Mon Sep 17 00:00:00 2001 From: sandipkarmakar3 Date: Thu, 23 Jan 2025 21:16:51 +0530 Subject: [PATCH 48/80] ready to merge with develop --- src/environments/environment.prod.ts | 8 ++++---- src/environments/environment.test.ts | 8 ++++---- src/environments/environment.ts | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index d6333d0..819a819 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -15,10 +15,10 @@ const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; -const COMMON_API = `${commonIP}commonapi-v3.0.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; -const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; +const COMMON_API = `${commonIP}commonapi-v1.0/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; +const MMU_API = `${mmuIP}mmuapi-v1.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; const sessionStorageEncKey = ''; diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 2c8877c..5586f13 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -12,10 +12,10 @@ const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; -const COMMON_API = `${commonIP}commonapi-v3.0.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; -const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; +const COMMON_API = `${commonIP}commonapi-v1.0/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; +const MMU_API = `${mmuIP}mmuapi-v1.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; const sessionStorageEncKey = ''; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 58ed669..3358e57 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -12,11 +12,11 @@ const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v3.0.0/`; -const COMMON_API = `${commonIP}commonapi-v3.0.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v3.0.0/`; -const MMU_API = `${mmuIP}mmuapi-v3.0.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v3.0.0/`; +const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; +const COMMON_API = `${commonIP}commonapi-v1.0/`; +const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; +const MMU_API = `${mmuIP}mmuapi-v1.0/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; const sessionStorageEncKey = ''; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; From 21f9bfb7d2de8408e3585e833784d725287a4c38 Mon Sep 17 00:00:00 2001 From: Asp-Codes Date: Thu, 30 Jan 2025 17:43:45 +0530 Subject: [PATCH 49/80] assigned port 4207 and updated the env for local development --- .gitignore | 2 ++ angular.json | 5 ++++- .../{environment.ts => environment.local.ts} | 18 +++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) rename src/environments/{environment.ts => environment.local.ts} (93%) diff --git a/.gitignore b/.gitignore index 0711527..9fdc4c3 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ testem.log # System files .DS_Store Thumbs.db + +src/environments/environment.ts diff --git a/angular.json b/angular.json index a95de96..14219d3 100644 --- a/angular.json +++ b/angular.json @@ -106,7 +106,10 @@ "browserTarget": "HWC-Inventory-UI:build:development" } }, - "defaultConfiguration": "development" + "defaultConfiguration": "development", + "options": { + "port": 4207 + } }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", diff --git a/src/environments/environment.ts b/src/environments/environment.local.ts similarity index 93% rename from src/environments/environment.ts rename to src/environments/environment.local.ts index 3b2b488..5d9c32c 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.local.ts @@ -3,20 +3,20 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "https://amritwprdev.piramalswasthya.org/"; -const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; -const mmuIP = "https://amritwprdev.piramalswasthya.org/"; -const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; +const commonIP = "http://localhost"; +const inventoryIP = "http://localhost"; +const mmuIP = "http://localhost"; +const FHIRIP = "http://localhost"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; // const MMU_API = `http://${IP}:8080/apiman-gateway/IEMR/MMU/1.0/`; -const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; -const COMMON_API = `${commonIP}commonapi-v1.0/`; -const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; -const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; +const COMMON_API_OPEN = `${commonIP}:8083/`; +const COMMON_API = `${commonIP}:8083/`; +const INVENTORY_API = `${inventoryIP}:8086/`; +const MMU_API = `${mmuIP}:8087/`; +const FHIR_API = `${FHIRIP}:8093/`; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; export const environment = { From 6ffa35a025623f5918892635efd5b11c14306437 Mon Sep 17 00:00:00 2001 From: sandipkarmakar3 Date: Thu, 30 Jan 2025 17:58:41 +0530 Subject: [PATCH 50/80] -wasa removed --- WEB-INF/jboss-web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WEB-INF/jboss-web.xml b/WEB-INF/jboss-web.xml index cb191f6..4f8f2a4 100644 --- a/WEB-INF/jboss-web.xml +++ b/WEB-INF/jboss-web.xml @@ -1,3 +1,3 @@ - /hwc-inventory-wasa + /hwc-inventory \ No newline at end of file From 169b6bce896d5a9836ed38df91fdb2693afa980e Mon Sep 17 00:00:00 2001 From: sandipkarmakar3 Date: Fri, 31 Jan 2025 13:39:54 +0530 Subject: [PATCH 51/80] comments are resolved --- src/app/app.component.spec.ts | 6 +++--- src/assets/English.json | 2 +- src/environments/environment.prod.ts | 2 +- src/environments/environment.test.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index cf801ff..10365bc 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -14,16 +14,16 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); }); - it(`should have as title 'HWC-Inventory-UI-NEXT'`, () => { + it(`should have as title 'HWC-Inventory-UI'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('HWC-Inventory-UI-NEXT'); + expect(app.title).toEqual('HWC-Inventory-UI'); }); it('should render title', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI-NEXT app is running!'); + expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI app is running!'); }); }); diff --git a/src/assets/English.json b/src/assets/English.json index fc07eb5..cfa87e7 100644 --- a/src/assets/English.json +++ b/src/assets/English.json @@ -191,7 +191,7 @@ "prescriptionID": "Prescription ID", "visitCode": "Visit Code", "consultantName": "Consultant Name", - "noMedicalitemstoDisptach": "No Medical items to Disptach", + "noMedicalitemstoDisptach": "No Medical items to Dispatch", "form": "Form", "duration": "Duration", "frequency": "Frequency", diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 819a819..47f603c 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -19,7 +19,7 @@ const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; const COMMON_API = `${commonIP}commonapi-v1.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; const sessionStorageEncKey = ''; export const environment = { diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 5586f13..29aa684 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -16,7 +16,7 @@ const COMMON_API_OPEN = `${commonIP}commonapi-v1.0/`; const COMMON_API = `${commonIP}commonapi-v1.0/`; const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; const MMU_API = `${mmuIP}mmuapi-v1.0/`; -const FHIR_API = `${FHIRIP}fhirapi-v1.2/`; +const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; const sessionStorageEncKey = ''; export const environment = { From 888ff121e0f00bbcf01dce56fd3bc011b302aced Mon Sep 17 00:00:00 2001 From: Mithun James Date: Thu, 13 Feb 2025 20:01:01 +0530 Subject: [PATCH 52/80] Add LICENSE and CODE_OF_CONDUCT --- CODE_OF_CONDUCT.md | 128 +++++++++ LICENSE | 674 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 802 insertions(+) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..2c1a28f --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +amrit@piramalswasthya.org. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From 8cfb9f8c609688c4e21e651083511810b66ee2ab Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Fri, 4 Apr 2025 01:57:38 +0530 Subject: [PATCH 53/80] fix: Updated the build Scripts , and workflows to successful build. --- .github/workflows/build-on-pull-request.yml | 8 +++++++- .github/workflows/package.yml | 2 +- .gitmodules | 2 +- Common-UI | 2 +- angular.json | 11 ++++++++--- package.json | 15 +++++++++------ scripts/ci-prebuild.js | 1 + src/app/app-modules/core/services/auth.service.ts | 2 +- 8 files changed, 29 insertions(+), 14 deletions(-) mode change 100644 => 100755 scripts/ci-prebuild.js diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml index a42d53a..56586f6 100644 --- a/.github/workflows/build-on-pull-request.yml +++ b/.github/workflows/build-on-pull-request.yml @@ -8,11 +8,17 @@ jobs: Build: runs-on: ubuntu-latest steps: - - name: Checkout code + - name: Checkout code with submodules uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} + submodules: true + + - name: Update submodules manually (if needed) + run: | + git submodule init + git submodule update --recursive - name: Setup JDK 17 uses: actions/setup-java@v2 diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 8467403..dec08b6 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -44,7 +44,7 @@ jobs: run: jar -cvf hwc-inventory-ui.war -C dist . - name: Upload WAR file as artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: HWC-Inventory-UI path: hwc-inventory-ui.war diff --git a/.gitmodules b/.gitmodules index e511780..eacb61e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "Common-UI"] path = Common-UI - url = https://github.com/PSMRI/Common-UI.git + url = https://github.com/PSMRI/Common-UI diff --git a/Common-UI b/Common-UI index d12389e..71a2236 160000 --- a/Common-UI +++ b/Common-UI @@ -1 +1 @@ -Subproject commit d12389e2e433de99af585fef88d452ea137625e3 +Subproject commit 71a223686e9f4bae4e425be286d362a23998cb2a diff --git a/angular.json b/angular.json index 14219d3..58ebc8e 100644 --- a/angular.json +++ b/angular.json @@ -53,15 +53,20 @@ } ], "outputHashing": "all", - "optimization": true + "optimization": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] }, "development": { "buildOptimizer": false, "optimization": false, "vendorChunk": true, "extractLicenses": false, - "sourceMap": true, - "namedChunks": true + "sourceMap": true }, "ci": { "budgets": [ diff --git a/package.json b/package.json index d55b4ab..b0564ff 100644 --- a/package.json +++ b/package.json @@ -4,16 +4,17 @@ "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build", + "prebuild": "(test -f src/environments/environment.ts || touch src/environments/environment.ts)", + "build": "npm run prebuild && ng build", "watch": "ng build --watch --configuration development", "test": "ng test", "lint": "ng lint", "prepare": "husky install", "e2e": "ng e2e", - "build-dev": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=development --aot", - "build-prod": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=production --aot", - "build-ci": "chmod +x ./scripts/*.js && ./scripts/ci-prebuild.js && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=ci --aot", - "build-test": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=test --aot" + "build-dev": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=development --aot", + "build-prod": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=production --aot", + "build-ci": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && chmod +x ./scripts/*.js && ./scripts/ci-prebuild.js && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=ci --aot", + "build-test": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=test --aot" }, "lint-staged": { "src/**/*.{ts,css,html}": [ @@ -40,7 +41,9 @@ "file-saver": "^2.0.5", "hwc-inventory-ui": "file:", "ng-cryptostore": "^16.0.0", + "ng2-smart-table": "^1.2.1", "ngx-cookie-service": "^16.1.0", + "node-sass": "^9.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -72,6 +75,6 @@ "lint-staged": "^15.2.2", "prettier": "^3.2.5", "prettier-eslint": "^16.3.0", - "typescript": "~5.1.3" + "typescript": "^5.1.3" } } diff --git a/scripts/ci-prebuild.js b/scripts/ci-prebuild.js old mode 100644 new mode 100755 index a51127f..2926f9d --- a/scripts/ci-prebuild.js +++ b/scripts/ci-prebuild.js @@ -43,6 +43,7 @@ const defaultEnvValues = { INVENTORY_API_BASE: '', MMU_API_BASE: '', FHIR_API_BASE: '', + SESSION_STORAGE_ENC_KEY: '' }; // Generate output data diff --git a/src/app/app-modules/core/services/auth.service.ts b/src/app/app-modules/core/services/auth.service.ts index 9d4469e..fe3f490 100644 --- a/src/app/app-modules/core/services/auth.service.ts +++ b/src/app/app-modules/core/services/auth.service.ts @@ -48,7 +48,7 @@ export class AuthService { } getUserDetails() { - return this.http.post(environment.getUserAuth, {}); + return this.http.post(environment.getSessionExistsURL, {}); } // /* AN4085822 - Concurrent login issue*/ From efe6fea8b76a8ff40c33a6e4ee2c3090ac241f26 Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Sat, 5 Apr 2025 12:17:21 +0530 Subject: [PATCH 54/80] fix :updated the workflows and fixed linting to now include .js,.jsx overriding --- .eslintrc.json | 39 ++++++++++++++++----- .github/workflows/build-on-pull-request.yml | 2 +- package.json | 3 +- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index fa6fd43..1cba11b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,9 +5,7 @@ ], "overrides": [ { - "files": [ - "*.ts" - ], + "files": ["*.ts"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", @@ -34,18 +32,41 @@ "@typescript-eslint/no-explicit-any": 0, "@typescript-eslint/no-empty-function": 0, "@typescript-eslint/no-unused-vars": 0, - "@angular-eslint/template/click-events-have-key-events": 0 + "@angular-eslint/template/click-events-have-key-events": 0, + "eqeqeq": 1 } }, { - "files": [ - "*.html" - ], + "files": ["*.html"], "extends": [ "plugin:@angular-eslint/template/recommended", - "plugin:@angular-eslint/template/accessibility" + "plugin:@angular-eslint/template/accessibility", + "plugin:prettier/recommended" ], - "rules": {} + "rules": { + "prettier/prettier": [ + "error", + { + "parser": "angular" + } + ] + } + }, + { + "files": ["*.js", "*.jsx"], + "env": { + "node": true + }, + "extends": ["eslint:recommended"], + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "rules": { + "no-unused-vars": "warn", + "no-console": "error", + "eqeqeq": ["error", "always"] + } } ] } diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml index 56586f6..328a338 100644 --- a/.github/workflows/build-on-pull-request.yml +++ b/.github/workflows/build-on-pull-request.yml @@ -39,4 +39,4 @@ jobs: npm install ng2-smart-table@1.2.1 npm install node-sass npm install --force - npm run build + npm run build-ci diff --git a/package.json b/package.json index b0564ff..7820546 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,7 @@ "scripts": { "ng": "ng", "start": "ng serve", - "prebuild": "(test -f src/environments/environment.ts || touch src/environments/environment.ts)", - "build": "npm run prebuild && ng build", + "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test", "lint": "ng lint", From 062788352987e077e4d053e4879816d077877f8d Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Wed, 9 Apr 2025 01:08:46 +0530 Subject: [PATCH 55/80] fix: upgraded from @v3 to @v4 --- .github/workflows/build-on-pull-request.yml | 2 - .github/workflows/package-prod.yml | 10 +- .github/workflows/package.yml | 10 +- .gitignore | 1 + package-lock.json | 128 ++++++-------------- package.json | 2 - 6 files changed, 45 insertions(+), 108 deletions(-) diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml index 328a338..162fd58 100644 --- a/.github/workflows/build-on-pull-request.yml +++ b/.github/workflows/build-on-pull-request.yml @@ -36,7 +36,5 @@ jobs: npm config set legacy-peer-deps true npm install -g @angular/cli npm install typescript@5.1.3 --save-dev - npm install ng2-smart-table@1.2.1 - npm install node-sass npm install --force npm run build-ci diff --git a/.github/workflows/package-prod.yml b/.github/workflows/package-prod.yml index 7edf1bb..e1e2526 100644 --- a/.github/workflows/package-prod.yml +++ b/.github/workflows/package-prod.yml @@ -16,18 +16,18 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'adopt' - name: Set up Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 18 @@ -38,14 +38,12 @@ jobs: npm install -g @angular/cli npm install -g grunt-cli npm install typescript@5.1.3 --save-dev - npm install ng2-smart-table@1.2.1 - npm install node-sass --force npm install --force ng build --configuration production - name: Upload WAR file as artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: HWC-Inventory-UI path: dist/hwc-inventory-ui/hwc-inventory-ui.war diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index dec08b6..be74ad0 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -16,17 +16,17 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'adopt' - name: Set up Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 18 @@ -35,8 +35,6 @@ jobs: npm config set legacy-peer-deps true npm install -g @angular/cli npm install typescript@5.1.3 --save-dev - npm install ng2-smart-table@1.2.1 - npm install node-sass npm install --force npm run build @@ -44,7 +42,7 @@ jobs: run: jar -cvf hwc-inventory-ui.war -C dist . - name: Upload WAR file as artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: HWC-Inventory-UI path: hwc-inventory-ui.war diff --git a/.gitignore b/.gitignore index 8a309c8..1bf355e 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ testem.log Thumbs.db src/environments/environment.ts +src/environments/environment.ci.ts diff --git a/package-lock.json b/package-lock.json index 5ab5796..553df39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "lint-staged": "^15.2.2", "prettier": "^3.2.5", "prettier-eslint": "^16.3.0", - "typescript": "~5.1.3" + "typescript": "^5.1.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -4560,16 +4560,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -18390,8 +18380,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} + "dev": true }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -20476,8 +20465,7 @@ "version": "16.2.14", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", - "dev": true, - "requires": {} + "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -20776,12 +20764,6 @@ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true - }, "@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -21312,8 +21294,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "requires": {} + "dev": true }, "@webassemblyjs/ast": { "version": "1.12.1", @@ -21619,15 +21600,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -22149,8 +22128,7 @@ "bootstrap": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "requires": {} + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==" }, "brace-expansion": { "version": "1.1.11", @@ -23388,8 +23366,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -23758,8 +23735,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "5.1.3", @@ -24815,7 +24791,7 @@ "prettier-eslint": "^16.3.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "typescript": "~5.1.3", + "typescript": "^5.1.3", "zone.js": "~0.13.0" }, "dependencies": { @@ -25684,8 +25660,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} + "dev": true }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -27770,8 +27745,7 @@ "version": "16.2.14", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", - "dev": true, - "requires": {} + "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -28070,12 +28044,6 @@ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true - }, "@schematics/angular": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", @@ -28606,8 +28574,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "requires": {} + "dev": true }, "@webassemblyjs/ast": { "version": "1.12.1", @@ -28913,15 +28880,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -29443,8 +29408,7 @@ "bootstrap": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "requires": {} + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==" }, "brace-expansion": { "version": "1.1.11", @@ -30682,8 +30646,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -31052,8 +31015,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "5.1.3", @@ -32072,8 +32034,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -32901,8 +32862,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "requires": {} + "dev": true }, "karma-source-map-support": { "version": "1.4.0", @@ -35096,8 +35056,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.5", @@ -36243,8 +36202,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -36720,8 +36678,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "commander": { "version": "2.20.3", @@ -36862,8 +36819,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "requires": {} + "dev": true }, "tsconfig-paths": { "version": "4.2.0", @@ -37333,8 +37289,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -37439,8 +37394,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -37619,8 +37573,7 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -37743,8 +37696,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -38572,8 +38524,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "requires": {} + "dev": true }, "karma-source-map-support": { "version": "1.4.0", @@ -40767,8 +40718,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.5", @@ -41914,8 +41864,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -42391,8 +42340,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "commander": { "version": "2.20.3", @@ -42533,8 +42481,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "requires": {} + "dev": true }, "tsconfig-paths": { "version": "4.2.0", @@ -43004,8 +42951,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -43110,8 +43056,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -43290,8 +43235,7 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "3.0.0", diff --git a/package.json b/package.json index 7820546..96e1461 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,7 @@ "file-saver": "^2.0.5", "hwc-inventory-ui": "file:", "ng-cryptostore": "^16.0.0", - "ng2-smart-table": "^1.2.1", "ngx-cookie-service": "^16.1.0", - "node-sass": "^9.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" From 1426d17d4f8134ff1ea26614748e8491d9fed94d Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:34:33 +0530 Subject: [PATCH 56/80] feat(git-hooks): added husky, Commitlint and Commitzen Added for HWC-Inventory-UI --- .github/workflows/commit-lint.yml | 30 + .husky/commit-msg | 3 + .husky/pre-commit | 2 + commitlint.config.js | 36 + package-lock.json | 3297 ++++++++++++++++++++++++++--- package.json | 10 + 6 files changed, 3092 insertions(+), 286 deletions(-) create mode 100644 .github/workflows/commit-lint.yml create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 commitlint.config.js diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml new file mode 100644 index 0000000..856fcc2 --- /dev/null +++ b/.github/workflows/commit-lint.yml @@ -0,0 +1,30 @@ +name: Commit Compliance + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + commitlint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code with submodule + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + submodules: true + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci --legacy-peer-deps + + - name: Run commitlint on PR + run: | + npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..ae62a44 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,3 @@ +"$(dirname -- "$0")/_/husky.sh" + +npx --no -- commitlint --edit $1 \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..a5701c6 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,2 @@ +"$(dirname -- "$0")/_/husky.sh" +npx lint-staged \ No newline at end of file diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..97f1a25 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,36 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'body-leading-blank': [1, 'always'], + 'body-max-line-length': [2, 'always', 100], + 'footer-leading-blank': [1, 'always'], + 'footer-max-line-length': [2, 'always', 100], + 'header-max-length': [2, 'always', 100], + 'subject-case': [ + 2, + 'never', + ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], + ], + 'subject-empty': [2, 'never'], + 'subject-full-stop': [2, 'never', '.'], + 'type-case': [2, 'always', 'lower-case'], + 'type-empty': [2, 'never'], + 'type-enum': [ + 2, + 'always', + [ + 'build', + 'chore', + 'ci', + 'docs', + 'feat', + 'fix', + 'perf', + 'refactor', + 'revert', + 'style', + 'test' + ], + ], + }, + }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 553df39..aa027ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,11 +40,15 @@ "@angular-eslint/template-parser": "16.3.1", "@angular/cli": "^16.2.10", "@angular/compiler-cli": "^16.2.0", + "@commitlint/cli": "^19.8.0", + "@commitlint/config-conventional": "^19.8.0", "@types/crypto-js": "^4.2.2", "@types/file-saver": "^2.0.7", "@types/jasmine": "~4.3.0", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", + "commitizen": "^4.3.1", + "cz-conventional-changelog": "^3.3.0", "eslint": "^8.51.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", @@ -2575,6 +2579,421 @@ "node": ">=0.1.90" } }, + "node_modules/@commitlint/cli": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.0.tgz", + "integrity": "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^19.8.0", + "@commitlint/lint": "^19.8.0", + "@commitlint/load": "^19.8.0", + "@commitlint/read": "^19.8.0", + "@commitlint/types": "^19.8.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", + "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.0.tgz", + "integrity": "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.8.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/ensure": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.0.tgz", + "integrity": "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.8.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.0.tgz", + "integrity": "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.0.tgz", + "integrity": "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.0.tgz", + "integrity": "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.0.tgz", + "integrity": "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^19.8.0", + "@commitlint/parse": "^19.8.0", + "@commitlint/rules": "^19.8.0", + "@commitlint/types": "^19.8.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.0.tgz", + "integrity": "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/execute-rule": "^19.8.0", + "@commitlint/resolve-extends": "^19.8.0", + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@commitlint/load/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@commitlint/message": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.0.tgz", + "integrity": "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.0.tgz", + "integrity": "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.0.tgz", + "integrity": "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^19.8.0", + "@commitlint/types": "^19.8.0", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.0.tgz", + "integrity": "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/types": "^19.8.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.0.tgz", + "integrity": "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^19.8.0", + "@commitlint/message": "^19.8.0", + "@commitlint/to-lines": "^19.8.0", + "@commitlint/types": "^19.8.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.0.tgz", + "integrity": "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.0.tgz", + "integrity": "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==", + "dev": true, + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.0.tgz", + "integrity": "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==", + "dev": true, + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -4813,6 +5232,15 @@ "@types/node": "*" } }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", + "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -5915,6 +6343,12 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5935,6 +6369,15 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -6500,6 +6943,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -6826,6 +7278,165 @@ "node": ">=16" } }, + "node_modules/commitizen": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", + "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", + "dev": true, + "dependencies": { + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commitizen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/commitizen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/commitizen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/commitizen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commitizen/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/commitizen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commitizen/node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/commitizen/node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/commitizen/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commitizen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -6841,6 +7452,16 @@ "node": ">=4.0.0" } }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "node_modules/compress-commons": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", @@ -6986,6 +7607,54 @@ "node": ">= 0.6" } }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -7143,6 +7812,32 @@ } } }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", + "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", + "dev": true, + "dependencies": { + "jiti": "^2.4.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, + "node_modules/cosmiconfig-typescript-loader/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -7384,6 +8079,38 @@ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, + "node_modules/cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -7435,6 +8162,12 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7641,6 +8374,24 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -7784,6 +8535,18 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -8675,6 +9438,18 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -9014,6 +9789,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "dependencies": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9027,6 +9818,21 @@ "node": ">=8" } }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -9331,6 +10137,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9368,6 +10191,69 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9539,6 +10425,18 @@ "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -9937,6 +10835,16 @@ "node": ">=4" } }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -10210,6 +11118,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -10261,6 +11178,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -10273,12 +11202,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -10739,6 +11683,22 @@ "node >= 0.2.0" ] }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -11330,6 +12290,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -11391,12 +12357,42 @@ "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -11407,6 +12403,12 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -11789,6 +12791,15 @@ "node": ">=0.8.0" } }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12065,6 +13076,24 @@ "node": ">= 4.0.0" } }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -13545,6 +14574,15 @@ "node": ">= 0.10" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -14647,6 +15685,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -15654,6 +16705,15 @@ "wbuf": "^1.7.3" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -16158,6 +17218,18 @@ "node": ">=8" } }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -16176,6 +17248,12 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -16539,6 +17617,18 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -17257,6 +18347,15 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -19257,6 +20356,303 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, + "@commitlint/cli": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.0.tgz", + "integrity": "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==", + "dev": true, + "requires": { + "@commitlint/format": "^19.8.0", + "@commitlint/lint": "^19.8.0", + "@commitlint/load": "^19.8.0", + "@commitlint/read": "^19.8.0", + "@commitlint/types": "^19.8.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + } + }, + "@commitlint/config-conventional": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", + "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-conventionalcommits": "^7.0.2" + } + }, + "@commitlint/config-validator": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.0.tgz", + "integrity": "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "ajv": "^8.11.0" + } + }, + "@commitlint/ensure": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.0.tgz", + "integrity": "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + } + }, + "@commitlint/execute-rule": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.0.tgz", + "integrity": "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==", + "dev": true + }, + "@commitlint/format": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.0.tgz", + "integrity": "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0" + }, + "dependencies": { + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + } + } + }, + "@commitlint/is-ignored": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.0.tgz", + "integrity": "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "semver": "^7.6.0" + }, + "dependencies": { + "semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true + } + } + }, + "@commitlint/lint": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.0.tgz", + "integrity": "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^19.8.0", + "@commitlint/parse": "^19.8.0", + "@commitlint/rules": "^19.8.0", + "@commitlint/types": "^19.8.0" + } + }, + "@commitlint/load": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.0.tgz", + "integrity": "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/execute-rule": "^19.8.0", + "@commitlint/resolve-extends": "^19.8.0", + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@commitlint/message": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.0.tgz", + "integrity": "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==", + "dev": true + }, + "@commitlint/parse": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.0.tgz", + "integrity": "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + } + }, + "@commitlint/read": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.0.tgz", + "integrity": "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==", + "dev": true, + "requires": { + "@commitlint/top-level": "^19.8.0", + "@commitlint/types": "^19.8.0", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" + } + }, + "@commitlint/resolve-extends": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.0.tgz", + "integrity": "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/types": "^19.8.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + } + }, + "@commitlint/rules": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.0.tgz", + "integrity": "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==", + "dev": true, + "requires": { + "@commitlint/ensure": "^19.8.0", + "@commitlint/message": "^19.8.0", + "@commitlint/to-lines": "^19.8.0", + "@commitlint/types": "^19.8.0" + } + }, + "@commitlint/to-lines": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.0.tgz", + "integrity": "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==", + "dev": true + }, + "@commitlint/top-level": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.0.tgz", + "integrity": "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==", + "dev": true, + "requires": { + "find-up": "^7.0.0" + }, + "dependencies": { + "find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "requires": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true + } + } + }, + "@commitlint/types": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.0.tgz", + "integrity": "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==", + "dev": true, + "requires": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "dependencies": { + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + } + } + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -20971,6 +22367,15 @@ "@types/node": "*" } }, + "@types/conventional-commits-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", + "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -21854,6 +23259,12 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -21871,6 +23282,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -22276,6 +23693,12 @@ } } }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, "call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -22501,294 +23924,477 @@ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "commitizen": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", + "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", "dev": true, "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "requires": { - "is-what": "^3.14.1" - } - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", - "dev": true, - "requires": { - "browserslist": "^4.23.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - }, - "crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } - }, - "critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "requires": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "core-js-compat": { + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "dev": true, + "requires": { + "browserslist": "^4.23.0" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "requires": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "cosmiconfig-typescript-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", + "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", + "dev": true, + "requires": { + "jiti": "^2.4.1" + }, + "dependencies": { + "jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true + } + } + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "critters": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "pretty-bytes": "^5.3.0" }, "dependencies": { "ansi-styles": { @@ -22928,6 +24534,27 @@ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, + "cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + } + }, + "dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -22965,6 +24592,12 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -23109,6 +24742,18 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -23220,6 +24865,15 @@ "domhandler": "^5.0.3" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -23867,6 +25521,15 @@ "strip-final-newline": "^3.0.0" } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -24160,6 +25823,22 @@ "pkg-dir": "^7.0.0" } }, + "find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "requires": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -24170,6 +25849,18 @@ "path-exists": "^4.0.0" } }, + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -24383,6 +26074,17 @@ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true }, + "git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "requires": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -24411,6 +26113,56 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "requires": { + "ini": "4.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -24542,6 +26294,15 @@ "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -24762,6 +26523,8 @@ "@angular/platform-browser": "^16.2.0", "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", + "@commitlint/cli": "^19.8.0", + "@commitlint/config-conventional": "^19.8.0", "@types/crypto-js": "^4.2.2", "@types/file-saver": "^2.0.7", "@types/jasmine": "~4.3.0", @@ -24770,7 +26533,9 @@ "angular": "^1.6.10", "angular-moment": "^1.3.0", "bootstrap": "^5.3.2", + "commitizen": "^4.3.1", "crypto-js": "^4.2.0", + "cz-conventional-changelog": "^3.3.0", "eslint": "^8.51.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", @@ -26537,6 +28302,303 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, + "@commitlint/cli": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.0.tgz", + "integrity": "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==", + "dev": true, + "requires": { + "@commitlint/format": "^19.8.0", + "@commitlint/lint": "^19.8.0", + "@commitlint/load": "^19.8.0", + "@commitlint/read": "^19.8.0", + "@commitlint/types": "^19.8.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + } + }, + "@commitlint/config-conventional": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", + "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-conventionalcommits": "^7.0.2" + } + }, + "@commitlint/config-validator": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.0.tgz", + "integrity": "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "ajv": "^8.11.0" + } + }, + "@commitlint/ensure": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.0.tgz", + "integrity": "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + } + }, + "@commitlint/execute-rule": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.0.tgz", + "integrity": "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==", + "dev": true + }, + "@commitlint/format": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.0.tgz", + "integrity": "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0" + }, + "dependencies": { + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + } + } + }, + "@commitlint/is-ignored": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.0.tgz", + "integrity": "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "semver": "^7.6.0" + }, + "dependencies": { + "semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true + } + } + }, + "@commitlint/lint": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.0.tgz", + "integrity": "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^19.8.0", + "@commitlint/parse": "^19.8.0", + "@commitlint/rules": "^19.8.0", + "@commitlint/types": "^19.8.0" + } + }, + "@commitlint/load": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.0.tgz", + "integrity": "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/execute-rule": "^19.8.0", + "@commitlint/resolve-extends": "^19.8.0", + "@commitlint/types": "^19.8.0", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@commitlint/message": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.0.tgz", + "integrity": "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==", + "dev": true + }, + "@commitlint/parse": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.0.tgz", + "integrity": "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==", + "dev": true, + "requires": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + } + }, + "@commitlint/read": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.0.tgz", + "integrity": "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==", + "dev": true, + "requires": { + "@commitlint/top-level": "^19.8.0", + "@commitlint/types": "^19.8.0", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" + } + }, + "@commitlint/resolve-extends": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.0.tgz", + "integrity": "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^19.8.0", + "@commitlint/types": "^19.8.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + } + }, + "@commitlint/rules": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.0.tgz", + "integrity": "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==", + "dev": true, + "requires": { + "@commitlint/ensure": "^19.8.0", + "@commitlint/message": "^19.8.0", + "@commitlint/to-lines": "^19.8.0", + "@commitlint/types": "^19.8.0" + } + }, + "@commitlint/to-lines": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.0.tgz", + "integrity": "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==", + "dev": true + }, + "@commitlint/top-level": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.0.tgz", + "integrity": "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==", + "dev": true, + "requires": { + "find-up": "^7.0.0" + }, + "dependencies": { + "find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "requires": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true + } + } + }, + "@commitlint/types": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.0.tgz", + "integrity": "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==", + "dev": true, + "requires": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "dependencies": { + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + } + } + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -28251,6 +30313,15 @@ "@types/node": "*" } }, + "@types/conventional-commits-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", + "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -29134,6 +31205,12 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -29151,6 +31228,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -29556,6 +31639,12 @@ } } }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, "call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -29781,6 +31870,126 @@ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, + "commitizen": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", + "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", + "dev": true, + "requires": { + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -29793,6 +32002,16 @@ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "compress-commons": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", @@ -29918,6 +32137,42 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, + "conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", + "dev": true + }, + "conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "requires": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -30042,6 +32297,23 @@ } } }, + "cosmiconfig-typescript-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", + "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", + "dev": true, + "requires": { + "jiti": "^2.4.1" + }, + "dependencies": { + "jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true + } + } + }, "crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -30208,6 +32480,27 @@ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, + "cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + } + }, + "dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -30245,6 +32538,12 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -30389,6 +32688,18 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -30500,6 +32811,15 @@ "domhandler": "^5.0.3" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -31147,6 +33467,15 @@ "strip-final-newline": "^3.0.0" } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -31440,6 +33769,22 @@ "pkg-dir": "^7.0.0" } }, + "find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "requires": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -31450,6 +33795,18 @@ "path-exists": "^4.0.0" } }, + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -31663,6 +34020,17 @@ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true }, + "git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "requires": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -31691,6 +34059,56 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "requires": { + "ini": "4.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -31822,6 +34240,15 @@ "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -32112,6 +34539,12 @@ } } }, + "import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -32317,6 +34750,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -32350,18 +34789,39 @@ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, + "is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "requires": { + "text-extensions": "^2.0.0" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, "is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -32714,6 +35174,16 @@ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -33170,6 +35640,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -33231,12 +35707,42 @@ "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -33247,6 +35753,12 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -33508,6 +36020,12 @@ } } }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -33723,6 +36241,18 @@ "fs-monkey": "^1.0.4" } }, + "meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true + }, + "merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -34845,6 +37375,12 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -35608,6 +38144,16 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -36359,6 +38905,12 @@ "wbuf": "^1.7.3" } }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -36728,6 +39280,12 @@ "minimatch": "^3.0.4" } }, + "text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -36746,6 +39304,12 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -37004,6 +39568,12 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, "unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -37490,6 +40060,12 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -37774,6 +40350,12 @@ } } }, + "import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -37979,6 +40561,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -38012,18 +40600,39 @@ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, + "is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "requires": { + "text-extensions": "^2.0.0" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, "is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -38376,6 +40985,16 @@ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -38832,6 +41451,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -38893,12 +41518,42 @@ "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -38909,6 +41564,12 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -39170,6 +41831,12 @@ } } }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -39385,6 +42052,18 @@ "fs-monkey": "^1.0.4" } }, + "meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true + }, + "merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -40507,6 +43186,12 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -41270,6 +43955,16 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -42021,6 +44716,12 @@ "wbuf": "^1.7.3" } }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -42390,6 +45091,12 @@ "minimatch": "^3.0.4" } }, + "text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -42408,6 +45115,12 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -42666,6 +45379,12 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, "unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -43152,6 +45871,12 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 96e1461..520e96d 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "watch": "ng build --watch --configuration development", "test": "ng test", "lint": "ng lint", + "commit": "cz", "prepare": "husky install", "e2e": "ng e2e", "build-dev": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=development --aot", @@ -15,6 +16,11 @@ "build-ci": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && chmod +x ./scripts/*.js && ./scripts/ci-prebuild.js && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=ci --aot", "build-test": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=test --aot" }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } + }, "lint-staged": { "src/**/*.{ts,css,html}": [ "eslint --fix" @@ -54,11 +60,15 @@ "@angular-eslint/template-parser": "16.3.1", "@angular/cli": "^16.2.10", "@angular/compiler-cli": "^16.2.0", + "@commitlint/cli": "^19.8.0", + "@commitlint/config-conventional": "^19.8.0", "@types/crypto-js": "^4.2.2", "@types/file-saver": "^2.0.7", "@types/jasmine": "~4.3.0", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", + "commitizen": "^4.3.1", + "cz-conventional-changelog": "^3.3.0", "eslint": "^8.51.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", From 5c2f016afca78f26075fdb5748606401700465d1 Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Tue, 15 Apr 2025 01:52:11 +0530 Subject: [PATCH 57/80] fix: removed unnecessary package-prod.yml --- .github/workflows/package-prod.yml | 49 ------------------------------ .github/workflows/package.yml | 5 +-- 2 files changed, 3 insertions(+), 51 deletions(-) delete mode 100644 .github/workflows/package-prod.yml diff --git a/.github/workflows/package-prod.yml b/.github/workflows/package-prod.yml deleted file mode 100644 index e1e2526..0000000 --- a/.github/workflows/package-prod.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Package Prod -on: - push: - branches: [ "master"] - -jobs: - Package: - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - steps: - - - name: Checkout code - uses: actions/checkout@v4 - - - - name: Set up Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'adopt' - - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 18 - - - - name: Build with NPM and Create WAR file - run: | - npm config set legacy-peer-deps true - npm install -g @angular/cli - npm install -g grunt-cli - npm install typescript@5.1.3 --save-dev - npm install --force - ng build --configuration production - - - - name: Upload WAR file as artifact - uses: actions/upload-artifact@v4 - with: - name: HWC-Inventory-UI - path: dist/hwc-inventory-ui/hwc-inventory-ui.war diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index be74ad0..f30516f 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -34,9 +34,10 @@ jobs: run: | npm config set legacy-peer-deps true npm install -g @angular/cli + npm install -g grunt-cli npm install typescript@5.1.3 --save-dev npm install --force - npm run build + npm run build-ci - name: Create WAR file run: jar -cvf hwc-inventory-ui.war -C dist . @@ -45,4 +46,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: HWC-Inventory-UI - path: hwc-inventory-ui.war + path: dist/hwc-inventory-ui/hwc-inventory-ui.war From d8ed406d75ef0fb3f1e5da085ec01e503b506bf0 Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Tue, 15 Apr 2025 01:59:46 +0530 Subject: [PATCH 58/80] fix: upgraded to v4 --- .github/workflows/build-on-pull-request.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml index 162fd58..e16b17c 100644 --- a/.github/workflows/build-on-pull-request.yml +++ b/.github/workflows/build-on-pull-request.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code with submodules - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -21,13 +21,13 @@ jobs: git submodule update --recursive - name: Setup JDK 17 - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: java-version: 17 distribution: 'adopt' - name: Set up Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 18 From 96fbdae7344dc58f753b728899d8fc6b8fdff1dc Mon Sep 17 00:00:00 2001 From: Zapper9982 <144029909+Zapper9982@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:38:00 +0530 Subject: [PATCH 59/80] chore(husky): upgrading Husky to latest version Following the latest standards to use Husky --- .husky/commit-msg | 4 +--- .husky/pre-commit | 1 - package-lock.json | 24 ++++++++++++------------ package.json | 4 ++-- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/.husky/commit-msg b/.husky/commit-msg index ae62a44..990bd0b 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,3 +1 @@ -"$(dirname -- "$0")/_/husky.sh" - -npx --no -- commitlint --edit $1 \ No newline at end of file +npx --no -- commitlint --edit "$1" \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index a5701c6..d0a7784 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1 @@ -"$(dirname -- "$0")/_/husky.sh" npx lint-staged \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index aa027ca..a4af790 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "eslint": "^8.51.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", - "husky": "^9.0.11", + "husky": "^9.1.7", "jasmine-core": "~4.6.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -10680,12 +10680,12 @@ } }, "node_modules/husky": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", - "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "bin": { - "husky": "bin.mjs" + "husky": "bin.js" }, "engines": { "node": ">=18" @@ -26497,9 +26497,9 @@ } }, "husky": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", - "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true }, "hwc-inventory-ui": { @@ -26541,7 +26541,7 @@ "eslint-plugin-prettier": "^5.1.3", "exceljs": "^4.4.0", "file-saver": "^2.0.5", - "husky": "^9.0.11", + "husky": "^9.1.7", "hwc-inventory-ui": "file:", "jasmine-core": "~4.6.0", "karma": "~6.4.0", @@ -34443,9 +34443,9 @@ } }, "husky": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", - "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true }, "iconv-lite": { diff --git a/package.json b/package.json index 520e96d..c92132e 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "test": "ng test", "lint": "ng lint", "commit": "cz", - "prepare": "husky install", + "prepare": "husky", "e2e": "ng e2e", "build-dev": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=development --aot", "build-prod": "(test -f src/environments/environment.ts || touch src/environments/environment.ts) && node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --configuration=production --aot", @@ -72,7 +72,7 @@ "eslint": "^8.51.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", - "husky": "^9.0.11", + "husky": "^9.1.7", "jasmine-core": "~4.6.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", From 23ef43a053c7f8604f2067619a859efdb8691385 Mon Sep 17 00:00:00 2001 From: Helen Grace Karyamsetty <133211481+helenKaryamsetty@users.noreply.github.com> Date: Tue, 13 May 2025 12:06:46 +0530 Subject: [PATCH 60/80] removed extra slash prescribed-drug.service.ts --- .../app-modules/rx/shared/service/prescribed-drug.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts index 0d9bdec..4a4cf5d 100644 --- a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts +++ b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts @@ -71,7 +71,7 @@ export class PrescribedDrugService { allocateBatches(list: any, facilityID: any) { return this.http.post( - `${environment.allocateBatchStockUrl}/${facilityID}`, + `${environment.allocateBatchStockUrl}${facilityID}`, list, ); } From 27b8f683d3dc8984489673a183f31c5d0ab7decb Mon Sep 17 00:00:00 2001 From: Mithun James <1007084+drtechie@users.noreply.github.com> Date: Thu, 15 May 2025 16:24:33 +0530 Subject: [PATCH 61/80] feat: ensure url doesn't have version. upgrade version --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bcc7243..af40e29 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.iemr.hwc-inventory-ui hwc-inventory-ui - 1.0 + 3.1.0 hwc-inventory-ui Piramal - inventory: Module ui war @@ -73,7 +73,7 @@ - hwc-inventory-ui + ${artifactId}-${version} maven-clean-plugin From c5a8f589ea221417d9bcf550927163d5ce3d4a8b Mon Sep 17 00:00:00 2001 From: Mithun James <1007084+drtechie@users.noreply.github.com> Date: Mon, 19 May 2025 10:49:48 +0530 Subject: [PATCH 62/80] fix: update names of the services in pom.xml files --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af40e29..dad0383 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.iemr.hwc-inventory-ui hwc-inventory-ui 3.1.0 - hwc-inventory-ui + HWC-Inventory-UI Piramal - inventory: Module ui war From 394d2075bafbfcf661d6cc492d38377076dbfe15 Mon Sep 17 00:00:00 2001 From: Helen Grace Karyamsetty <133211481+helenKaryamsetty@users.noreply.github.com> Date: Mon, 19 May 2025 11:43:50 +0530 Subject: [PATCH 63/80] removed extra slash & unencripted data (#65) * removed extra slash prescribed-drug.service.ts * fix(bug): passing Unencripted data --- .../app-modules/rx/shared/service/prescribed-drug.service.ts | 2 +- src/app/redir-in/redir-in.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts index 0d9bdec..4a4cf5d 100644 --- a/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts +++ b/src/app/app-modules/rx/shared/service/prescribed-drug.service.ts @@ -71,7 +71,7 @@ export class PrescribedDrugService { allocateBatches(list: any, facilityID: any) { return this.http.post( - `${environment.allocateBatchStockUrl}/${facilityID}`, + `${environment.allocateBatchStockUrl}${facilityID}`, list, ); } diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index f9a09df..e728dfb 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -334,7 +334,7 @@ export class RedirInComponent implements OnInit { getFacility() { this.authService - .getFacilityDetails(this.externalSession.facility) + .getFacilityDetails(this.sessionstorage.getItem(this.externalSession.facility)) .subscribe((res) => { if (res && res.statusCode === 200 && res.data) { this.sessionstorage.setItem('facilityDetail', JSON.stringify(res.data)); From 5aebabb53e41e1c188ab1b5f2aacbf8a3ea63d4a Mon Sep 17 00:00:00 2001 From: Helen Grace Karyamsetty <133211481+helenKaryamsetty@users.noreply.github.com> Date: Thu, 22 May 2025 00:42:47 +0530 Subject: [PATCH 64/80] reverted old change (#67) * removed extra slash prescribed-drug.service.ts * fix(bug): passing Unencripted data * fix: redir-in.component.ts --- src/app/redir-in/redir-in.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/redir-in/redir-in.component.ts b/src/app/redir-in/redir-in.component.ts index e728dfb..f9a09df 100644 --- a/src/app/redir-in/redir-in.component.ts +++ b/src/app/redir-in/redir-in.component.ts @@ -334,7 +334,7 @@ export class RedirInComponent implements OnInit { getFacility() { this.authService - .getFacilityDetails(this.sessionstorage.getItem(this.externalSession.facility)) + .getFacilityDetails(this.externalSession.facility) .subscribe((res) => { if (res && res.statusCode === 200 && res.data) { this.sessionstorage.setItem('facilityDetail', JSON.stringify(res.data)); From 914b6af6016f65c099a04ec0063ba10764113896 Mon Sep 17 00:00:00 2001 From: Helen Grace Karyamsetty <133211481+helenKaryamsetty@users.noreply.github.com> Date: Thu, 22 May 2025 01:10:15 +0530 Subject: [PATCH 65/80] fix: added missed slash --- src/environments/environment.ci.ts.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/environments/environment.ci.ts.template b/src/environments/environment.ci.ts.template index 68c9ad6..c323fae 100644 --- a/src/environments/environment.ci.ts.template +++ b/src/environments/environment.ci.ts.template @@ -75,7 +75,7 @@ export const environment = { saveStockExitUrl: `${INVENTORY_API}patientIssue`, - allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID`, + allocateBatchStockUrl: `${INVENTORY_API}allocateStockFromItemID/`, saveStoreTransferUrl: `${INVENTORY_API}storeTransfer`, saveStockAdjustmentUrl: `${INVENTORY_API}stockadjustment`, From 66aae597858acc481f2858cb82851e27ad21d3df Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Tue, 3 Jun 2025 16:33:41 +0530 Subject: [PATCH 66/80] fix: hwc to aam changes --- .github/workflows/package.yml | 6 +++--- Common-UI | 2 +- WEB-INF/jboss-web.xml | 2 +- angular.json | 8 ++++---- package-lock.json | 12 ++++++------ package.json | 4 ++-- pom.xml | 8 ++++---- src/app/app.component.spec.ts | 6 +++--- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index f30516f..34feb71 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -40,10 +40,10 @@ jobs: npm run build-ci - name: Create WAR file - run: jar -cvf hwc-inventory-ui.war -C dist . + run: jar -cvf aam-inventory-ui.war -C dist . - name: Upload WAR file as artifact uses: actions/upload-artifact@v4 with: - name: HWC-Inventory-UI - path: dist/hwc-inventory-ui/hwc-inventory-ui.war + name: AAM-Inventory-UI + path: dist/aam-inventory-ui/aam-inventory-ui.war diff --git a/Common-UI b/Common-UI index 71a2236..0c71b24 160000 --- a/Common-UI +++ b/Common-UI @@ -1 +1 @@ -Subproject commit 71a223686e9f4bae4e425be286d362a23998cb2a +Subproject commit 0c71b24ce2567446a260c53017c7b304b77c5457 diff --git a/WEB-INF/jboss-web.xml b/WEB-INF/jboss-web.xml index 4f8f2a4..e0be3b6 100644 --- a/WEB-INF/jboss-web.xml +++ b/WEB-INF/jboss-web.xml @@ -1,3 +1,3 @@ - /hwc-inventory + /aam-inventory \ No newline at end of file diff --git a/angular.json b/angular.json index 58ebc8e..f83c4cf 100644 --- a/angular.json +++ b/angular.json @@ -3,7 +3,7 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "HWC-Inventory-UI": { + "AAM-Inventory-UI": { "projectType": "application", "schematics": {}, "root": "", @@ -105,10 +105,10 @@ "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "browserTarget": "HWC-Inventory-UI:build:production" + "browserTarget": "AAM-Inventory-UI:build:production" }, "development": { - "browserTarget": "HWC-Inventory-UI:build:development" + "browserTarget": "AAM-Inventory-UI:build:development" } }, "defaultConfiguration": "development", @@ -119,7 +119,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "HWC-Inventory-UI:build" + "browserTarget": "AAM-Inventory-UI:build" } }, "test": { diff --git a/package-lock.json b/package-lock.json index a4af790..df97a01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "hwc-inventory-ui", + "name": "aam-inventory-ui", "version": "0.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "hwc-inventory-ui", + "name": "aam-inventory-ui", "version": "0.0.0", "dependencies": { "@angular/animations": "^16.2.0", @@ -24,7 +24,7 @@ "crypto-js": "^4.2.0", "exceljs": "^4.4.0", "file-saver": "^2.0.5", - "hwc-inventory-ui": "file:", + "aam-inventory-ui": "file:", "ng-cryptostore": "^16.0.0", "ngx-cookie-service": "^16.1.0", "rxjs": "~7.8.0", @@ -10694,7 +10694,7 @@ "url": "https://github.com/sponsors/typicode" } }, - "node_modules/hwc-inventory-ui": { + "node_modules/aam-inventory-ui": { "resolved": "", "link": true }, @@ -26502,7 +26502,7 @@ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true }, - "hwc-inventory-ui": { + "aam-inventory-ui": { "version": "file:", "requires": { "@angular-devkit/build-angular": "^16.2.10", @@ -26542,7 +26542,7 @@ "exceljs": "^4.4.0", "file-saver": "^2.0.5", "husky": "^9.1.7", - "hwc-inventory-ui": "file:", + "aam-inventory-ui": "file:", "jasmine-core": "~4.6.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", diff --git a/package.json b/package.json index c92132e..568bcf0 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "hwc-inventory-ui", + "name": "aam-inventory-ui", "version": "0.0.0", "scripts": { "ng": "ng", @@ -44,7 +44,7 @@ "crypto-js": "^4.2.0", "exceljs": "^4.4.0", "file-saver": "^2.0.5", - "hwc-inventory-ui": "file:", + "aam-inventory-ui": "file:", "ng-cryptostore": "^16.0.0", "ngx-cookie-service": "^16.1.0", "rxjs": "~7.8.0", diff --git a/pom.xml b/pom.xml index dad0383..de555c7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,10 +4,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.iemr.hwc-inventory-ui - hwc-inventory-ui + com.iemr.aam-inventory-ui + aam-inventory-ui 3.1.0 - HWC-Inventory-UI + AAM-Inventory-UI Piramal - inventory: Module ui war @@ -57,7 +57,7 @@ UTF-8 - hwc-inventory-ui + aam-inventory-ui 10.208.122.32 9990 localhost diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 10365bc..25e5694 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -14,16 +14,16 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); }); - it(`should have as title 'HWC-Inventory-UI'`, () => { + it(`should have as title 'AAM-Inventory-UI'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('HWC-Inventory-UI'); + expect(app.title).toEqual('AAM-Inventory-UI'); }); it('should render title', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI app is running!'); + expect(compiled.querySelector('.content span')?.textContent).toContain('AAM-Inventory-UI app is running!'); }); }); From 2c4e662bf76febb46a1f806c8bd79d0ad3d330c4 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Wed, 4 Jun 2025 17:54:24 +0530 Subject: [PATCH 67/80] fix: added disabling condition for all the read only fields in inventory --- .../rx-batch-view.component.html | 30 +++------ .../rx-batch-view/rx-batch-view.component.ts | 14 ++-- .../rx-item-dispense.component.html | 64 +++++++------------ .../rx-item-dispense.component.ts | 10 +-- 4 files changed, 44 insertions(+), 74 deletions(-) diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html index 30a90ca..419d921 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html @@ -13,10 +13,9 @@

autocomplete="off" type="text" name="prescribed" - [readonly]="true" + [disabled]="true" matInput [(ngModel)]="prescribed" - />

@@ -28,11 +27,10 @@

@@ -68,9 +66,7 @@

- + {{ currentLanguageSet?.itemDispense?.batchNo }} @@ -78,18 +74,15 @@

autocomplete="off" matInput defaultNull - readonly="true" + [disabled]="true" name="batchNo" formControlName="batchNo" - />

- + {{ currentLanguageSet?.itemDispense?.quantityinHand }} @@ -97,16 +90,15 @@

autocomplete="off" matInput defaultNull - readonly="true" + [disabled]="true" name="quantityInHand" formControlName="quantityInHand" - />

{{ @@ -117,7 +109,7 @@

matInput defaultNull [required]="batch.value.selection" - [readonly]="editSelection === 1" + [disabled]="editSelection === 1" name="quantity" formControlName="quantity" (blur)=" @@ -127,15 +119,13 @@

- + {{ currentLanguageSet?.itemDispense?.expiryDate }} diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts index 586957f..9901188 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts @@ -63,7 +63,7 @@ export class RxBatchViewComponent implements OnInit, DoCheck { const formArray = this.initBatchListArray(items, this.editSelection); console.log('this.editSelection', this.editSelection); this.itemsForm?.addControl('formArray', formArray); - this.setDispensed(formArray.value); + this.setDispensed(formArray.getRawValue()); } setDispensed(formArray: any, index = -1) { this.checkQuant(formArray, index); @@ -111,16 +111,16 @@ export class RxBatchViewComponent implements OnInit, DoCheck { save() { const formItems = this.itemsForm.controls['formArray']; if (!formItems.invalid) { - console.log('formItems1', formItems.value); - formItems.value.forEach((item: any) => { + console.log('formItems1', formItems.getRawValue()); + formItems.getRawValue().forEach((item: any) => { const newExpDate: any = new Date(item.expiryDate); console.log('newExpDate', newExpDate); item.expiryDate = newExpDate; }); - console.log('formItems2', formItems.value); + console.log('formItems2', formItems.getRawValue()); this.dialogRef.close({ - selectionBatchList: formItems.value, - batchList: formItems.value.filter( + selectionBatchList: formItems.getRawValue(), + batchList: formItems.getRawValue().filter( (item: any) => item.selection === true, ), dispensed: this.dispensed > 0 ? this.dispensed : null, @@ -153,7 +153,7 @@ export class RxBatchViewComponent implements OnInit, DoCheck { currentGroup.patchValue({ quantity: null, }); - this.setDispensed(formItems.value, index); + this.setDispensed(formItems.getRawValue(), index); } } diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html index e78404f..3b50261 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -33,15 +33,13 @@
- + {{ currentLanguageSet?.itemDispense?.form }}
- + {{ currentLanguageSet?.itemDispense?.duration }}
- + {{ currentLanguageSet?.itemDispense?.frequency }}
- + {{ currentLanguageSet?.itemDispense?.dose }}
- + {{ currentLanguageSet?.itemDispense?.quantityPrescribed }}
- + {{ currentLanguageSet?.itemDispense?.quantityDispensed }}
- - {{ - currentLanguageSet?.itemDispense?.route - }} + + {{ + currentLanguageSet?.itemDispense?.route + }} - - {{ - currentLanguageSet?.itemDispense?.specialInstructions - }} + + {{ + currentLanguageSet?.itemDispense?.specialInstructions + }} diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts index 45dc969..26a3831 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts @@ -126,7 +126,7 @@ export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { } getBatchList() { - const formItemValues = this.prescriptionForm.controls['itemList'].value; + const formItemValues = this.prescriptionForm.controls['itemList'].getRawValue(); const meds: any = []; formItemValues.map((obj: any) => meds.push({ itemID: obj.drugID, quantity: obj.qtyPrescribed }), @@ -152,7 +152,7 @@ export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { applyBatches(itemID: any, batches: any) { console.log(itemID, batches, 'checko'); - const formItemValues = this.prescriptionForm.controls['itemList'].value; + const formItemValues = this.prescriptionForm.controls['itemList'].getRawValue(); const itemIndex = formItemValues .map(function (e: any) { return e.drugID; @@ -189,7 +189,7 @@ export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { changeIssueType() { const formItems = this.prescriptionForm.controls['itemList']; - formItems.value.forEach((element: any, i: any) => { + formItems.getRawValue().forEach((element: any, i: any) => { const currentGroup: FormGroup = formItems.at(i); const selectionBatchList: FormArray = ( currentGroup.controls['selectionBatchList'] @@ -229,12 +229,12 @@ export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { const currentGroup: FormGroup = formItems.at(index); const selectionBatchListValue: FormArray = ( - currentGroup.controls['selectionBatchList'].value + currentGroup.controls['selectionBatchList'].getRawValue() ); if (selectionBatchListValue.length) { this.batchViewService .batches( - currentGroup.value.qtyPrescribed, + currentGroup.getRawValue().qtyPrescribed, selectionBatchListValue, this.issueType, ) From c72d8560cc29c6ea7c75d5797406dbe8afe8daa3 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Thu, 5 Jun 2025 12:31:37 +0530 Subject: [PATCH 68/80] fix: added '!==' instead of '!=' --- .../rx/rx-item-dispense/rx-item-dispense.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts index 26a3831..147cfb7 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.ts @@ -94,8 +94,8 @@ export class RxItemDispenseComponent implements OnInit, OnChanges, DoCheck { this.filteredDrugMaster = []; drugMasterCopy.itemList.forEach((element: any) => { if ( - element.isEDL != null && - element.isEDL != undefined && + element.isEDL !== null && + element.isEDL !== undefined && (element.isEDL === true || element.batchList.length > 0) ) { this.filteredDrugMaster.push(element); From 7acd82276d78bbd1caf770488a73b649db675b92 Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Thu, 5 Jun 2025 20:02:38 +0530 Subject: [PATCH 69/80] feat: vapt captcha security --- package.json | 2 +- scripts/ci-prebuild.js | 5 +- .../app-modules/core/services/auth.service.ts | 11 ++-- .../core/services/captcha.service.ts | 33 ++++++++++++ src/app/app.module.ts | 2 + src/app/captcha/captcha.component.html | 1 + src/app/captcha/captcha.component.ts | 54 +++++++++++++++++++ src/app/login/authentication.service.ts | 12 +++-- src/app/login/login.component.css | 21 ++++++++ src/app/login/login.component.html | 26 +++++++-- src/app/login/login.component.ts | 26 +++++++-- src/environments/environment.ci.ts.template | 8 ++- src/environments/environment.local.ts | 8 ++- src/environments/environment.prod.ts | 8 ++- 14 files changed, 197 insertions(+), 20 deletions(-) create mode 100644 src/app/app-modules/core/services/captcha.service.ts create mode 100644 src/app/captcha/captcha.component.html create mode 100644 src/app/captcha/captcha.component.ts diff --git a/package.json b/package.json index c92132e..9680bb6 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ } }, "lint-staged": { - "src/**/*.{ts,css,html}": [ + "src/**/*.ts": [ "eslint --fix" ] }, diff --git a/scripts/ci-prebuild.js b/scripts/ci-prebuild.js index 2926f9d..3561c5f 100755 --- a/scripts/ci-prebuild.js +++ b/scripts/ci-prebuild.js @@ -43,7 +43,10 @@ const defaultEnvValues = { INVENTORY_API_BASE: '', MMU_API_BASE: '', FHIR_API_BASE: '', - SESSION_STORAGE_ENC_KEY: '' + SESSION_STORAGE_ENC_KEY: '', + SITE_KEY:'', + CAPTCHA_CHALLENGE_URL:'', + ENABLE_CAPTCHA: false, }; // Generate output data diff --git a/src/app/app-modules/core/services/auth.service.ts b/src/app/app-modules/core/services/auth.service.ts index fe3f490..0472a2c 100644 --- a/src/app/app-modules/core/services/auth.service.ts +++ b/src/app/app-modules/core/services/auth.service.ts @@ -38,13 +38,18 @@ export class AuthService { getAPIVersionAndCommitDetails() { return this.http.get(environment.apiVersionUrl); } - login(userName: string, password: string, doLogout: any) { - return this.http.post(environment.loginUrl, { + login(userName: string, password: string, doLogout: any, captchaToken?:string) { + const requestBody: any = { userName: userName, password: password, doLogout: doLogout, withCredentials: true, - }); + }; + + if (captchaToken) { + requestBody.captchaToken = captchaToken; + } + return this.http.post(environment.loginUrl, requestBody); } getUserDetails() { diff --git a/src/app/app-modules/core/services/captcha.service.ts b/src/app/app-modules/core/services/captcha.service.ts new file mode 100644 index 0000000..c9d67b6 --- /dev/null +++ b/src/app/app-modules/core/services/captcha.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; + +@Injectable({ + providedIn:'root' +}) +export class CaptchaService { + private scriptLoaded = false; + + loadScript(): Promise { + return new Promise((resolve, reject) => { + if (this.scriptLoaded) return resolve(); + + const script = document.createElement('script'); + script.src = environment.captchaChallengeURL; + script.async = true; + script.defer = true; + script.onload = () => { + this.scriptLoaded = true; + resolve(); + }; + script.onerror = (event) => { + this.scriptLoaded = false; + reject( + new Error( + `Failed to load CAPTCHA script from ${environment.captchaChallengeURL}: ${event}`, + ), + ); + }; + document.head.appendChild(script); + }); + } +} \ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index cb1a5fb..769d0b2 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -72,6 +72,7 @@ import { ResetPasswordComponent } from "./reset-password/reset-password.componen import { SetPasswordComponent } from "./set-password/set-password.component"; import { SetSecurityQuestionsComponent } from "./set-security-questions/set-security-questions.component"; import { AuthService } from "./app-modules/core/services/auth.service"; +import { CaptchaComponent } from "./captcha/captcha.component"; @NgModule({ declarations: [ @@ -84,6 +85,7 @@ import { AuthService } from "./app-modules/core/services/auth.service"; FacilitySelectionComponent, RedirInComponent, LoadStoreDetailsComponent, + CaptchaComponent ], imports: [ BrowserModule, diff --git a/src/app/captcha/captcha.component.html b/src/app/captcha/captcha.component.html new file mode 100644 index 0000000..cbf1aa7 --- /dev/null +++ b/src/app/captcha/captcha.component.html @@ -0,0 +1 @@ +
diff --git a/src/app/captcha/captcha.component.ts b/src/app/captcha/captcha.component.ts new file mode 100644 index 0000000..e0442c5 --- /dev/null +++ b/src/app/captcha/captcha.component.ts @@ -0,0 +1,54 @@ +import { Component, ElementRef, AfterViewInit, Output, EventEmitter, Inject, OnDestroy, ViewChild } from '@angular/core'; +import { CaptchaService } from '../app-modules/core/services/captcha.service'; +import { environment } from 'src/environments/environment'; + +declare const turnstile: any; + +@Component({ + selector: 'app-captcha', + templateUrl: './captcha.component.html' +}) +export class CaptchaComponent implements AfterViewInit, OnDestroy { + @Output() tokenResolved = new EventEmitter(); + @ViewChild('captchaContainer') captchaRef!: ElementRef; + private widgetId: string | null = null; + + constructor( + private el: ElementRef, + private captchaService: CaptchaService + ) {} + + async ngAfterViewInit() { + try { + await this.captchaService.loadScript(); + + const captchaElement = this.captchaRef?.nativeElement; + if (!captchaElement) { + console.error('CAPTCHA container element not found'); + return; + } + + if (!this.widgetId) { + this.widgetId = turnstile.render(captchaElement, { + sitekey: environment.siteKey, + theme: 'light', + callback: (token: string) => this.tokenResolved.emit(token), + }); + } + } catch (error) { + console.error('Failed to initialize CAPTCHA:', error); + } + } + + public reset() { + if (this.widgetId && typeof turnstile !== 'undefined') { + turnstile.reset(this.widgetId); + } + } + + ngOnDestroy() { + if (this.widgetId && typeof turnstile !== 'undefined' && turnstile.remove) { + turnstile.remove(this.widgetId); + } + } +} diff --git a/src/app/login/authentication.service.ts b/src/app/login/authentication.service.ts index b69fafc..949beb7 100644 --- a/src/app/login/authentication.service.ts +++ b/src/app/login/authentication.service.ts @@ -35,14 +35,18 @@ export class AuthenticationService { private http: HttpClient, ) {} - login(userName: string, password: string, doLogout: any) { - return this.http.post(environment.loginUrl, { + login(userName: string, password: string, doLogout: any, captchaToken?:string) { + const requestBody: any = { userName: userName, password: password, doLogout: doLogout, withCredentials: true, - - }); + }; + + if (captchaToken) { + requestBody.captchaToken = captchaToken; + } + return this.http.post(environment.loginUrl, requestBody); } /* AN4085822 - Concurrent login issue*/ diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css index 4366b38..437fa30 100644 --- a/src/app/login/login.component.css +++ b/src/app/login/login.component.css @@ -82,3 +82,24 @@ input::-ms-clear { .input.mat-input-element { line-height: 25px; } + +/* .sr-only is a visually hidden class but useful for screen readers */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + white-space: nowrap; +} + + +.disabledLoginButton { + background-color: #ccc !important; + color: #666 !important; + cursor: not-allowed; + box-shadow: none !important; +} \ No newline at end of file diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 5c2cb8e..841de7a 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -12,7 +12,7 @@
Enter User Name - +
@@ -24,14 +24,34 @@
Enter Password - +
+
+ + +
- +
diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 8913874..20784cd 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -1,10 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; import { Router } from '@angular/router'; import { AuthenticationService } from './authentication.service'; import { ConfirmationService } from '../app-modules/core/services/confirmation.service'; // import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js'; import { SessionStorageService } from 'Common-UI/src/registrar/services/session-storage.service'; +import { CaptchaComponent } from '../captcha/captcha.component'; +import { environment } from 'src/environments/environment'; @Component({ selector: 'app-login-cmp', @@ -12,7 +14,7 @@ import { SessionStorageService } from 'Common-UI/src/registrar/services/session- styleUrls: ['./login.component.css'] }) export class LoginComponent implements OnInit { - + @ViewChild('captchaCmp') captchaCmp: CaptchaComponent | undefined; userName: any; password: any; designation: any; @@ -25,7 +27,8 @@ export class LoginComponent implements OnInit { _keySize: any; _ivSize: any; _iterationCount: any; - + captchaToken!: string; + enableCaptcha = environment.enableCaptcha; constructor( private authService: AuthenticationService, @@ -100,7 +103,7 @@ export class LoginComponent implements OnInit { login() { const encryptPassword = this.encrypt(this.Key_IV, this.password) - this.authService.login(this.userName.trim(), encryptPassword, false) + this.authService.login(this.userName.trim(), encryptPassword, false, this.enableCaptcha ? this.captchaToken : undefined) .subscribe(res => { if (res.statusCode == '200') { if (res.data.previlegeObj && res.data.previlegeObj[0]) { @@ -116,7 +119,7 @@ export class LoginComponent implements OnInit { if(confirmResponse) { this.authService.userlogoutPreviousSession(this.userName).subscribe((userlogoutPreviousSession) => { if (userlogoutPreviousSession.statusCode == '200') { - this.authService.login(this.userName, encryptPassword, true).subscribe((userLoggedIn) => { + this.authService.login(this.userName, encryptPassword, true,this.enableCaptcha ? this.captchaToken : undefined).subscribe((userLoggedIn) => { if (userLoggedIn.statusCode == '200') { if (userLoggedIn.data.previlegeObj != null && userLoggedIn.data.previlegeObj != undefined && userLoggedIn.data.previlegeObj[0]) { @@ -149,6 +152,7 @@ export class LoginComponent implements OnInit { }, err => { this.confirmationService.alert(err, 'error'); }); + this.resetCaptcha(); } serviceRoleArray: any; @@ -241,4 +245,16 @@ export class LoginComponent implements OnInit { this.dynamictype = 'password'; } + onCaptchaResolved(token: any) { + this.captchaToken = token; + } + + resetCaptcha() { + if (this.enableCaptcha && this.captchaCmp && typeof this.captchaCmp.reset === 'function') { + this.captchaCmp.reset(); + this.captchaToken = ''; + } + } + + } diff --git a/src/environments/environment.ci.ts.template b/src/environments/environment.ci.ts.template index c323fae..98cfbe0 100644 --- a/src/environments/environment.ci.ts.template +++ b/src/environments/environment.ci.ts.template @@ -10,6 +10,9 @@ const INVENTORY_API = '<%= INVENTORY_API_BASE %>'; const MMU_API = '<%= MMU_API_BASE %>'; const FHIR_API = '<%= FHIR_API_BASE %>'; const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; +const siteKey = '<%= SITE_KEY %>'; +const captchaChallengeURL = '<%= CAPTCHA_CHALLENGE_URL %>'; +const enableCaptcha = '<%= ENABLE_CAPTCHA %>'; export const environment = { production: true, @@ -129,5 +132,8 @@ export const environment = { /* TransactionID for changing password */ getTransacIDForPasswordChange: `${COMMON_API}user/getTransactionIdForChangePassword`, - saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha` + saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha`, + siteKey:siteKey, + captchaChallengeURL: captchaChallengeURL, + enableCaptcha: enableCaptcha }; diff --git a/src/environments/environment.local.ts b/src/environments/environment.local.ts index fd51bd2..7587f67 100644 --- a/src/environments/environment.local.ts +++ b/src/environments/environment.local.ts @@ -19,6 +19,9 @@ const MMU_API = `${mmuIP}:8087/`; const FHIR_API = `${FHIRIP}:8093/`; // const FHIR_API = `http://localhost:8080/fhirapi-v1.0/`; const sessionStorageEncKey = ''; +const siteKey = ''; +const captchaChallengeURL = ''; +const enableCaptcha = false; export const environment = { production: false, @@ -138,5 +141,8 @@ export const environment = { /* TransactionID for changing password */ getTransacIDForPasswordChange: `${COMMON_API}user/getTransactionIdForChangePassword`, - saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha` + saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha`, + siteKey:siteKey, + captchaChallengeURL:captchaChallengeURL, + enableCaptcha: enableCaptcha, }; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 47f603c..c7edad9 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -21,6 +21,9 @@ const INVENTORY_API = `${inventoryIP}Inventoryapi-v1.0/`; const MMU_API = `${mmuIP}mmuapi-v1.0/`; const FHIR_API = `${FHIRIP}fhirapi-v1.0/`; const sessionStorageEncKey = ''; +const siteKey = ''; +const captchaChallengeURL = ''; +const enableCaptcha = false; export const environment = { production: true, @@ -140,5 +143,8 @@ export const environment = { /* TransactionID for changing password */ getTransacIDForPasswordChange: `${COMMON_API}user/getTransactionIdForChangePassword`, - saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha` + saveEAusadhaStock_Url: `${COMMON_API}eAusadha/create-eAusadha`, + siteKey:siteKey, + captchaChallengeURL:captchaChallengeURL, + enableCaptcha: enableCaptcha, }; From 66126dac94fc1c939b20e9d6f8a25aceaf4419fb Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Thu, 5 Jun 2025 20:12:14 +0530 Subject: [PATCH 70/80] fix: unused imports, injections removed and updated --- src/app/captcha/captcha.component.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/captcha/captcha.component.ts b/src/app/captcha/captcha.component.ts index e0442c5..8bd623d 100644 --- a/src/app/captcha/captcha.component.ts +++ b/src/app/captcha/captcha.component.ts @@ -1,4 +1,4 @@ -import { Component, ElementRef, AfterViewInit, Output, EventEmitter, Inject, OnDestroy, ViewChild } from '@angular/core'; +import { Component, ElementRef, AfterViewInit, Output, EventEmitter, OnDestroy, ViewChild } from '@angular/core'; import { CaptchaService } from '../app-modules/core/services/captcha.service'; import { environment } from 'src/environments/environment'; @@ -14,8 +14,7 @@ export class CaptchaComponent implements AfterViewInit, OnDestroy { private widgetId: string | null = null; constructor( - private el: ElementRef, - private captchaService: CaptchaService + private readonly captchaService: CaptchaService ) {} async ngAfterViewInit() { From 099f38fa18b1f4dc441233358cd49b8c6e2227f1 Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Fri, 6 Jun 2025 16:44:57 +0530 Subject: [PATCH 71/80] fix: captcha reset issue fix --- src/app/login/login.component.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 20784cd..4d4cf16 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -125,20 +125,24 @@ export class LoginComponent implements OnInit { this.checkRoleMapped(userLoggedIn.data); } else { + this.resetCaptcha(); this.confirmationService.alert('Seems you are logged in from somewhere else, Logout from there & try back in.', 'error'); } } else { + this.resetCaptcha(); this.confirmationService.alert(userLoggedIn.errorMessage, 'error'); } }) } else { + this.resetCaptcha(); this.confirmationService.alert(userlogoutPreviousSession.errorMessage, 'error'); } }); } else { + this.resetCaptcha(); sessionStorage.clear(); this.router.navigate(["/login"]); // this.confirmationService.alert(res.errorMessage, 'error'); @@ -146,13 +150,14 @@ export class LoginComponent implements OnInit { }); } else { + this.resetCaptcha(); this.confirmationService.alert(res.errorMessage, 'error'); } } }, err => { + this.resetCaptcha(); this.confirmationService.alert(err, 'error'); }); - this.resetCaptcha(); } serviceRoleArray: any; From 32abd34ea43a0855d6a3ba80c2451e8e2508517b Mon Sep 17 00:00:00 2001 From: Devika S <57424483+devikasuresh20@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:46:14 +0530 Subject: [PATCH 72/80] fix: dispense screen changes (#71) --- .../rx-batch-view.component.html | 4 -- .../rx-batch-view/rx-batch-view.component.ts | 8 ++-- .../rx-item-dispense.component.html | 8 ---- .../shared/utility/prescribed-drug.utility.ts | 40 +++++++++---------- 4 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html index 419d921..ae9eb56 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.html @@ -74,7 +74,6 @@

autocomplete="off" matInput defaultNull - [disabled]="true" name="batchNo" formControlName="batchNo" /> @@ -90,7 +89,6 @@

autocomplete="off" matInput defaultNull - [disabled]="true" name="quantityInHand" formControlName="quantityInHand" /> @@ -109,7 +107,6 @@

matInput defaultNull [required]="batch.value.selection" - [disabled]="editSelection === 1" name="quantity" formControlName="quantity" (blur)=" @@ -125,7 +122,6 @@

}} diff --git a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts index 9901188..32c555c 100644 --- a/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts +++ b/src/app/app-modules/core/components/rx-batch-view/rx-batch-view.component.ts @@ -165,10 +165,10 @@ export class RxBatchViewComponent implements OnInit, DoCheck { 'MM/dd/yyyy', ); return this.fb.group({ - expiryDate: formatedExpDate, - batchNo: batch.batchNo, - quantity: batch.quantity, - quantityInHand: batch.qty || batch.quantityInHand, + expiryDate: [{ value: formatedExpDate, disabled: true }], + batchNo: [{ value: batch.batchNo, disabled: true }], + quantity: [{ value: batch.quantity, disabled: selection === 1 ? true : false }], + quantityInHand: [{ value: batch.qty || batch.quantityInHand, disabled: true }], expiresIn: batch.expiresIn, itemStockEntryID: batch.itemStockEntryID, selection: batch.selection || selection === 1 ? true : false, diff --git a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html index 3b50261..eb09619 100644 --- a/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html +++ b/src/app/app-modules/rx/rx-item-dispense/rx-item-dispense.component.html @@ -39,7 +39,6 @@ }} diff --git a/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts b/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts index d59f1ed..8363662 100644 --- a/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts +++ b/src/app/app-modules/rx/shared/utility/prescribed-drug.utility.ts @@ -44,26 +44,26 @@ export class PrescribedDrugsUtils { return batches; } - initPrescribedDrugs(drug: any, selection: any): FormGroup { - return this.fb.group({ - duration: drug.duration, - durationUnit: drug.durationUnit, - durationView: `${drug.duration} ${drug.durationUnit}`, - dose: drug.dose, - route: drug.route, - genericDrugName: drug.genericDrugName, - drugStrength: drug.drugStrength, - specialInstruction: drug.specialInstruction, - qtyDispensed: null, - qtyPrescribed: drug.qtyPrescribed, - drugID: drug.drugID, - drugForm: drug.drugForm, - frequency: drug.frequency, - batchList: this.fb.array([]), - selectionBatchList: this.fb.array([]), - preDefinedBatchList: this.initBatchListArray(drug.batchList, selection), - }); - } +initPrescribedDrugs(drug: any, selection: any): FormGroup { + return this.fb.group({ + duration: [{ value: drug.duration, disabled: true }], + durationUnit: [{ value: drug.durationUnit, disabled: true }], + durationView: [{ value: `${drug.duration} ${drug.durationUnit}`, disabled: true }], + dose: [{ value: drug.dose, disabled: true }], + route: [{ value: drug.route, disabled: true }], + genericDrugName: drug.genericDrugName, + drugStrength: drug.drugStrength, + specialInstruction: [{ value: drug.specialInstruction, disabled: true }], + qtyDispensed: [{ value: null, disabled: true }], + qtyPrescribed: [{ value: drug.qtyPrescribed, disabled: true }], + drugID: drug.drugID, + drugForm: [{ value: drug.drugForm, disabled: true }], + frequency: [{ value: drug.frequency, disabled: true }], + batchList: this.fb.array([]), + selectionBatchList: this.fb.array([]), + preDefinedBatchList: this.initBatchListArray(drug.batchList, selection), + }); +} initPrescribedDrugsArray(itemList: any, selection: any): FormArray { const drugArray: FormArray = this.fb.array([]); From 080dba696b2faee82fa27c13ec0d1a1305c775c4 Mon Sep 17 00:00:00 2001 From: Devika S <57424483+devikasuresh20@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:20:34 +0530 Subject: [PATCH 73/80] AMM-1563 (#72) * fix: dispense screen changes * fix: hwc to aam changes * fix: hwc to aam changes --- Common-UI | 2 +- README.md | 2 +- src/index.html | 32 ++++++++++++++++---------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Common-UI b/Common-UI index 0c71b24..cdaf019 160000 --- a/Common-UI +++ b/Common-UI @@ -1 +1 @@ -Subproject commit 0c71b24ce2567446a260c53017c7b304b77c5457 +Subproject commit cdaf01914fd38b26937b5149b31c3b8bf83cb997 diff --git a/README.md b/README.md index cee1891..e4aa31d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# HWCInventoryUI +# AAM InventoryUI This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.10. diff --git a/src/index.html b/src/index.html index 0a4801e..761c2d1 100644 --- a/src/index.html +++ b/src/index.html @@ -1,28 +1,28 @@ - - - HWC Inventory Next - - - + + + AAM Inventory Next + + + - - - - - We are loading your data.....Kindly wait ......... - + + + + We are loading your data.....Kindly wait ......... + + src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" + integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" + crossorigin="anonymous" +> From ff597f7015f141837e5f4d64a1f2bc0e50746233 Mon Sep 17 00:00:00 2001 From: Karyamsetty Helen Grace Date: Tue, 10 Jun 2025 16:45:22 +0530 Subject: [PATCH 74/80] fix: commonui latest commit --- Common-UI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common-UI b/Common-UI index cdaf019..3ec7e81 160000 --- a/Common-UI +++ b/Common-UI @@ -1 +1 @@ -Subproject commit cdaf01914fd38b26937b5149b31c3b8bf83cb997 +Subproject commit 3ec7e81443c830c7784bb39ad1fe34af1a939858 From 4ae64cd450ecea8e97272cf05bd45d5523469958 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Tue, 17 Jun 2025 15:10:03 +0530 Subject: [PATCH 75/80] fix: type fix for the enable captcha variable (#76) --- src/environments/environment.ci.ts.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/environments/environment.ci.ts.template b/src/environments/environment.ci.ts.template index 98cfbe0..2980b0c 100644 --- a/src/environments/environment.ci.ts.template +++ b/src/environments/environment.ci.ts.template @@ -12,7 +12,7 @@ const FHIR_API = '<%= FHIR_API_BASE %>'; const sessionStorageEncKey = '<%= SESSION_STORAGE_ENC_KEY %>'; const siteKey = '<%= SITE_KEY %>'; const captchaChallengeURL = '<%= CAPTCHA_CHALLENGE_URL %>'; -const enableCaptcha = '<%= ENABLE_CAPTCHA %>'; +const enableCaptcha = <%= ENABLE_CAPTCHA %>; export const environment = { production: true, From 38343145720a98e8bcf68a069197193e0a56886c Mon Sep 17 00:00:00 2001 From: SnehaRH Date: Mon, 23 Jun 2025 19:15:06 +0530 Subject: [PATCH 76/80] fix: quick access button issue amm-1532 --- .../rx-dashboard/rx-dashboard.component.css | 12 +- .../rx-dashboard/rx-dashboard.component.html | 108 +++++++++--------- 2 files changed, 62 insertions(+), 58 deletions(-) diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css index c9cb72f..dca381e 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css @@ -1,12 +1,11 @@ -.stepper { - margin-bottom: 100px; -} - .mat-stepper-horizontal { padding: 0px; background: #f2f2f0 !important; } - + +.stepper { + margin-bottom: 100px; +} .mat-horizontal-stepper-header-container { background: #f2f2f0 !important; } @@ -52,7 +51,8 @@ md-card { position: fixed; left: 20px; bottom: 50px; - z-index: 3; + z-index: 1; + display: flex; } .centered { diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html index ac9aa2c..c64b67f 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html @@ -12,38 +12,40 @@
- - {{ currentLanguageSet?.itemDispense?.systemIssue }} - - + {{ currentLanguageSet?.itemDispense?.systemIssue }} + + + {{ currentLanguageSet?.itemDispense?.manualIssue }} + + +
+
+
-
@@ -55,29 +57,31 @@

-
-
- -
-
- -
+
+ +
+ +
+
From 7a7915ad7e955cec9791c92bfc7d2624e8762a57 Mon Sep 17 00:00:00 2001 From: SnehaRH <77656297+snehar-nd@users.noreply.github.com> Date: Tue, 24 Jun 2025 11:40:59 +0530 Subject: [PATCH 77/80] fix: made alaignment changes amm-1532 (#78) --- .../rx-dashboard/rx-dashboard.component.html | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html index c64b67f..16d60eb 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html @@ -57,16 +57,6 @@
-
- -
+ +
+ +
From 191a42efa2ad3414e4921b8a3eb0978cd6534a14 Mon Sep 17 00:00:00 2001 From: SnehaRH <77656297+snehar-nd@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:30:42 +0530 Subject: [PATCH 78/80] Nd/sn/develop (#79) * fix: made alaignment changes amm-1532 * fix: moved account-box button out from the div amm-1532 * fix: added css amm-1532 --- .../rx-dashboard/rx-dashboard.component.css | 11 +- .../rx-dashboard/rx-dashboard.component.html | 102 ++++++++++-------- 2 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css index dca381e..ca58e66 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.css @@ -25,12 +25,17 @@ md-card { width: 100%; overflow: auto; } - + +.example-sidenav-fab-container md-sidenav { + max-width: 250px; +} + .sideNav { max-width: 250px; display: flex; } + .example-scrolling-content { flex: auto; /* overflow: auto; */ @@ -47,11 +52,11 @@ md-card { padding: 20px 0px; } -.example-fab.mat-mini-fab { +.example-fab{ position: fixed; left: 20px; bottom: 50px; - z-index: 1; + z-index: 1000; display: flex; } diff --git a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html index 16d60eb..83546dc 100644 --- a/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html +++ b/src/app/app-modules/rx/rx-dashboard/rx-dashboard.component.html @@ -2,62 +2,64 @@
- +
-
-
-
- --> +
+
+ + - - {{ currentLanguageSet?.itemDispense?.systemIssue }} - - - {{ currentLanguageSet?.itemDispense?.manualIssue }} - - -
-
- -
+ {{ currentLanguageSet?.itemDispense?.manualIssue }} + +
-
- - - +
+
+
+ + + +
+ + +
+
+ +
From 6dbadbf136837b5626ac9fc46ec7b911e108ffe4 Mon Sep 17 00:00:00 2001 From: Devika S <57424483+devikasuresh20@users.noreply.github.com> Date: Wed, 25 Jun 2025 16:53:04 +0530 Subject: [PATCH 79/80] AMM-1603 Edit Indent Request changes (#80) * fix: dispense screen changes * fix: hwc to aam changes * fix: hwc to aam changes * commonui commit changes * adding commonui * fix: edit indent screen changes * update commonui submodule to latest commit --- Common-UI | 2 +- .../indent-request/indent-request.component.html | 13 +++++-------- .../indent-request/indent-request.component.ts | 2 +- src/environments/environment.prod.ts | 10 +++++----- src/environments/environment.test.ts | 10 +++++----- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/Common-UI b/Common-UI index 3ec7e81..bb57ecf 160000 --- a/Common-UI +++ b/Common-UI @@ -1 +1 @@ -Subproject commit 3ec7e81443c830c7784bb39ad1fe34af1a939858 +Subproject commit bb57ecfac052a50bd85dc30eba1ca93335c34344 diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.html index 52549b9..ae055f3 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/sub-store-indent-order-worklist/indent-request/indent-request.component.html @@ -29,9 +29,7 @@

{{ currentLanguageSet?.inventory?.indentRequest }}

- + {{ currentLanguageSet?.inventory?.referenceNo }} @@ -45,9 +43,7 @@

{{ currentLanguageSet?.inventory?.indentRequest }}

- + {{ currentLanguageSet?.inventory?.reason }} @@ -270,9 +266,9 @@

{{ currentLanguageSet?.inventory?.indentRequest }}

- {{ currentLanguageSet?.inventory?.batchNo }} + {{ currentLanguageSet?.inventory?.quantityInHand }} {{ selectedItem?.quantityInHand }} @@ -130,7 +130,7 @@

{{ currentLanguageSet?.inventory?.itemSelection }}

*matHeaderRowDef="[ 'itemCode', 'itemName', - 'batchNo', + 'quantityInHand', 'itemCategory', 'itemForm', 'pharmacologicalCategory', @@ -145,7 +145,7 @@

{{ currentLanguageSet?.inventory?.itemSelection }}

columns: [ 'itemCode', 'itemName', - 'batchNo', + 'quantityInHand', 'itemCategory', 'itemForm', 'pharmacologicalCategory', From 0272668af230a32652637b7af673c12a490e5aa7 Mon Sep 17 00:00:00 2001 From: Parth Kothari Date: Thu, 4 Jul 2024 09:22:08 +0530 Subject: [PATCH 17/80] Change in label for item dipense screen --- .../components/item-dispense/item-dispense.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/app-modules/core/components/item-dispense/item-dispense.component.html b/src/app/app-modules/core/components/item-dispense/item-dispense.component.html index baf1832..1d2cf37 100644 --- a/src/app/app-modules/core/components/item-dispense/item-dispense.component.html +++ b/src/app/app-modules/core/components/item-dispense/item-dispense.component.html @@ -64,9 +64,9 @@

{{ currentLanguageSet?.inventory?.itemSelection }}

- {{ currentLanguageSet?.inventory?.quantityInHand }} + {{ currentLanguageSet?.inventory?.quantityinHand }} {{ selectedItem?.quantityInHand }} @@ -130,7 +130,7 @@

{{ currentLanguageSet?.inventory?.itemSelection }}

*matHeaderRowDef="[ 'itemCode', 'itemName', - 'quantityInHand', + 'quantityinHand', 'itemCategory', 'itemForm', 'pharmacologicalCategory', @@ -145,7 +145,7 @@

{{ currentLanguageSet?.inventory?.itemSelection }}

columns: [ 'itemCode', 'itemName', - 'quantityInHand', + 'quantityinHand', 'itemCategory', 'itemForm', 'pharmacologicalCategory', From 265b96df9f32d6e1f46bfe1145ec05239bc3900f Mon Sep 17 00:00:00 2001 From: Shakyan Kushwaha <32445019+anandamideShakyan@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:11:20 +0530 Subject: [PATCH 18/80] Update angular.json Updated outputPath in angular.json to fix the Forbidden error during wildfly deployment. --- angular.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angular.json b/angular.json index abc35e2..c1a7f57 100644 --- a/angular.json +++ b/angular.json @@ -13,7 +13,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/hwc-inventory-ui-next", + "outputPath": "dist/", "index": "src/index.html", "main": "src/main.ts", "polyfills": [ From 46730e9d199c13c7a12373c2825e118f318d8f99 Mon Sep 17 00:00:00 2001 From: nkokkiligadda87 Date: Thu, 29 Aug 2024 15:44:15 +0530 Subject: [PATCH 19/80] readme file changes and add nvmrc file --- .nvmrc | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..6f7f377 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v16 diff --git a/README.md b/README.md index f8fd6b7..6bf6bba 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# HWCInventoryUINEXT +# HWCInventoryUI This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.10. From 0c28723d2480bcf37c2998e0797a383159238b29 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Wed, 18 Sep 2024 16:45:20 +0530 Subject: [PATCH 20/80] URL changes using jboss context-root --- .github/workflows/package-prod.yml | 2 +- .github/workflows/package.yml | 4 ++-- WEB-INF/jboss-web.xml | 3 +++ angular.json | 15 ++++++++++----- package-lock.json | 4 ++-- package.json | 2 +- pom.xml | 10 +++++----- src/app/app.component.spec.ts | 6 +++--- src/environments/environment.prod.ts | 8 ++++---- src/environments/environment.test.ts | 8 ++++---- src/environments/environment.ts | 8 ++++---- 11 files changed, 39 insertions(+), 31 deletions(-) create mode 100644 WEB-INF/jboss-web.xml diff --git a/.github/workflows/package-prod.yml b/.github/workflows/package-prod.yml index 1cf24ab..7edf1bb 100644 --- a/.github/workflows/package-prod.yml +++ b/.github/workflows/package-prod.yml @@ -48,4 +48,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: HWC-Inventory-UI - path: dist/hwc-inventory-ui-next/hwc-inventory-ui-next.war + path: dist/hwc-inventory-ui/hwc-inventory-ui.war diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 50e099f..8467403 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -41,10 +41,10 @@ jobs: npm run build - name: Create WAR file - run: jar -cvf hwc-inventory-ui-next.war -C dist . + run: jar -cvf hwc-inventory-ui.war -C dist . - name: Upload WAR file as artifact uses: actions/upload-artifact@v2 with: name: HWC-Inventory-UI - path: hwc-inventory-ui-next.war + path: hwc-inventory-ui.war diff --git a/WEB-INF/jboss-web.xml b/WEB-INF/jboss-web.xml new file mode 100644 index 0000000..85a3e9b --- /dev/null +++ b/WEB-INF/jboss-web.xml @@ -0,0 +1,3 @@ + +/hwc-inventory + \ No newline at end of file diff --git a/angular.json b/angular.json index c1a7f57..f4ae9ae 100644 --- a/angular.json +++ b/angular.json @@ -3,7 +3,7 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "HWC-Inventory-UI-NEXT": { + "HWC-Inventory-UI": { "projectType": "application", "schematics": {}, "root": "", @@ -22,7 +22,12 @@ "tsConfig": "tsconfig.app.json", "assets": [ "src/favicon.ico", - "src/assets" + "src/assets", + { + "glob": "**/*", + "input": "WEB-INF", + "output": "/WEB-INF" + } ], "styles": [ "@angular/material/prebuilt-themes/indigo-pink.css", @@ -95,10 +100,10 @@ "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "browserTarget": "HWC-Inventory-UI-NEXT:build:production" + "browserTarget": "HWC-Inventory-UI:build:production" }, "development": { - "browserTarget": "HWC-Inventory-UI-NEXT:build:development" + "browserTarget": "HWC-Inventory-UI:build:development" } }, "defaultConfiguration": "development" @@ -106,7 +111,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "HWC-Inventory-UI-NEXT:build" + "browserTarget": "HWC-Inventory-UI:build" } }, "test": { diff --git a/package-lock.json b/package-lock.json index 230436e..837df7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "hwc-inventory-ui-next", + "name": "hwc-inventory-ui", "version": "0.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "hwc-inventory-ui-next", + "name": "hwc-inventory-ui", "version": "0.0.0", "dependencies": { "@angular/animations": "^16.2.0", diff --git a/package.json b/package.json index 20c4564..68306c0 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "hwc-inventory-ui-next", + "name": "hwc-inventory-ui", "version": "0.0.0", "scripts": { "ng": "ng", diff --git a/pom.xml b/pom.xml index c636e04..bcc7243 100644 --- a/pom.xml +++ b/pom.xml @@ -4,10 +4,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.iemr.hwc-inventory-ui-next - hwc-inventory-ui-next + com.iemr.hwc-inventory-ui + hwc-inventory-ui 1.0 - hwc-inventory-ui-next + hwc-inventory-ui Piramal - inventory: Module ui war @@ -57,7 +57,7 @@ UTF-8 - hwc-inventory-ui-next-v1.0 + hwc-inventory-ui 10.208.122.32 9990 localhost @@ -73,7 +73,7 @@ - hwc-inventory-ui-next-v1.0 + hwc-inventory-ui maven-clean-plugin diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index cf801ff..10365bc 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -14,16 +14,16 @@ describe('AppComponent', () => { expect(app).toBeTruthy(); }); - it(`should have as title 'HWC-Inventory-UI-NEXT'`, () => { + it(`should have as title 'HWC-Inventory-UI'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('HWC-Inventory-UI-NEXT'); + expect(app.title).toEqual('HWC-Inventory-UI'); }); it('should render title', () => { const fixture = TestBed.createComponent(AppComponent); fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI-NEXT app is running!'); + expect(compiled.querySelector('.content span')?.textContent).toContain('HWC-Inventory-UI app is running!'); }); }); diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 6e89b44..f49c60a 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -2,10 +2,10 @@ // The build system defaults to the dev environment which uses `environment.ts`, but if you do // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "http://183.82.107.186:8080/"; -const inventoryIP = "http://183.82.107.186:8080/"; -const mmuIP = "http://183.82.107.186:8080/"; -const FHIRIP = "http://183.82.107.186:8080/"; +const commonIP = "https://amritwprdev.piramalswasthya.org/"; +const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; +const mmuIP = "https://amritwprdev.piramalswasthya.org/"; +const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index d32e353..ee6727f 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -3,10 +3,10 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "http://183.82.107.186:8080/"; -const inventoryIP = "http://183.82.107.186:8080/"; -const mmuIP = "http://183.82.107.186:8080/"; -const FHIRIP = "http://183.82.107.186:8080/"; +const commonIP = "https://amritwprdev.piramalswasthya.org/"; +const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; +const mmuIP = "https://amritwprdev.piramalswasthya.org/"; +const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index c120580..3b2b488 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,10 +3,10 @@ // `ng build --env=prod` then `environment.prod.ts` will be used instead. // The list of which env maps to which file can be found in `.angular-cli.json`. -const commonIP = "http://183.82.107.186:8080/"; -const inventoryIP = "http://183.82.107.186:8080/"; -const mmuIP = "http://183.82.107.186:8080/"; -const FHIRIP = "http://183.82.107.186:8080/"; +const commonIP = "https://amritwprdev.piramalswasthya.org/"; +const inventoryIP = "https://amritwprdev.piramalswasthya.org/"; +const mmuIP = "https://amritwprdev.piramalswasthya.org/"; +const FHIRIP = "https://amritwprdev.piramalswasthya.org/"; // const COMMON_API_OPEN = `http://${IP}:8080/apiman-gateway/IEMR/Common/open/`; // const COMMON_API = `http://${IP}:8080/apiman-gateway/IEMR/Common/1.0/`; // const INVENTORY_API = `http://${IP}:8080/apiman-gateway/IEMR/Inventory/1.0/`; From 3797e08bb990dc789d9ee2863ac89353ca45b698 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Thu, 19 Sep 2024 10:19:51 +0530 Subject: [PATCH 21/80] Minor change in angular.json --- angular.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angular.json b/angular.json index f4ae9ae..a95de96 100644 --- a/angular.json +++ b/angular.json @@ -26,7 +26,7 @@ { "glob": "**/*", "input": "WEB-INF", - "output": "/WEB-INF" + "output": "WEB-INF" } ], "styles": [ From 0716b34ec315506bc3e9e28a9bea746b89f8a5a5 Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Thu, 19 Sep 2024 10:51:06 +0530 Subject: [PATCH 22/80] Minor changes --- WEB-INF/jboss-web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WEB-INF/jboss-web.xml b/WEB-INF/jboss-web.xml index 85a3e9b..4f8f2a4 100644 --- a/WEB-INF/jboss-web.xml +++ b/WEB-INF/jboss-web.xml @@ -1,3 +1,3 @@ -/hwc-inventory + /hwc-inventory \ No newline at end of file From 396085f32a97dca94c4da224a70c7b71e109ecbc Mon Sep 17 00:00:00 2001 From: devikasuresh20 Date: Fri, 27 Sep 2024 17:39:54 +0530 Subject: [PATCH 23/80] Added medicine batches empty condition for indent and also corrected alignment issues --- .../manual-indent-dispense.component.html | 17 ++--------------- .../manual-indent-dispense.component.ts | 7 +++++++ .../rx-item-dispense.component.css | 3 +++ .../rx-item-dispense.component.html | 4 ++-- src/assets/English.json | 2 +- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html index b31db16..08ca8d6 100644 --- a/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html +++ b/src/app/app-modules/inventory/indent/indent-order-worklist/main-store-indent-order-worklist/indent-dispenses/manual-indent-dispense/manual-indent-dispense.component.html @@ -67,19 +67,7 @@ -
-
- {{ currentLanguageSet?.inventory?.totalCount }} : - {{ mainStoreItemListForDispense.length }} -
-
+
-
-
- {{ currentLanguageSet?.inventory?.totalCount }} : - {{ mainStoreItemListForDispense.length }} -
-
+
-
+
+ {{ currentLanguageSet?.inventory?.totalCount }} : + {{ mainStoreItemListForDispense.length }} +
+
- +