├── .circleci ├── config.docker-integration.yml ├── config.stage9.yml ├── config.yml └── setup-heroku.sh ├── .dockerignore ├── .editorconfig ├── .eslintrc.json ├── .firebaserc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── Dockerfile ├── LICENSE ├── Procfile ├── README.md ├── angular.json ├── app.json ├── bin └── verifyProjects.js ├── build.Dockerfile ├── cypress.config.ts ├── cypress ├── e2e │ └── app.cy.ts ├── fixtures │ └── example.json ├── support │ ├── commands.ts │ ├── component-index.html │ ├── component.ts │ └── e2e.ts └── tsconfig.json ├── dev-norms.md ├── docker-compose.yml ├── example.env ├── firebase.json ├── integration.Dockerfile ├── karma.conf.js ├── nginx.Dockerfile ├── package-lock.json ├── package.json ├── projects ├── stage10 │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── cypress │ │ ├── e2e │ │ │ └── spec.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ ├── support │ │ │ ├── commands.ts │ │ │ ├── component-index.html │ │ │ ├── component.ts │ │ │ └── e2e.ts │ │ └── tsconfig.json │ ├── karma.conf.js │ ├── src │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── app │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── auth │ │ │ │ ├── auth.custom.service.ts │ │ │ │ ├── auth.enum.ts │ │ │ │ ├── auth.factory.ts │ │ │ │ ├── auth.firebase.service.spec.ts │ │ │ │ ├── auth.firebase.service.ts │ │ │ │ ├── auth.graphql.custom.service.ts │ │ │ │ ├── auth.graphql.queries.ts │ │ │ │ ├── auth.guard.ts │ │ │ │ ├── auth.http.interceptor.ts │ │ │ │ ├── auth.in-memory.service.ts │ │ │ │ ├── auth.service.spec.ts │ │ │ │ └── auth.service.ts │ │ │ ├── common │ │ │ │ ├── cache.service.ts │ │ │ │ ├── common.testing.ts │ │ │ │ ├── common.ts │ │ │ │ ├── simple-dialog.component.ts │ │ │ │ ├── ui.service.spec.ts │ │ │ │ ├── ui.service.ts │ │ │ │ └── validations.ts │ │ │ ├── home │ │ │ │ ├── home.component.spec.ts │ │ │ │ └── home.component.ts │ │ │ ├── inventory │ │ │ │ ├── categories │ │ │ │ │ ├── categories.component.html │ │ │ │ │ ├── categories.component.scss │ │ │ │ │ ├── categories.component.spec.ts │ │ │ │ │ └── categories.component.ts │ │ │ │ ├── inventory-home │ │ │ │ │ ├── inventory-home.component.spec.ts │ │ │ │ │ └── inventory-home.component.ts │ │ │ │ ├── inventory-routing.module.ts │ │ │ │ ├── inventory.component.spec.ts │ │ │ │ ├── inventory.component.ts │ │ │ │ ├── inventory.module.ts │ │ │ │ ├── products │ │ │ │ │ ├── products.component.html │ │ │ │ │ ├── products.component.scss │ │ │ │ │ ├── products.component.spec.ts │ │ │ │ │ └── products.component.ts │ │ │ │ └── stock-entry │ │ │ │ │ ├── stock-entry.component.html │ │ │ │ │ ├── stock-entry.component.scss │ │ │ │ │ ├── stock-entry.component.spec.ts │ │ │ │ │ └── stock-entry.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.scss │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ ├── manager │ │ │ │ ├── manager-home │ │ │ │ │ ├── manager-home.component.spec.ts │ │ │ │ │ └── manager-home.component.ts │ │ │ │ ├── manager-routing.module.ts │ │ │ │ ├── manager.component.spec.ts │ │ │ │ ├── manager.component.ts │ │ │ │ ├── manager.module.ts │ │ │ │ ├── receipt-lookup │ │ │ │ │ ├── receipt-lookup.component.html │ │ │ │ │ ├── receipt-lookup.component.scss │ │ │ │ │ ├── receipt-lookup.component.spec.ts │ │ │ │ │ └── receipt-lookup.component.ts │ │ │ │ └── user-management │ │ │ │ │ ├── user-management.component.html │ │ │ │ │ ├── user-management.component.scss │ │ │ │ │ ├── user-management.component.spec.ts │ │ │ │ │ └── user-management.component.ts │ │ │ ├── navigation-menu │ │ │ │ ├── navigation-menu.component.spec.ts │ │ │ │ └── navigation-menu.component.ts │ │ │ ├── page-not-found │ │ │ │ ├── page-not-found.component.spec.ts │ │ │ │ └── page-not-found.component.ts │ │ │ ├── pos │ │ │ │ ├── pos-routing.module.ts │ │ │ │ ├── pos.module.ts │ │ │ │ └── pos │ │ │ │ │ ├── pos.component.html │ │ │ │ │ ├── pos.component.scss │ │ │ │ │ ├── pos.component.spec.ts │ │ │ │ │ └── pos.component.ts │ │ │ ├── provideGraphQL.ts │ │ │ └── user │ │ │ │ ├── logout │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ │ │ ├── profile │ │ │ │ ├── profile.component.html │ │ │ │ ├── profile.component.scss │ │ │ │ ├── profile.component.spec.ts │ │ │ │ └── profile.component.ts │ │ │ │ ├── user-routing.module.ts │ │ │ │ ├── user.module.ts │ │ │ │ └── user │ │ │ │ └── user.ts │ │ ├── apple-touch-icon.png │ │ ├── assets │ │ │ └── img │ │ │ │ └── icons │ │ │ │ └── lemon.svg │ │ ├── browserconfig.xml │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── lemonmart-theme.scss │ │ ├── main.ts │ │ ├── manifest.json │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── mstile-70x70.png │ │ ├── safari-pinned-tab.svg │ │ └── styles.scss │ ├── tsconfig.app.json │ └── tsconfig.spec.json ├── stage11 │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── cypress │ │ ├── e2e │ │ │ └── spec.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ ├── support │ │ │ ├── commands.ts │ │ │ ├── component-index.html │ │ │ ├── component.ts │ │ │ └── e2e.ts │ │ └── tsconfig.json │ ├── karma.conf.js │ ├── src │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── app │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── auth │ │ │ │ ├── auth.custom.service.ts │ │ │ │ ├── auth.enum.ts │ │ │ │ ├── auth.factory.ts │ │ │ │ ├── auth.firebase.service.spec.ts │ │ │ │ ├── auth.firebase.service.ts │ │ │ │ ├── auth.graphql.custom.service.ts │ │ │ │ ├── auth.graphql.queries.ts │ │ │ │ ├── auth.guard.ts │ │ │ │ ├── auth.http.interceptor.ts │ │ │ │ ├── auth.in-memory.service.ts │ │ │ │ ├── auth.service.spec.ts │ │ │ │ └── auth.service.ts │ │ │ ├── common │ │ │ │ ├── base-form.class.spec.ts │ │ │ │ ├── base-form.class.ts │ │ │ │ ├── cache.service.ts │ │ │ │ ├── common.testing.ts │ │ │ │ ├── common.ts │ │ │ │ ├── simple-dialog.component.ts │ │ │ │ ├── ui.service.spec.ts │ │ │ │ ├── ui.service.ts │ │ │ │ └── validations.ts │ │ │ ├── home │ │ │ │ ├── home.component.spec.ts │ │ │ │ └── home.component.ts │ │ │ ├── inventory │ │ │ │ ├── categories │ │ │ │ │ ├── categories.component.html │ │ │ │ │ ├── categories.component.scss │ │ │ │ │ ├── categories.component.spec.ts │ │ │ │ │ └── categories.component.ts │ │ │ │ ├── inventory-home │ │ │ │ │ ├── inventory-home.component.spec.ts │ │ │ │ │ └── inventory-home.component.ts │ │ │ │ ├── inventory-routing.module.ts │ │ │ │ ├── inventory.component.spec.ts │ │ │ │ ├── inventory.component.ts │ │ │ │ ├── inventory.module.ts │ │ │ │ ├── products │ │ │ │ │ ├── products.component.html │ │ │ │ │ ├── products.component.scss │ │ │ │ │ ├── products.component.spec.ts │ │ │ │ │ └── products.component.ts │ │ │ │ └── stock-entry │ │ │ │ │ ├── stock-entry.component.html │ │ │ │ │ ├── stock-entry.component.scss │ │ │ │ │ ├── stock-entry.component.spec.ts │ │ │ │ │ └── stock-entry.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.scss │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ ├── manager │ │ │ │ ├── manager-home │ │ │ │ │ ├── manager-home.component.spec.ts │ │ │ │ │ └── manager-home.component.ts │ │ │ │ ├── manager-routing.module.ts │ │ │ │ ├── manager.component.spec.ts │ │ │ │ ├── manager.component.ts │ │ │ │ ├── manager.module.ts │ │ │ │ ├── receipt-lookup │ │ │ │ │ ├── receipt-lookup.component.html │ │ │ │ │ ├── receipt-lookup.component.scss │ │ │ │ │ ├── receipt-lookup.component.spec.ts │ │ │ │ │ └── receipt-lookup.component.ts │ │ │ │ └── user-management │ │ │ │ │ ├── user-management.component.html │ │ │ │ │ ├── user-management.component.scss │ │ │ │ │ ├── user-management.component.spec.ts │ │ │ │ │ └── user-management.component.ts │ │ │ ├── navigation-menu │ │ │ │ ├── navigation-menu.component.spec.ts │ │ │ │ └── navigation-menu.component.ts │ │ │ ├── page-not-found │ │ │ │ ├── page-not-found.component.spec.ts │ │ │ │ └── page-not-found.component.ts │ │ │ ├── pos │ │ │ │ ├── pos-routing.module.ts │ │ │ │ ├── pos.module.ts │ │ │ │ └── pos │ │ │ │ │ ├── pos.component.html │ │ │ │ │ ├── pos.component.scss │ │ │ │ │ ├── pos.component.spec.ts │ │ │ │ │ └── pos.component.ts │ │ │ ├── provideGraphQL.ts │ │ │ ├── user-controls │ │ │ │ ├── field-error │ │ │ │ │ ├── field-error.directive.spec.ts │ │ │ │ │ └── field-error.directive.ts │ │ │ │ └── lemon-rater │ │ │ │ │ ├── lemon-rater.component.html │ │ │ │ │ ├── lemon-rater.component.scss │ │ │ │ │ ├── lemon-rater.component.spec.ts │ │ │ │ │ └── lemon-rater.component.ts │ │ │ └── user │ │ │ │ ├── logout │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ │ │ ├── name-input │ │ │ │ ├── name-input.component.spec.ts │ │ │ │ └── name-input.component.ts │ │ │ │ ├── profile │ │ │ │ ├── data.ts │ │ │ │ ├── profile.component.html │ │ │ │ ├── profile.component.scss │ │ │ │ ├── profile.component.spec.ts │ │ │ │ ├── profile.component.ts │ │ │ │ ├── profile.initial.component.html │ │ │ │ └── profile.initial.component.ts │ │ │ │ ├── user-routing.module.ts │ │ │ │ ├── user.module.ts │ │ │ │ ├── user │ │ │ │ ├── user.service.ts │ │ │ │ └── user.ts │ │ │ │ └── view-user │ │ │ │ ├── view-user.component.spec.ts │ │ │ │ └── view-user.component.ts │ │ ├── apple-touch-icon.png │ │ ├── assets │ │ │ └── img │ │ │ │ └── icons │ │ │ │ └── lemon.svg │ │ ├── browserconfig.xml │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── lemonmart-theme.scss │ │ ├── main.ts │ │ ├── manifest.json │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── mstile-70x70.png │ │ ├── safari-pinned-tab.svg │ │ └── styles.scss │ ├── tsconfig.app.json │ └── tsconfig.spec.json ├── stage12 │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── cypress │ │ ├── e2e │ │ │ └── spec.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ ├── support │ │ │ ├── commands.ts │ │ │ ├── component-index.html │ │ │ ├── component.ts │ │ │ └── e2e.ts │ │ └── tsconfig.json │ ├── karma.conf.js │ ├── src │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── app │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── auth │ │ │ │ ├── auth.custom.service.ts │ │ │ │ ├── auth.enum.ts │ │ │ │ ├── auth.factory.ts │ │ │ │ ├── auth.firebase.service.spec.ts │ │ │ │ ├── auth.firebase.service.ts │ │ │ │ ├── auth.graphql.custom.service.ts │ │ │ │ ├── auth.graphql.queries.ts │ │ │ │ ├── auth.guard.ts │ │ │ │ ├── auth.http.interceptor.ts │ │ │ │ ├── auth.in-memory.service.ts │ │ │ │ ├── auth.service.spec.ts │ │ │ │ └── auth.service.ts │ │ │ ├── common │ │ │ │ ├── base-form.class.spec.ts │ │ │ │ ├── base-form.class.ts │ │ │ │ ├── cache.service.ts │ │ │ │ ├── common.testing.ts │ │ │ │ ├── common.ts │ │ │ │ ├── loading-overlay.component.ts │ │ │ │ ├── loading.http.interceptor.ts │ │ │ │ ├── outlet-closer.service.ts │ │ │ │ ├── simple-dialog.component.ts │ │ │ │ ├── ui.service.spec.ts │ │ │ │ ├── ui.service.ts │ │ │ │ └── validations.ts │ │ │ ├── entity-metadata.ts │ │ │ ├── home │ │ │ │ ├── home.component.spec.ts │ │ │ │ └── home.component.ts │ │ │ ├── inventory │ │ │ │ ├── categories │ │ │ │ │ ├── categories.component.html │ │ │ │ │ ├── categories.component.scss │ │ │ │ │ ├── categories.component.spec.ts │ │ │ │ │ └── categories.component.ts │ │ │ │ ├── inventory-home │ │ │ │ │ ├── inventory-home.component.spec.ts │ │ │ │ │ └── inventory-home.component.ts │ │ │ │ ├── inventory-routing.module.ts │ │ │ │ ├── inventory.component.spec.ts │ │ │ │ ├── inventory.component.ts │ │ │ │ ├── inventory.module.ts │ │ │ │ ├── products │ │ │ │ │ ├── products.component.html │ │ │ │ │ ├── products.component.scss │ │ │ │ │ ├── products.component.spec.ts │ │ │ │ │ └── products.component.ts │ │ │ │ └── stock-entry │ │ │ │ │ ├── stock-entry.component.html │ │ │ │ │ ├── stock-entry.component.scss │ │ │ │ │ ├── stock-entry.component.spec.ts │ │ │ │ │ └── stock-entry.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.scss │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ ├── manager │ │ │ │ ├── manager-home │ │ │ │ │ ├── manager-home.component.spec.ts │ │ │ │ │ └── manager-home.component.ts │ │ │ │ ├── manager-routing.module.ts │ │ │ │ ├── manager.component.spec.ts │ │ │ │ ├── manager.component.ts │ │ │ │ ├── manager.module.ts │ │ │ │ ├── receipt-lookup │ │ │ │ │ ├── receipt-lookup.component.html │ │ │ │ │ ├── receipt-lookup.component.scss │ │ │ │ │ ├── receipt-lookup.component.spec.ts │ │ │ │ │ └── receipt-lookup.component.ts │ │ │ │ ├── user-management │ │ │ │ │ ├── user-management.component.spec.ts │ │ │ │ │ └── user-management.component.ts │ │ │ │ └── user-table │ │ │ │ │ ├── user-table.component.html │ │ │ │ │ ├── user-table.component.scss │ │ │ │ │ ├── user-table.component.spec.ts │ │ │ │ │ └── user-table.component.ts │ │ │ ├── navigation-menu │ │ │ │ ├── navigation-menu.component.spec.ts │ │ │ │ └── navigation-menu.component.ts │ │ │ ├── page-not-found │ │ │ │ ├── page-not-found.component.spec.ts │ │ │ │ └── page-not-found.component.ts │ │ │ ├── pos │ │ │ │ ├── pos-routing.module.ts │ │ │ │ ├── pos.module.ts │ │ │ │ └── pos │ │ │ │ │ ├── pos.component.html │ │ │ │ │ ├── pos.component.scss │ │ │ │ │ ├── pos.component.spec.ts │ │ │ │ │ └── pos.component.ts │ │ │ ├── provideGraphQL.ts │ │ │ ├── user-controls │ │ │ │ ├── field-error │ │ │ │ │ ├── field-error.directive.spec.ts │ │ │ │ │ └── field-error.directive.ts │ │ │ │ └── lemon-rater │ │ │ │ │ ├── lemon-rater.component.html │ │ │ │ │ ├── lemon-rater.component.scss │ │ │ │ │ ├── lemon-rater.component.spec.ts │ │ │ │ │ └── lemon-rater.component.ts │ │ │ └── user │ │ │ │ ├── logout │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ │ │ ├── name-input │ │ │ │ ├── name-input.component.spec.ts │ │ │ │ └── name-input.component.ts │ │ │ │ ├── profile │ │ │ │ ├── data.ts │ │ │ │ ├── profile.component.html │ │ │ │ ├── profile.component.scss │ │ │ │ ├── profile.component.spec.ts │ │ │ │ └── profile.component.ts │ │ │ │ ├── user-routing.module.ts │ │ │ │ ├── user.module.ts │ │ │ │ ├── user │ │ │ │ ├── user.entity.service.ts │ │ │ │ ├── user.resolve.ts │ │ │ │ ├── user.service.spec.ts │ │ │ │ ├── user.service.ts │ │ │ │ └── user.ts │ │ │ │ └── view-user │ │ │ │ ├── view-user.component.spec.ts │ │ │ │ └── view-user.component.ts │ │ ├── apple-touch-icon.png │ │ ├── assets │ │ │ ├── img │ │ │ │ ├── icons │ │ │ │ │ └── lemon.svg │ │ │ │ └── lemon.png │ │ │ └── styles │ │ │ │ └── spinner.css │ │ ├── browserconfig.xml │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── lemonmart-theme.scss │ │ ├── main.ts │ │ ├── manifest.json │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── mstile-70x70.png │ │ ├── safari-pinned-tab.svg │ │ └── styles.scss │ ├── tsconfig.app.json │ └── tsconfig.spec.json ├── stage7 │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── cypress │ │ ├── e2e │ │ │ └── spec.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ ├── support │ │ │ ├── commands.ts │ │ │ ├── component-index.html │ │ │ ├── component.ts │ │ │ └── e2e.ts │ │ └── tsconfig.json │ ├── karma.conf.js │ ├── src │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── app │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── common │ │ │ │ └── common.testing.ts │ │ │ ├── home │ │ │ │ ├── home.component.spec.ts │ │ │ │ └── home.component.ts │ │ │ ├── inventory │ │ │ │ ├── categories │ │ │ │ │ ├── categories.component.html │ │ │ │ │ ├── categories.component.scss │ │ │ │ │ ├── categories.component.spec.ts │ │ │ │ │ └── categories.component.ts │ │ │ │ ├── inventory-home │ │ │ │ │ ├── inventory-home.component.spec.ts │ │ │ │ │ └── inventory-home.component.ts │ │ │ │ ├── inventory-routing.module.ts │ │ │ │ ├── inventory.component.spec.ts │ │ │ │ ├── inventory.component.ts │ │ │ │ ├── inventory.module.ts │ │ │ │ ├── products │ │ │ │ │ ├── products.component.html │ │ │ │ │ ├── products.component.scss │ │ │ │ │ ├── products.component.spec.ts │ │ │ │ │ └── products.component.ts │ │ │ │ └── stock-entry │ │ │ │ │ ├── stock-entry.component.html │ │ │ │ │ ├── stock-entry.component.scss │ │ │ │ │ ├── stock-entry.component.spec.ts │ │ │ │ │ └── stock-entry.component.ts │ │ │ ├── manager │ │ │ │ ├── manager-home │ │ │ │ │ ├── manager-home.component.spec.ts │ │ │ │ │ └── manager-home.component.ts │ │ │ │ ├── manager-routing.module.ts │ │ │ │ ├── manager.component.spec.ts │ │ │ │ ├── manager.component.ts │ │ │ │ ├── manager.module.ts │ │ │ │ ├── receipt-lookup │ │ │ │ │ ├── receipt-lookup.component.html │ │ │ │ │ ├── receipt-lookup.component.scss │ │ │ │ │ ├── receipt-lookup.component.spec.ts │ │ │ │ │ └── receipt-lookup.component.ts │ │ │ │ └── user-management │ │ │ │ │ ├── user-management.component.html │ │ │ │ │ ├── user-management.component.scss │ │ │ │ │ ├── user-management.component.spec.ts │ │ │ │ │ └── user-management.component.ts │ │ │ ├── page-not-found │ │ │ │ ├── page-not-found.component.spec.ts │ │ │ │ └── page-not-found.component.ts │ │ │ ├── pos │ │ │ │ ├── pos-routing.module.ts │ │ │ │ ├── pos.module.ts │ │ │ │ └── pos │ │ │ │ │ ├── pos.component.html │ │ │ │ │ ├── pos.component.scss │ │ │ │ │ ├── pos.component.spec.ts │ │ │ │ │ └── pos.component.ts │ │ │ └── user │ │ │ │ ├── logout │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ │ │ ├── navigation-menu │ │ │ │ ├── navigation-menu.component.spec.ts │ │ │ │ └── navigation-menu.component.ts │ │ │ │ ├── profile │ │ │ │ ├── profile.component.html │ │ │ │ ├── profile.component.scss │ │ │ │ ├── profile.component.spec.ts │ │ │ │ └── profile.component.ts │ │ │ │ ├── user-routing.module.ts │ │ │ │ └── user.module.ts │ │ ├── apple-touch-icon.png │ │ ├── assets │ │ │ └── img │ │ │ │ └── icons │ │ │ │ └── lemon.svg │ │ ├── browserconfig.xml │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── lemonmart-theme.scss │ │ ├── main.ts │ │ ├── manifest.json │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── mstile-70x70.png │ │ ├── safari-pinned-tab.svg │ │ └── styles.scss │ ├── tsconfig.app.json │ └── tsconfig.spec.json └── stage8 │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── cypress │ ├── e2e │ │ └── spec.cy.ts │ ├── fixtures │ │ └── example.json │ ├── support │ │ ├── commands.ts │ │ ├── component-index.html │ │ ├── component.ts │ │ └── e2e.ts │ └── tsconfig.json │ ├── karma.conf.js │ ├── src │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── app │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.config.ts │ │ ├── app.routes.ts │ │ ├── auth │ │ │ ├── auth.enum.ts │ │ │ ├── auth.factory.ts │ │ │ ├── auth.firebase.service.spec.ts │ │ │ ├── auth.firebase.service.ts │ │ │ ├── auth.guard.ts │ │ │ ├── auth.http.interceptor.ts │ │ │ ├── auth.in-memory.service.ts │ │ │ ├── auth.service.spec.ts │ │ │ └── auth.service.ts │ │ ├── common │ │ │ ├── cache.service.ts │ │ │ ├── common.testing.ts │ │ │ ├── common.ts │ │ │ ├── simple-dialog.component.ts │ │ │ ├── ui.service.spec.ts │ │ │ ├── ui.service.ts │ │ │ └── validations.ts │ │ ├── home │ │ │ ├── home.component.simple.ts │ │ │ ├── home.component.spec.ts │ │ │ └── home.component.ts │ │ ├── inventory │ │ │ ├── categories │ │ │ │ ├── categories.component.html │ │ │ │ ├── categories.component.scss │ │ │ │ ├── categories.component.spec.ts │ │ │ │ └── categories.component.ts │ │ │ ├── inventory-home │ │ │ │ ├── inventory-home.component.spec.ts │ │ │ │ └── inventory-home.component.ts │ │ │ ├── inventory-routing.module.ts │ │ │ ├── inventory.component.spec.ts │ │ │ ├── inventory.component.ts │ │ │ ├── inventory.module.ts │ │ │ ├── products │ │ │ │ ├── products.component.html │ │ │ │ ├── products.component.scss │ │ │ │ ├── products.component.spec.ts │ │ │ │ └── products.component.ts │ │ │ └── stock-entry │ │ │ │ ├── stock-entry.component.html │ │ │ │ ├── stock-entry.component.scss │ │ │ │ ├── stock-entry.component.spec.ts │ │ │ │ └── stock-entry.component.ts │ │ ├── login │ │ │ ├── login.component.html │ │ │ ├── login.component.scss │ │ │ ├── login.component.spec.ts │ │ │ └── login.component.ts │ │ ├── manager │ │ │ ├── manager-home │ │ │ │ ├── manager-home.component.spec.ts │ │ │ │ └── manager-home.component.ts │ │ │ ├── manager-routing.module.ts │ │ │ ├── manager.component.spec.ts │ │ │ ├── manager.component.ts │ │ │ ├── manager.module.ts │ │ │ ├── receipt-lookup │ │ │ │ ├── receipt-lookup.component.html │ │ │ │ ├── receipt-lookup.component.scss │ │ │ │ ├── receipt-lookup.component.spec.ts │ │ │ │ └── receipt-lookup.component.ts │ │ │ └── user-management │ │ │ │ ├── user-management.component.html │ │ │ │ ├── user-management.component.scss │ │ │ │ ├── user-management.component.spec.ts │ │ │ │ └── user-management.component.ts │ │ ├── navigation-menu │ │ │ ├── navigation-menu.component.spec.ts │ │ │ └── navigation-menu.component.ts │ │ ├── page-not-found │ │ │ ├── page-not-found.component.spec.ts │ │ │ └── page-not-found.component.ts │ │ ├── pos │ │ │ ├── pos-routing.module.ts │ │ │ ├── pos.module.ts │ │ │ └── pos │ │ │ │ ├── pos.component.html │ │ │ │ ├── pos.component.scss │ │ │ │ ├── pos.component.spec.ts │ │ │ │ └── pos.component.ts │ │ └── user │ │ │ ├── logout │ │ │ ├── logout.component.spec.ts │ │ │ └── logout.component.ts │ │ │ ├── profile │ │ │ ├── profile.component.html │ │ │ ├── profile.component.scss │ │ │ ├── profile.component.spec.ts │ │ │ └── profile.component.ts │ │ │ ├── user-routing.module.ts │ │ │ ├── user.module.ts │ │ │ └── user │ │ │ └── user.ts │ ├── apple-touch-icon.png │ ├── assets │ │ └── img │ │ │ └── icons │ │ │ └── lemon.svg │ ├── browserconfig.xml │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── index.html │ ├── lemonmart-theme.scss │ ├── main.ts │ ├── manifest.json │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── mstile-70x70.png │ ├── safari-pinned-tab.svg │ └── styles.scss │ ├── tsconfig.app.json │ └── tsconfig.spec.json ├── proxy.conf.json ├── pull_request_template.md ├── replicate.sh ├── replicate_batch.sh ├── src ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── app │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.config.ts │ ├── app.routes.ts │ ├── auth │ │ ├── auth.custom.service.ts │ │ ├── auth.enum.ts │ │ ├── auth.factory.ts │ │ ├── auth.firebase.service.spec.ts │ │ ├── auth.firebase.service.ts │ │ ├── auth.graphql.custom.service.ts │ │ ├── auth.graphql.queries.ts │ │ ├── auth.guard.ts │ │ ├── auth.http.interceptor.ts │ │ ├── auth.in-memory.service.ts │ │ ├── auth.service.spec.ts │ │ └── auth.service.ts │ ├── common │ │ ├── base-form.class.spec.ts │ │ ├── base-form.class.ts │ │ ├── cache.service.ts │ │ ├── common.testing.ts │ │ ├── common.ts │ │ ├── loading-overlay.component.ts │ │ ├── loading.http.interceptor.ts │ │ ├── outlet-closer.service.ts │ │ ├── simple-dialog.component.ts │ │ ├── ui.service.spec.ts │ │ ├── ui.service.ts │ │ └── validations.ts │ ├── entity-metadata.ts │ ├── home │ │ ├── home.component.spec.ts │ │ └── home.component.ts │ ├── inventory │ │ ├── categories │ │ │ ├── categories.component.html │ │ │ ├── categories.component.scss │ │ │ ├── categories.component.spec.ts │ │ │ └── categories.component.ts │ │ ├── inventory-home │ │ │ ├── inventory-home.component.spec.ts │ │ │ └── inventory-home.component.ts │ │ ├── inventory-routing.module.ts │ │ ├── inventory.component.spec.ts │ │ ├── inventory.component.ts │ │ ├── inventory.module.ts │ │ ├── products │ │ │ ├── products.component.html │ │ │ ├── products.component.scss │ │ │ ├── products.component.spec.ts │ │ │ └── products.component.ts │ │ └── stock-entry │ │ │ ├── stock-entry.component.html │ │ │ ├── stock-entry.component.scss │ │ │ ├── stock-entry.component.spec.ts │ │ │ └── stock-entry.component.ts │ ├── login │ │ ├── login.component.html │ │ ├── login.component.spec.ts │ │ └── login.component.ts │ ├── manager │ │ ├── manager-home │ │ │ ├── manager-home.component.spec.ts │ │ │ └── manager-home.component.ts │ │ ├── manager-routing.module.ts │ │ ├── manager.component.spec.ts │ │ ├── manager.component.ts │ │ ├── manager.module.ts │ │ ├── receipt-lookup │ │ │ ├── receipt-lookup.component.html │ │ │ ├── receipt-lookup.component.scss │ │ │ ├── receipt-lookup.component.spec.ts │ │ │ └── receipt-lookup.component.ts │ │ ├── user-management │ │ │ ├── user-management.component.spec.ts │ │ │ └── user-management.component.ts │ │ └── user-table │ │ │ ├── user-table.component.html │ │ │ ├── user-table.component.scss │ │ │ ├── user-table.component.spec.ts │ │ │ └── user-table.component.ts │ ├── navigation-menu │ │ ├── navigation-menu.component.spec.ts │ │ └── navigation-menu.component.ts │ ├── page-not-found │ │ ├── page-not-found.component.spec.ts │ │ └── page-not-found.component.ts │ ├── pos │ │ ├── pos-routing.module.ts │ │ ├── pos.module.ts │ │ ├── pos │ │ │ ├── pos.component.html │ │ │ ├── pos.component.scss │ │ │ ├── pos.component.spec.ts │ │ │ └── pos.component.ts │ │ └── transaction │ │ │ ├── transaction.enum.ts │ │ │ ├── transaction.service.spec.ts │ │ │ ├── transaction.service.ts │ │ │ └── transaction.ts │ ├── provideGraphQL.ts │ ├── user-controls │ │ ├── field-error │ │ │ ├── field-error.directive.spec.ts │ │ │ └── field-error.directive.ts │ │ └── lemon-rater │ │ │ ├── lemon-rater.component.html │ │ │ ├── lemon-rater.component.scss │ │ │ ├── lemon-rater.component.spec.ts │ │ │ └── lemon-rater.component.ts │ └── user │ │ ├── logout │ │ ├── logout.component.spec.ts │ │ └── logout.component.ts │ │ ├── name-input │ │ ├── name-input.component.spec.ts │ │ └── name-input.component.ts │ │ ├── profile │ │ ├── data.ts │ │ ├── profile.component.html │ │ ├── profile.component.scss │ │ ├── profile.component.spec.ts │ │ └── profile.component.ts │ │ ├── user-routing.module.ts │ │ ├── user.module.ts │ │ ├── user │ │ ├── user.entity.service.ts │ │ ├── user.resolve.ts │ │ ├── user.service.spec.ts │ │ ├── user.service.ts │ │ └── user.ts │ │ └── view-user │ │ ├── view-user.component.spec.ts │ │ └── view-user.component.ts ├── apple-touch-icon.png ├── assets │ ├── img │ │ ├── icons │ │ │ └── lemon.svg │ │ └── lemon.png │ └── styles │ │ └── spinner.css ├── browserconfig.xml ├── environments │ ├── environment.firebase.ts │ ├── environment.lemon-mart-server.ts │ ├── environment.prod.ts │ └── environment.ts ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── index.html ├── lemonmart-theme.scss ├── main.ts ├── manifest.json ├── mstile-144x144.png ├── mstile-150x150.png ├── mstile-310x150.png ├── mstile-310x310.png ├── mstile-70x70.png ├── safari-pinned-tab.svg └── styles.scss ├── test.Dockerfile ├── tsconfig.app.json ├── tsconfig.json └── tsconfig.spec.json /.circleci/setup-heroku.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | wget https://cli-assets.heroku.com/branches/stable/heroku-linux-amd64.tar.gz 3 | sudo mkdir -p /usr/local/lib /usr/local/bin 4 | sudo tar -xvzf heroku-linux-amd64.tar.gz -C /usr/local/lib 5 | sudo ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku 6 | 7 | cat > ~/.netrc << EOF 8 | machine api.heroku.com 9 | login $HEROKU_LOGIN 10 | password $HEROKU_API_KEY 11 | EOF 12 | 13 | cat >> ~/.ssh/config << EOF 14 | VerifyHostKeyDNS yes 15 | StrictHostKeyChecking no 16 | EOF 17 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "lemon-mart-007": { 4 | "hosting": { 5 | "lemon-mart": [ 6 | "lemon-mart-007" 7 | ] 8 | } 9 | } 10 | }, 11 | "projects": { 12 | "default": "lemon-mart-007" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /coverage 3 | .angular 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "printWidth": 90, 5 | "semi": false, 6 | "singleQuote": true, 7 | "trailingComma": "es5", 8 | "bracketSameLine": true, 9 | "overrides": [ 10 | { 11 | "files": "*.html", 12 | "options": { 13 | "parser": "angular" 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "circleci.circleci", 4 | "dbaeumer.vscode-eslint", 5 | "esbenp.prettier-vscode", 6 | "github.vscode-pull-request-github", 7 | "expertly-simple.ng-evergreen", 8 | "formulahendry.auto-close-tag", 9 | "johnpapa.angular-essentials", 10 | "johnpapa.vscode-peacock", 11 | "ms-azuretools.vscode-docker", 12 | "PKief.material-icon-theme" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | }, 12 | { 13 | "name": "ng test", 14 | "type": "chrome", 15 | "request": "launch", 16 | "preLaunchTask": "npm: test", 17 | "url": "http://localhost:9876/debug.html" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM duluca/minimal-node-web-server:lts-alpine 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY dist/lemon-mart public 6 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: npx http-server ./dist/lemon-mart -p $PORT 2 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lemon-mart", 3 | "scripts": { 4 | }, 5 | "env": { 6 | "NODE_ENV": "dev" 7 | }, 8 | "formation": { 9 | "web": { 10 | "quantity": 1 11 | } 12 | }, 13 | "addons": [ 14 | 15 | ], 16 | "buildpacks": [ 17 | { 18 | "url": "heroku/nodejs" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /build.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM duluca/minimal-node-build-env:lts-alpine as builder 2 | 3 | ENV BUILDER_SRC_DIR=/usr/src 4 | 5 | # setup source code directory and copy source code 6 | WORKDIR $BUILDER_SRC_DIR 7 | COPY . . 8 | 9 | # install dependencies and build 10 | RUN npm ci 11 | RUN npm run build:prod 12 | -------------------------------------------------------------------------------- /cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4200', 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: 'angular', 11 | bundler: 'webpack', 12 | }, 13 | specPattern: '**/*.cy.ts', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /cypress/e2e/app.cy.ts: -------------------------------------------------------------------------------- 1 | import '../support/commands' 2 | 3 | describe('LemonMart', () => { 4 | beforeEach(() => { 5 | cy.visit('/') 6 | }) 7 | 8 | it('has the correct title', () => { 9 | cy.byTestId('title').should('have.text', 'LemonMart') 10 | }) 11 | 12 | it('can login as cashier', () => { 13 | cy.get('[aria-label="E-mail"]').type('cashier@test.com') 14 | cy.get('[aria-label="Password"]').type('12345678') 15 | cy.contains('Login').click() 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "sourceMap": false, 6 | "types": ["cypress"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | web-app: 4 | build: . 5 | ports: 6 | - '8080:3000' 7 | links: 8 | - server 9 | 10 | server: 11 | image: duluca/lemon-mart-swagger-server 12 | ports: 13 | - '3000:3000' 14 | -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | # Document required environment variables for .env file here 2 | # Execute npm run init:env to generate a .env file from example 3 | AWS_ACCESS_KEY_ID= 4 | AWS_SECRET_ACCESS_KEY= 5 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/firebase/firebase-tools/master/schema/firebase-config.json", 3 | "hosting": { 4 | "target": "lemon-mart", 5 | "public": "dist/lemon-mart", 6 | "ignore": [ 7 | "firebase.json", 8 | "**/.*", 9 | "**/node_modules/**" 10 | ], 11 | "rewrites": [ 12 | { 13 | "source": "**", 14 | "destination": "/index.html" 15 | } 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /nginx.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM duluca/minimal-nginx-web-server:1-alpine 2 | 3 | COPY dist/lemon-mart /var/www 4 | 5 | CMD 'nginx' 6 | -------------------------------------------------------------------------------- /projects/stage10/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc.json", 3 | "ignorePatterns": ["!**/*", "coverage"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts"], 7 | "rules": { 8 | "@angular-eslint/directive-selector": [ 9 | "error", 10 | { 11 | "type": "attribute", 12 | "prefix": "app", 13 | "style": "camelCase" 14 | } 15 | ], 16 | "@angular-eslint/component-selector": [ 17 | "error", 18 | { 19 | "type": "element", 20 | "prefix": "app", 21 | "style": "kebab-case" 22 | } 23 | ] 24 | } 25 | }, 26 | { 27 | "files": ["*.html"], 28 | "rules": {} 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /projects/stage10/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4200', 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: 'angular', 11 | bundler: 'webpack', 12 | }, 13 | specPattern: '**/*.cy.ts', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /projects/stage10/cypress/e2e/spec.cy.ts: -------------------------------------------------------------------------------- 1 | describe('My First Test', () => { 2 | it('Visits the initial project page', () => { 3 | cy.visit('/') 4 | cy.contains('app is running!') 5 | }) 6 | }) 7 | -------------------------------------------------------------------------------- /projects/stage10/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /projects/stage10/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/stage10/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /projects/stage10/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "sourceMap": false, 6 | "types": ["cypress"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage10/src/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/android-chrome-192x192.png -------------------------------------------------------------------------------- /projects/stage10/src/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/android-chrome-512x512.png -------------------------------------------------------------------------------- /projects/stage10/src/app/auth/auth.enum.ts: -------------------------------------------------------------------------------- 1 | export enum Role { 2 | None = 'none', 3 | Clerk = 'clerk', 4 | Cashier = 'cashier', 5 | Manager = 'manager', 6 | } 7 | 8 | export enum AuthMode { 9 | InMemory = 'In Memory', 10 | CustomServer = 'Custom Server', 11 | Firebase = 'Firebase', 12 | } 13 | -------------------------------------------------------------------------------- /projects/stage10/src/app/auth/auth.factory.ts: -------------------------------------------------------------------------------- 1 | import { environment } from '../../environments/environment' 2 | import { CustomAuthService } from './auth.custom.service' 3 | import { AuthMode } from './auth.enum' 4 | import { FirebaseAuthService } from './auth.firebase.service' 5 | import { InMemoryAuthService } from './auth.in-memory.service' 6 | 7 | export function authFactory() { 8 | switch (environment.authMode) { 9 | case AuthMode.InMemory: 10 | return new InMemoryAuthService() 11 | case AuthMode.Firebase: 12 | return new FirebaseAuthService() 13 | case AuthMode.CustomServer: 14 | return new CustomAuthService() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage10/src/app/auth/auth.graphql.queries.ts: -------------------------------------------------------------------------------- 1 | import { gql } from 'apollo-angular' 2 | 3 | export const GET_ME = gql` 4 | query Me { 5 | me { 6 | address { 7 | line1 8 | line2 9 | city 10 | state 11 | zip 12 | } 13 | dateOfBirth 14 | email 15 | id 16 | level 17 | name { 18 | first 19 | middle 20 | last 21 | } 22 | phones { 23 | digits 24 | type 25 | } 26 | picture 27 | role 28 | userStatus 29 | } 30 | } 31 | ` 32 | 33 | export const LOGIN = gql` 34 | mutation Login($email: String!, $password: String!) { 35 | login(email: $email, password: $password) { 36 | accessToken 37 | } 38 | } 39 | ` 40 | -------------------------------------------------------------------------------- /projects/stage10/src/app/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { TestBed } from '@angular/core/testing' 3 | import { autoSpyObj } from 'angular-unit-test-helper' 4 | 5 | import { UiService } from '../common/ui.service' 6 | import { AuthService } from './auth.service' 7 | 8 | describe('AuthService', () => { 9 | let service: AuthService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [HttpClientTestingModule], 14 | providers: [AuthService, { provide: UiService, useValue: autoSpyObj(UiService) }], 15 | }) 16 | service = TestBed.inject(AuthService) 17 | }) 18 | 19 | it('should be created', () => { 20 | expect(service).toBeTruthy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /projects/stage10/src/app/common/common.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http' 2 | import { throwError } from 'rxjs' 3 | 4 | export function transformError(error: HttpErrorResponse | string) { 5 | let errorMessage = 'An unknown error has occurred' 6 | if (typeof error === 'string') { 7 | errorMessage = error 8 | } else if (error.error instanceof ErrorEvent) { 9 | errorMessage = `Error! ${error.error.message}` 10 | } else if (error.status) { 11 | errorMessage = `Request failed with ${error.status} ${error.statusText}` 12 | } else if (error instanceof Error) { 13 | errorMessage = error.message 14 | } 15 | return throwError(() => errorMessage) 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage10/src/app/common/ui.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { MatDialogModule } from '@angular/material/dialog' 3 | import { MatSnackBarModule } from '@angular/material/snack-bar' 4 | 5 | import { commonTestingModules } from './common.testing' 6 | import { UiService } from './ui.service' 7 | 8 | describe('UiService', () => { 9 | let service: UiService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [...commonTestingModules, MatSnackBarModule, MatDialogModule], 14 | }) 15 | service = TestBed.inject(UiService) 16 | }) 17 | 18 | it('should be created', () => { 19 | expect(service).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /projects/stage10/src/app/common/validations.ts: -------------------------------------------------------------------------------- 1 | import { Validators } from '@angular/forms' 2 | 3 | export const EmailValidation = [Validators.required, Validators.email] 4 | export const PasswordValidation = [ 5 | Validators.required, 6 | Validators.minLength(8), 7 | Validators.maxLength(50), 8 | ] 9 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/categories/categories.component.html: -------------------------------------------------------------------------------- 1 |

2 | Categories 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/categories/categories.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/inventory/categories/categories.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/categories/categories.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { CategoriesComponent } from './categories.component' 4 | 5 | describe('CategoriesComponent', () => { 6 | let component: CategoriesComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [CategoriesComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(CategoriesComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/categories/categories.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-categories', 5 | templateUrl: './categories.component.html', 6 | styleUrls: ['./categories.component.scss'], 7 | standalone: true, 8 | }) 9 | export class CategoriesComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/inventory-home/inventory-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-inventory-home', 5 | template: ` 6 |

7 | Inventory 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class InventoryHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/products/products.component.html: -------------------------------------------------------------------------------- 1 |

2 | Inventory 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/products/products.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/inventory/products/products.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/products/products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProductsComponent } from './products.component' 4 | 5 | describe('ProductsComponent', () => { 6 | let component: ProductsComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProductsComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProductsComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/products/products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-products', 5 | templateUrl: './products.component.html', 6 | styleUrls: ['./products.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProductsComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/stock-entry/stock-entry.component.html: -------------------------------------------------------------------------------- 1 |

2 | Stock Entry 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/stock-entry/stock-entry.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/inventory/stock-entry/stock-entry.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/stock-entry/stock-entry.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { StockEntryComponent } from './stock-entry.component' 4 | 5 | describe('StockEntryComponent', () => { 6 | let component: StockEntryComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [StockEntryComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(StockEntryComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage10/src/app/inventory/stock-entry/stock-entry.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-stock-entry', 5 | templateUrl: './stock-entry.component.html', 6 | styleUrls: ['./stock-entry.component.scss'], 7 | standalone: true, 8 | }) 9 | export class StockEntryComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/login/login.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/login/login.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/manager-home/manager-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ManagerHomeComponent } from './manager-home.component' 4 | 5 | describe('ManagerHomeComponent', () => { 6 | let component: ManagerHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ManagerHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ManagerHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/manager-home/manager-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-manager-home', 5 | template: ` 6 |

7 | Manager Home 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class ManagerHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/manager.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { ManagerComponent } from './manager.component' 5 | import { ManagerHomeComponent } from './manager-home/manager-home.component' 6 | import { ManagerRoutingModule } from './manager-routing.module' 7 | import { ReceiptLookupComponent } from './receipt-lookup/receipt-lookup.component' 8 | import { UserManagementComponent } from './user-management/user-management.component' 9 | 10 | @NgModule({ 11 | imports: [ 12 | CommonModule, 13 | ManagerRoutingModule, 14 | ManagerHomeComponent, 15 | ManagerComponent, 16 | UserManagementComponent, 17 | ReceiptLookupComponent, 18 | ], 19 | }) 20 | export class ManagerModule {} 21 | -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/receipt-lookup/receipt-lookup.component.html: -------------------------------------------------------------------------------- 1 |

2 | Receipt Lookup 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/receipt-lookup/receipt-lookup.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/manager/receipt-lookup/receipt-lookup.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/receipt-lookup/receipt-lookup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-receipt-lookup', 5 | templateUrl: './receipt-lookup.component.html', 6 | styleUrls: ['./receipt-lookup.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ReceiptLookupComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/user-management/user-management.component.html: -------------------------------------------------------------------------------- 1 |

2 | User Management 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/user-management/user-management.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/manager/user-management/user-management.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/manager/user-management/user-management.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-user-management', 5 | templateUrl: './user-management.component.html', 6 | styleUrls: ['./user-management.component.scss'], 7 | standalone: true, 8 | }) 9 | export class UserManagementComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-page-not-found', 6 | template: ` 7 |

8 | This page doesn't exist. Go back to 9 | home 10 | . 11 |

12 | `, 13 | standalone: true, 14 | imports: [RouterLink], 15 | }) 16 | export class PageNotFoundComponent {} 17 | -------------------------------------------------------------------------------- /projects/stage10/src/app/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | 6 | const routes: Routes = [{ path: '', component: PosComponent }] 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class PosRoutingModule {} 13 | -------------------------------------------------------------------------------- /projects/stage10/src/app/pos/pos.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | import { PosRoutingModule } from './pos-routing.module' 6 | 7 | @NgModule({ 8 | imports: [CommonModule, PosRoutingModule, PosComponent], 9 | }) 10 | export class PosModule {} 11 | -------------------------------------------------------------------------------- /projects/stage10/src/app/pos/pos/pos.component.html: -------------------------------------------------------------------------------- 1 |

2 | Point of Sale 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/pos/pos/pos.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/pos/pos/pos.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/pos/pos/pos.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { PosComponent } from './pos.component' 4 | 5 | describe('PosComponent', () => { 6 | let component: PosComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [PosComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(PosComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage10/src/app/pos/pos/pos.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-pos', 5 | templateUrl: './pos.component.html', 6 | styleUrls: ['./pos.component.scss'], 7 | standalone: true, 8 | }) 9 | export class PosComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/user/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | import { Router } from '@angular/router' 3 | 4 | import { AuthService } from '../../auth/auth.service' 5 | 6 | @Component({ 7 | selector: 'app-logout', 8 | template: `

Logging out...

`, 9 | standalone: true, 10 | }) 11 | export class LogoutComponent implements OnInit { 12 | constructor( 13 | private router: Router, 14 | private authService: AuthService 15 | ) {} 16 | 17 | ngOnInit() { 18 | this.authService.logout(true) 19 | this.router.navigate(['/']) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /projects/stage10/src/app/user/profile/profile.component.html: -------------------------------------------------------------------------------- 1 |

2 | Profile 5 |

6 | -------------------------------------------------------------------------------- /projects/stage10/src/app/user/profile/profile.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/app/user/profile/profile.component.scss -------------------------------------------------------------------------------- /projects/stage10/src/app/user/profile/profile.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProfileComponent } from './profile.component' 4 | 5 | describe('ProfileComponent', () => { 6 | let component: ProfileComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProfileComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProfileComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage10/src/app/user/profile/profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-profile', 5 | templateUrl: './profile.component.html', 6 | styleUrls: ['./profile.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProfileComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage10/src/app/user/user-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { authGuard } from '../auth/auth.guard' 5 | import { LogoutComponent } from './logout/logout.component' 6 | import { ProfileComponent } from './profile/profile.component' 7 | 8 | const routes: Routes = [ 9 | { path: 'profile', component: ProfileComponent, canActivate: [authGuard] }, 10 | { path: 'logout', component: LogoutComponent }, 11 | ] 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class UserRoutingModule {} 18 | -------------------------------------------------------------------------------- /projects/stage10/src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { LogoutComponent } from './logout/logout.component' 5 | import { ProfileComponent } from './profile/profile.component' 6 | import { UserRoutingModule } from './user-routing.module' 7 | 8 | @NgModule({ 9 | imports: [CommonModule, UserRoutingModule, ProfileComponent, LogoutComponent], 10 | }) 11 | export class UserModule {} 12 | -------------------------------------------------------------------------------- /projects/stage10/src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/apple-touch-icon.png -------------------------------------------------------------------------------- /projects/stage10/src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffc40d 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /projects/stage10/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | baseUrl: 'http://localhost:3000', 6 | authMode: AuthMode.CustomServer, 7 | firebase: { 8 | apiKey: 'AIzaSyA_39OnkusNS7WeMqTuhRosonMV20WntcA', 9 | authDomain: 'lemon-mart-007.firebaseapp.com', 10 | databaseURL: 'https://lemon-mart-007.firebaseio.com', 11 | projectId: 'lemon-mart-007', 12 | storageBucket: '', 13 | messagingSenderId: '416892066612', 14 | appId: '1:416892066612:web:ec2f404c18fd4bd8', 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage10/src/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/favicon-16x16.png -------------------------------------------------------------------------------- /projects/stage10/src/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/favicon-32x32.png -------------------------------------------------------------------------------- /projects/stage10/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/favicon.ico -------------------------------------------------------------------------------- /projects/stage10/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core' 2 | import { bootstrapApplication } from '@angular/platform-browser' 3 | 4 | import { AppComponent } from './app/app.component' 5 | import { appConfig } from './app/app.config' 6 | import { environment } from './environments/environment' 7 | 8 | if (environment.production) { 9 | enableProdMode() 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.log(err)) 13 | -------------------------------------------------------------------------------- /projects/stage10/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png?v=rMlKOnvxlK", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png?v=rMlKOnvxlK", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /projects/stage10/src/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/mstile-144x144.png -------------------------------------------------------------------------------- /projects/stage10/src/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/mstile-150x150.png -------------------------------------------------------------------------------- /projects/stage10/src/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/mstile-310x150.png -------------------------------------------------------------------------------- /projects/stage10/src/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/mstile-310x310.png -------------------------------------------------------------------------------- /projects/stage10/src/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage10/src/mstile-70x70.png -------------------------------------------------------------------------------- /projects/stage10/src/styles.scss: -------------------------------------------------------------------------------- 1 | @use 'lemonmart-theme'; 2 | /* You can add global styles to this file, and also import other style files */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | } 8 | body { 9 | margin: 0; 10 | font-family: Roboto, 'Helvetica Neue', sans-serif; 11 | } 12 | 13 | .top-pad { 14 | margin-top: 16px; 15 | } 16 | 17 | .h-pad { 18 | margin: 0 16px; 19 | } 20 | 21 | .flex-spacer { 22 | flex: 1 1 auto; 23 | } 24 | -------------------------------------------------------------------------------- /projects/stage10/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /projects/stage10/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/spec", 5 | "types": ["jasmine"] 6 | }, 7 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage11/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc.json", 3 | "ignorePatterns": ["!**/*", "coverage"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts"], 7 | "rules": { 8 | "@angular-eslint/directive-selector": [ 9 | "error", 10 | { 11 | "type": "attribute", 12 | "prefix": "app", 13 | "style": "camelCase" 14 | } 15 | ], 16 | "@angular-eslint/component-selector": [ 17 | "error", 18 | { 19 | "type": "element", 20 | "prefix": "app", 21 | "style": "kebab-case" 22 | } 23 | ] 24 | } 25 | }, 26 | { 27 | "files": ["*.html"], 28 | "rules": {} 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /projects/stage11/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4200', 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: 'angular', 11 | bundler: 'webpack', 12 | }, 13 | specPattern: '**/*.cy.ts', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /projects/stage11/cypress/e2e/spec.cy.ts: -------------------------------------------------------------------------------- 1 | describe('My First Test', () => { 2 | it('Visits the initial project page', () => { 3 | cy.visit('/') 4 | cy.contains('app is running!') 5 | }) 6 | }) 7 | -------------------------------------------------------------------------------- /projects/stage11/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /projects/stage11/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/stage11/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /projects/stage11/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "sourceMap": false, 6 | "types": ["cypress"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage11/src/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/android-chrome-192x192.png -------------------------------------------------------------------------------- /projects/stage11/src/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/android-chrome-512x512.png -------------------------------------------------------------------------------- /projects/stage11/src/app/auth/auth.enum.ts: -------------------------------------------------------------------------------- 1 | export enum Role { 2 | None = 'none', 3 | Clerk = 'clerk', 4 | Cashier = 'cashier', 5 | Manager = 'manager', 6 | } 7 | 8 | export enum AuthMode { 9 | InMemory = 'In Memory', 10 | CustomServer = 'Custom Server', 11 | Firebase = 'Firebase', 12 | } 13 | -------------------------------------------------------------------------------- /projects/stage11/src/app/auth/auth.factory.ts: -------------------------------------------------------------------------------- 1 | import { environment } from '../../environments/environment' 2 | import { CustomAuthService } from './auth.custom.service' 3 | import { AuthMode } from './auth.enum' 4 | import { FirebaseAuthService } from './auth.firebase.service' 5 | import { InMemoryAuthService } from './auth.in-memory.service' 6 | 7 | export function authFactory() { 8 | switch (environment.authMode) { 9 | case AuthMode.InMemory: 10 | return new InMemoryAuthService() 11 | case AuthMode.Firebase: 12 | return new FirebaseAuthService() 13 | case AuthMode.CustomServer: 14 | return new CustomAuthService() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage11/src/app/auth/auth.graphql.queries.ts: -------------------------------------------------------------------------------- 1 | import { gql } from 'apollo-angular' 2 | 3 | export const GET_ME = gql` 4 | query Me { 5 | me { 6 | address { 7 | line1 8 | line2 9 | city 10 | state 11 | zip 12 | } 13 | dateOfBirth 14 | email 15 | id 16 | level 17 | name { 18 | first 19 | middle 20 | last 21 | } 22 | phones { 23 | digits 24 | type 25 | } 26 | picture 27 | role 28 | userStatus 29 | } 30 | } 31 | ` 32 | 33 | export const LOGIN = gql` 34 | mutation Login($email: String!, $password: String!) { 35 | login(email: $email, password: $password) { 36 | accessToken 37 | } 38 | } 39 | ` 40 | -------------------------------------------------------------------------------- /projects/stage11/src/app/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { TestBed } from '@angular/core/testing' 3 | import { autoSpyObj } from 'angular-unit-test-helper' 4 | 5 | import { UiService } from '../common/ui.service' 6 | import { AuthService } from './auth.service' 7 | 8 | describe('AuthService', () => { 9 | let service: AuthService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [HttpClientTestingModule], 14 | providers: [AuthService, { provide: UiService, useValue: autoSpyObj(UiService) }], 15 | }) 16 | service = TestBed.inject(AuthService) 17 | }) 18 | 19 | it('should be created', () => { 20 | expect(service).toBeTruthy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /projects/stage11/src/app/common/base-form.class.spec.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core' 2 | import { FormGroup } from '@angular/forms' 3 | 4 | import { BaseFormDirective } from './base-form.class' 5 | 6 | interface ITestData { 7 | name: string 8 | } 9 | 10 | @Directive() 11 | class TestFormDirective extends BaseFormDirective { 12 | buildForm(): FormGroup { 13 | return jasmine.createSpyObj('form', []) 14 | } 15 | } 16 | 17 | describe('BaseFormDirective', () => { 18 | it('should create an instance', () => { 19 | expect(new TestFormDirective()).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /projects/stage11/src/app/common/common.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http' 2 | import { throwError } from 'rxjs' 3 | 4 | export function transformError(error: HttpErrorResponse | string) { 5 | let errorMessage = 'An unknown error has occurred' 6 | if (typeof error === 'string') { 7 | errorMessage = error 8 | } else if (error.error instanceof ErrorEvent) { 9 | errorMessage = `Error! ${error.error.message}` 10 | } else if (error.status) { 11 | errorMessage = `Request failed with ${error.status} ${error.statusText}` 12 | } else if (error instanceof Error) { 13 | errorMessage = error.message 14 | } 15 | return throwError(() => errorMessage) 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage11/src/app/common/ui.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { MatDialogModule } from '@angular/material/dialog' 3 | import { MatSnackBarModule } from '@angular/material/snack-bar' 4 | 5 | import { commonTestingModules } from './common.testing' 6 | import { UiService } from './ui.service' 7 | 8 | describe('UiService', () => { 9 | let service: UiService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [...commonTestingModules, MatSnackBarModule, MatDialogModule], 14 | }) 15 | service = TestBed.inject(UiService) 16 | }) 17 | 18 | it('should be created', () => { 19 | expect(service).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/categories/categories.component.html: -------------------------------------------------------------------------------- 1 |

2 | Categories 5 |

6 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/categories/categories.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/inventory/categories/categories.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/categories/categories.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { CategoriesComponent } from './categories.component' 4 | 5 | describe('CategoriesComponent', () => { 6 | let component: CategoriesComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [CategoriesComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(CategoriesComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/categories/categories.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-categories', 5 | templateUrl: './categories.component.html', 6 | styleUrls: ['./categories.component.scss'], 7 | standalone: true, 8 | }) 9 | export class CategoriesComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/inventory-home/inventory-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-inventory-home', 5 | template: ` 6 |

7 | Inventory Home 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class InventoryHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/products/products.component.html: -------------------------------------------------------------------------------- 1 |

2 | Products 5 |

6 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/products/products.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/inventory/products/products.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/products/products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProductsComponent } from './products.component' 4 | 5 | describe('ProductsComponent', () => { 6 | let component: ProductsComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProductsComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProductsComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/products/products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-products', 5 | templateUrl: './products.component.html', 6 | styleUrls: ['./products.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProductsComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/stock-entry/stock-entry.component.html: -------------------------------------------------------------------------------- 1 |

2 | Stock Entry 5 |

6 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/stock-entry/stock-entry.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/inventory/stock-entry/stock-entry.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/stock-entry/stock-entry.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { StockEntryComponent } from './stock-entry.component' 4 | 5 | describe('StockEntryComponent', () => { 6 | let component: StockEntryComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [StockEntryComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(StockEntryComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage11/src/app/inventory/stock-entry/stock-entry.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-stock-entry', 5 | templateUrl: './stock-entry.component.html', 6 | styleUrls: ['./stock-entry.component.scss'], 7 | standalone: true, 8 | }) 9 | export class StockEntryComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage11/src/app/login/login.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/login/login.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/manager-home/manager-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ManagerHomeComponent } from './manager-home.component' 4 | 5 | describe('ManagerHomeComponent', () => { 6 | let component: ManagerHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ManagerHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ManagerHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/manager-home/manager-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-manager-home', 5 | template: ` 6 |

7 | Manager Home 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class ManagerHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/manager.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { ManagerComponent } from './manager.component' 5 | import { ManagerHomeComponent } from './manager-home/manager-home.component' 6 | import { ManagerRoutingModule } from './manager-routing.module' 7 | import { ReceiptLookupComponent } from './receipt-lookup/receipt-lookup.component' 8 | import { UserManagementComponent } from './user-management/user-management.component' 9 | 10 | @NgModule({ 11 | imports: [ 12 | CommonModule, 13 | ManagerRoutingModule, 14 | ManagerHomeComponent, 15 | ManagerComponent, 16 | UserManagementComponent, 17 | ReceiptLookupComponent, 18 | ], 19 | }) 20 | export class ManagerModule {} 21 | -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/receipt-lookup/receipt-lookup.component.html: -------------------------------------------------------------------------------- 1 |

2 | Receipt Lookup 5 |

6 | -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/receipt-lookup/receipt-lookup.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/manager/receipt-lookup/receipt-lookup.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/receipt-lookup/receipt-lookup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-receipt-lookup', 5 | templateUrl: './receipt-lookup.component.html', 6 | styleUrls: ['./receipt-lookup.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ReceiptLookupComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/user-management/user-management.component.html: -------------------------------------------------------------------------------- 1 |

2 | User Management 5 |

6 | -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/user-management/user-management.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/manager/user-management/user-management.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/manager/user-management/user-management.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-user-management', 5 | templateUrl: './user-management.component.html', 6 | styleUrls: ['./user-management.component.scss'], 7 | standalone: true, 8 | }) 9 | export class UserManagementComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage11/src/app/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-page-not-found', 6 | template: ` 7 |

8 | This page doesn't exist. Go back to 9 | home 10 | . 11 |

12 | `, 13 | standalone: true, 14 | imports: [RouterLink], 15 | }) 16 | export class PageNotFoundComponent {} 17 | -------------------------------------------------------------------------------- /projects/stage11/src/app/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | 6 | const routes: Routes = [{ path: '', component: PosComponent }] 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class PosRoutingModule {} 13 | -------------------------------------------------------------------------------- /projects/stage11/src/app/pos/pos.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | import { PosRoutingModule } from './pos-routing.module' 6 | 7 | @NgModule({ 8 | imports: [CommonModule, PosRoutingModule, PosComponent], 9 | }) 10 | export class PosModule {} 11 | -------------------------------------------------------------------------------- /projects/stage11/src/app/pos/pos/pos.component.html: -------------------------------------------------------------------------------- 1 |

2 | POS 5 |

6 | -------------------------------------------------------------------------------- /projects/stage11/src/app/pos/pos/pos.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/app/pos/pos/pos.component.scss -------------------------------------------------------------------------------- /projects/stage11/src/app/pos/pos/pos.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { PosComponent } from './pos.component' 4 | 5 | describe('PosComponent', () => { 6 | let component: PosComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [PosComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(PosComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage11/src/app/pos/pos/pos.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-pos', 5 | templateUrl: './pos.component.html', 6 | styleUrls: ['./pos.component.scss'], 7 | standalone: true, 8 | }) 9 | export class PosComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage11/src/app/user-controls/field-error/field-error.directive.spec.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core' 2 | import { autoSpyObj } from 'angular-unit-test-helper' 3 | 4 | import { FieldErrorDirective } from './field-error.directive' 5 | 6 | describe('FormErrorDirective', () => { 7 | it('should create an instance', () => { 8 | const directive = new FieldErrorDirective(autoSpyObj(ElementRef)) 9 | expect(directive).toBeTruthy() 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /projects/stage11/src/app/user-controls/lemon-rater/lemon-rater.component.scss: -------------------------------------------------------------------------------- 1 | .lemons { 2 | cursor: pointer; 3 | } 4 | 5 | .lemons:hover .lemon #fill-area { 6 | fill: #ffe200 !important; 7 | } 8 | 9 | .lemons.disabled:hover { 10 | cursor: not-allowed; 11 | } 12 | 13 | .lemons.disabled:hover .lemon #fill-area { 14 | fill: #d8d8d8 !important; 15 | } 16 | 17 | .lemons .lemon { 18 | float: left; 19 | margin: 0px 5px; 20 | } 21 | 22 | .lemons .lemon #fill-area { 23 | fill: #d8d8d8; 24 | } 25 | 26 | .lemons .lemon:hover ~ .lemon #fill-area { 27 | fill: #d8d8d8 !important; 28 | } 29 | 30 | .lemons .lemon.selected #fill-area { 31 | fill: #ffe200 !important; 32 | } 33 | -------------------------------------------------------------------------------- /projects/stage11/src/app/user/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | import { Router } from '@angular/router' 3 | 4 | import { AuthService } from '../../auth/auth.service' 5 | 6 | @Component({ 7 | selector: 'app-logout', 8 | template: `

Logging out...

`, 9 | standalone: true, 10 | }) 11 | export class LogoutComponent implements OnInit { 12 | constructor( 13 | private router: Router, 14 | private authService: AuthService 15 | ) {} 16 | 17 | ngOnInit() { 18 | this.authService.logout(true) 19 | this.router.navigate(['/']) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /projects/stage11/src/app/user/profile/profile.component.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | color: red; 3 | } 4 | 5 | .mat-mdc-form-field { 6 | padding-top: 16px; 7 | } 8 | 9 | .mat-mdc-list-item { 10 | height: 72px; 11 | } 12 | -------------------------------------------------------------------------------- /projects/stage11/src/app/user/user-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { authGuard } from '../auth/auth.guard' 5 | import { LogoutComponent } from './logout/logout.component' 6 | import { ProfileComponent } from './profile/profile.component' 7 | 8 | const routes: Routes = [ 9 | { path: 'profile', component: ProfileComponent, canActivate: [authGuard] }, 10 | { path: 'logout', component: LogoutComponent }, 11 | ] 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class UserRoutingModule {} 18 | -------------------------------------------------------------------------------- /projects/stage11/src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/apple-touch-icon.png -------------------------------------------------------------------------------- /projects/stage11/src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffc40d 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /projects/stage11/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | baseUrl: 'http://localhost:3000', 6 | authMode: AuthMode.CustomServer, 7 | firebase: { 8 | apiKey: 'AIzaSyA_39OnkusNS7WeMqTuhRosonMV20WntcA', 9 | authDomain: 'lemon-mart-007.firebaseapp.com', 10 | databaseURL: 'https://lemon-mart-007.firebaseio.com', 11 | projectId: 'lemon-mart-007', 12 | storageBucket: '', 13 | messagingSenderId: '416892066612', 14 | appId: '1:416892066612:web:ec2f404c18fd4bd8', 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage11/src/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/favicon-16x16.png -------------------------------------------------------------------------------- /projects/stage11/src/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/favicon-32x32.png -------------------------------------------------------------------------------- /projects/stage11/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/favicon.ico -------------------------------------------------------------------------------- /projects/stage11/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core' 2 | import { bootstrapApplication } from '@angular/platform-browser' 3 | 4 | import { AppComponent } from './app/app.component' 5 | import { appConfig } from './app/app.config' 6 | import { environment } from './environments/environment' 7 | 8 | if (environment.production) { 9 | enableProdMode() 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.log(err)) 13 | -------------------------------------------------------------------------------- /projects/stage11/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png?v=rMlKOnvxlK", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png?v=rMlKOnvxlK", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /projects/stage11/src/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/mstile-144x144.png -------------------------------------------------------------------------------- /projects/stage11/src/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/mstile-150x150.png -------------------------------------------------------------------------------- /projects/stage11/src/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/mstile-310x150.png -------------------------------------------------------------------------------- /projects/stage11/src/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/mstile-310x310.png -------------------------------------------------------------------------------- /projects/stage11/src/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage11/src/mstile-70x70.png -------------------------------------------------------------------------------- /projects/stage11/src/styles.scss: -------------------------------------------------------------------------------- 1 | @use 'lemonmart-theme'; 2 | /* You can add global styles to this file, and also import other style files */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | } 8 | body { 9 | margin: 0; 10 | font-family: Roboto, 'Helvetica Neue', sans-serif; 11 | } 12 | 13 | .top-pad { 14 | margin-top: 16px; 15 | } 16 | 17 | .h-pad { 18 | margin: 0 16px; 19 | } 20 | 21 | .flex-spacer { 22 | flex: 1 1 auto; 23 | } 24 | -------------------------------------------------------------------------------- /projects/stage11/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /projects/stage11/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/spec", 5 | "types": ["jasmine"] 6 | }, 7 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage12/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc.json", 3 | "ignorePatterns": ["!**/*", "coverage"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts"], 7 | "rules": { 8 | "@angular-eslint/directive-selector": [ 9 | "error", 10 | { 11 | "type": "attribute", 12 | "prefix": "app", 13 | "style": "camelCase" 14 | } 15 | ], 16 | "@angular-eslint/component-selector": [ 17 | "error", 18 | { 19 | "type": "element", 20 | "prefix": "app", 21 | "style": "kebab-case" 22 | } 23 | ] 24 | } 25 | }, 26 | { 27 | "files": ["*.html"], 28 | "rules": {} 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /projects/stage12/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4200', 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: 'angular', 11 | bundler: 'webpack', 12 | }, 13 | specPattern: '**/*.cy.ts', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /projects/stage12/cypress/e2e/spec.cy.ts: -------------------------------------------------------------------------------- 1 | describe('My First Test', () => { 2 | it('Visits the initial project page', () => { 3 | cy.visit('/') 4 | cy.contains('app is running!') 5 | }) 6 | }) 7 | -------------------------------------------------------------------------------- /projects/stage12/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /projects/stage12/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/stage12/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /projects/stage12/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "sourceMap": false, 6 | "types": ["cypress"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage12/src/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/android-chrome-192x192.png -------------------------------------------------------------------------------- /projects/stage12/src/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/android-chrome-512x512.png -------------------------------------------------------------------------------- /projects/stage12/src/app/auth/auth.enum.ts: -------------------------------------------------------------------------------- 1 | export enum Role { 2 | None = 'none', 3 | Clerk = 'clerk', 4 | Cashier = 'cashier', 5 | Manager = 'manager', 6 | } 7 | 8 | export enum AuthMode { 9 | InMemory = 'In Memory', 10 | CustomServer = 'Custom Server', 11 | Firebase = 'Firebase', 12 | } 13 | -------------------------------------------------------------------------------- /projects/stage12/src/app/auth/auth.factory.ts: -------------------------------------------------------------------------------- 1 | import { environment } from '../../environments/environment' 2 | import { CustomAuthService } from './auth.custom.service' 3 | import { AuthMode } from './auth.enum' 4 | import { FirebaseAuthService } from './auth.firebase.service' 5 | import { InMemoryAuthService } from './auth.in-memory.service' 6 | 7 | export function authFactory() { 8 | switch (environment.authMode) { 9 | case AuthMode.InMemory: 10 | return new InMemoryAuthService() 11 | case AuthMode.Firebase: 12 | return new FirebaseAuthService() 13 | case AuthMode.CustomServer: 14 | return new CustomAuthService() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage12/src/app/auth/auth.graphql.queries.ts: -------------------------------------------------------------------------------- 1 | import { gql } from 'apollo-angular' 2 | 3 | export const GET_ME = gql` 4 | query Me { 5 | me { 6 | address { 7 | line1 8 | line2 9 | city 10 | state 11 | zip 12 | } 13 | dateOfBirth 14 | email 15 | id 16 | level 17 | name { 18 | first 19 | middle 20 | last 21 | } 22 | phones { 23 | digits 24 | type 25 | } 26 | picture 27 | role 28 | userStatus 29 | } 30 | } 31 | ` 32 | 33 | export const LOGIN = gql` 34 | mutation Login($email: String!, $password: String!) { 35 | login(email: $email, password: $password) { 36 | accessToken 37 | } 38 | } 39 | ` 40 | -------------------------------------------------------------------------------- /projects/stage12/src/app/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { TestBed } from '@angular/core/testing' 3 | import { autoSpyObj } from 'angular-unit-test-helper' 4 | 5 | import { UiService } from '../common/ui.service' 6 | import { AuthService } from './auth.service' 7 | 8 | describe('AuthService', () => { 9 | let service: AuthService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [HttpClientTestingModule], 14 | providers: [AuthService, { provide: UiService, useValue: autoSpyObj(UiService) }], 15 | }) 16 | service = TestBed.inject(AuthService) 17 | }) 18 | 19 | it('should be created', () => { 20 | expect(service).toBeTruthy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /projects/stage12/src/app/common/base-form.class.spec.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core' 2 | import { FormGroup } from '@angular/forms' 3 | 4 | import { BaseFormDirective } from './base-form.class' 5 | 6 | interface ITestData { 7 | name: string 8 | } 9 | 10 | @Directive() 11 | class TestFormDirective extends BaseFormDirective { 12 | buildForm(): FormGroup { 13 | return jasmine.createSpyObj('form', []) 14 | } 15 | } 16 | 17 | describe('BaseFormDirective', () => { 18 | it('should create an instance', () => { 19 | expect(new TestFormDirective()).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /projects/stage12/src/app/common/common.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http' 2 | import { throwError } from 'rxjs' 3 | 4 | export function transformError(error: HttpErrorResponse | string) { 5 | let errorMessage = 'An unknown error has occurred' 6 | if (typeof error === 'string') { 7 | errorMessage = error 8 | } else if (error.error instanceof ErrorEvent) { 9 | errorMessage = `Error! ${error.error.message}` 10 | } else if (error.status) { 11 | errorMessage = `Request failed with ${error.status} ${error.statusText}` 12 | } else if (error instanceof Error) { 13 | errorMessage = error.message 14 | } 15 | return throwError(() => errorMessage) 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage12/src/app/common/loading.http.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { HttpHandlerFn, HttpRequest } from '@angular/common/http' 2 | import { inject } from '@angular/core' 3 | import { finalize } from 'rxjs' 4 | 5 | import { UiService } from './ui.service' 6 | 7 | export function LoadingHttpInterceptor(req: HttpRequest, next: HttpHandlerFn) { 8 | const uiService = inject(UiService) 9 | uiService.showLoader() 10 | return next(req).pipe(finalize(() => uiService.hideLoader())) 11 | } 12 | -------------------------------------------------------------------------------- /projects/stage12/src/app/common/ui.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { MatDialogModule } from '@angular/material/dialog' 3 | import { MatSnackBarModule } from '@angular/material/snack-bar' 4 | 5 | import { commonTestingModules } from './common.testing' 6 | import { UiService } from './ui.service' 7 | 8 | describe('UiService', () => { 9 | let service: UiService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [...commonTestingModules, MatSnackBarModule, MatDialogModule], 14 | }) 15 | service = TestBed.inject(UiService) 16 | }) 17 | 18 | it('should be created', () => { 19 | expect(service).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /projects/stage12/src/app/entity-metadata.ts: -------------------------------------------------------------------------------- 1 | import { EntityMetadataMap } from '@ngrx/data' 2 | 3 | const entityMetadata: EntityMetadataMap = { 4 | User: {}, 5 | } 6 | 7 | export const entityConfig = { 8 | entityMetadata, 9 | } 10 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/categories/categories.component.html: -------------------------------------------------------------------------------- 1 |

2 | Categories 5 |

6 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/categories/categories.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/inventory/categories/categories.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/categories/categories.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { CategoriesComponent } from './categories.component' 4 | 5 | describe('CategoriesComponent', () => { 6 | let component: CategoriesComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [CategoriesComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(CategoriesComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/categories/categories.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-categories', 5 | templateUrl: './categories.component.html', 6 | styleUrls: ['./categories.component.scss'], 7 | standalone: true, 8 | }) 9 | export class CategoriesComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/inventory-home/inventory-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-inventory-home', 5 | template: ` 6 |

7 | Inventory 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class InventoryHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/products/products.component.html: -------------------------------------------------------------------------------- 1 |

2 | Products 5 |

6 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/products/products.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/inventory/products/products.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/products/products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProductsComponent } from './products.component' 4 | 5 | describe('ProductsComponent', () => { 6 | let component: ProductsComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProductsComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProductsComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/products/products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-products', 5 | templateUrl: './products.component.html', 6 | styleUrls: ['./products.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProductsComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/stock-entry/stock-entry.component.html: -------------------------------------------------------------------------------- 1 |

2 | Stock Entry 5 |

6 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/stock-entry/stock-entry.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/inventory/stock-entry/stock-entry.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/stock-entry/stock-entry.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { StockEntryComponent } from './stock-entry.component' 4 | 5 | describe('StockEntryComponent', () => { 6 | let component: StockEntryComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [StockEntryComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(StockEntryComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage12/src/app/inventory/stock-entry/stock-entry.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-stock-entry', 5 | templateUrl: './stock-entry.component.html', 6 | styleUrls: ['./stock-entry.component.scss'], 7 | standalone: true, 8 | }) 9 | export class StockEntryComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage12/src/app/login/login.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/login/login.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/manager/manager-home/manager-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ManagerHomeComponent } from './manager-home.component' 4 | 5 | describe('ManagerHomeComponent', () => { 6 | let component: ManagerHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ManagerHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ManagerHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage12/src/app/manager/manager-home/manager-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-manager-home', 5 | template: ` 6 |

7 | Manager 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class ManagerHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage12/src/app/manager/receipt-lookup/receipt-lookup.component.html: -------------------------------------------------------------------------------- 1 |

2 | Receipt Lookup 5 |

6 | -------------------------------------------------------------------------------- /projects/stage12/src/app/manager/receipt-lookup/receipt-lookup.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/manager/receipt-lookup/receipt-lookup.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/manager/receipt-lookup/receipt-lookup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-receipt-lookup', 5 | templateUrl: './receipt-lookup.component.html', 6 | styleUrls: ['./receipt-lookup.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ReceiptLookupComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage12/src/app/manager/user-management/user-management.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterOutlet } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-user-management', 6 | template: ` 7 |
8 | 9 |
10 | 11 |
12 | `, 13 | standalone: true, 14 | imports: [RouterOutlet], 15 | }) 16 | export class UserManagementComponent {} 17 | -------------------------------------------------------------------------------- /projects/stage12/src/app/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-page-not-found', 6 | template: ` 7 |

8 | This page doesn't exist. Go back to 9 | home 10 | . 11 |

12 | `, 13 | standalone: true, 14 | imports: [RouterLink], 15 | }) 16 | export class PageNotFoundComponent {} 17 | -------------------------------------------------------------------------------- /projects/stage12/src/app/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | 6 | const routes: Routes = [{ path: '', component: PosComponent }] 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class PosRoutingModule {} 13 | -------------------------------------------------------------------------------- /projects/stage12/src/app/pos/pos.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | import { PosRoutingModule } from './pos-routing.module' 6 | 7 | @NgModule({ 8 | imports: [CommonModule, PosRoutingModule, PosComponent], 9 | }) 10 | export class PosModule {} 11 | -------------------------------------------------------------------------------- /projects/stage12/src/app/pos/pos/pos.component.html: -------------------------------------------------------------------------------- 1 |

2 | POS 5 |

6 | -------------------------------------------------------------------------------- /projects/stage12/src/app/pos/pos/pos.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/pos/pos/pos.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/pos/pos/pos.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { PosComponent } from './pos.component' 4 | 5 | describe('PosComponent', () => { 6 | let component: PosComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [PosComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(PosComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage12/src/app/pos/pos/pos.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-pos', 5 | templateUrl: './pos.component.html', 6 | styleUrls: ['./pos.component.scss'], 7 | standalone: true, 8 | }) 9 | export class PosComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage12/src/app/user-controls/field-error/field-error.directive.spec.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core' 2 | import { autoSpyObj } from 'angular-unit-test-helper' 3 | 4 | import { FieldErrorDirective } from './field-error.directive' 5 | 6 | describe('FormErrorDirective', () => { 7 | it('should create an instance', () => { 8 | const directive = new FieldErrorDirective(autoSpyObj(ElementRef)) 9 | expect(directive).toBeTruthy() 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /projects/stage12/src/app/user-controls/lemon-rater/lemon-rater.component.scss: -------------------------------------------------------------------------------- 1 | .lemons { 2 | cursor: pointer; 3 | } 4 | 5 | .lemons:hover .lemon #fill-area { 6 | fill: #ffe200 !important; 7 | } 8 | 9 | .lemons.disabled:hover { 10 | cursor: not-allowed; 11 | } 12 | 13 | .lemons.disabled:hover .lemon #fill-area { 14 | fill: #d8d8d8 !important; 15 | } 16 | 17 | .lemons .lemon { 18 | float: left; 19 | margin: 0px 5px; 20 | } 21 | 22 | .lemons .lemon #fill-area { 23 | fill: #d8d8d8; 24 | } 25 | 26 | .lemons .lemon:hover ~ .lemon #fill-area { 27 | fill: #d8d8d8 !important; 28 | } 29 | 30 | .lemons .lemon.selected #fill-area { 31 | fill: #ffe200 !important; 32 | } 33 | -------------------------------------------------------------------------------- /projects/stage12/src/app/user/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | import { Router } from '@angular/router' 3 | 4 | import { AuthService } from '../../auth/auth.service' 5 | 6 | @Component({ 7 | selector: 'app-logout', 8 | template: `

Logging out...

`, 9 | standalone: true, 10 | }) 11 | export class LogoutComponent implements OnInit { 12 | constructor( 13 | private router: Router, 14 | private authService: AuthService 15 | ) {} 16 | 17 | ngOnInit() { 18 | this.authService.logout(true) 19 | this.router.navigate(['/']) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /projects/stage12/src/app/user/profile/profile.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/app/user/profile/profile.component.scss -------------------------------------------------------------------------------- /projects/stage12/src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | import { ReactiveFormsModule } from '@angular/forms' 4 | import { FlexLayoutModule } from '@ngbracket/ngx-layout' 5 | import { NgxMaskDirective, provideNgxMask } from 'ngx-mask' 6 | 7 | import { LogoutComponent } from './logout/logout.component' 8 | import { ProfileComponent } from './profile/profile.component' 9 | import { UserRoutingModule } from './user-routing.module' 10 | 11 | @NgModule({ 12 | imports: [ 13 | CommonModule, 14 | UserRoutingModule, 15 | ReactiveFormsModule, 16 | FlexLayoutModule, 17 | NgxMaskDirective, 18 | ProfileComponent, 19 | LogoutComponent, 20 | ], 21 | providers: [provideNgxMask()], 22 | }) 23 | export class UserModule {} 24 | -------------------------------------------------------------------------------- /projects/stage12/src/app/user/user/user.resolve.ts: -------------------------------------------------------------------------------- 1 | import { inject } from '@angular/core' 2 | import { ActivatedRouteSnapshot, ResolveFn } from '@angular/router' 3 | import { catchError, map } from 'rxjs/operators' 4 | 5 | import { transformError } from '../../common/common' 6 | import { User } from './user' 7 | import { UserService } from './user.service' 8 | 9 | export const userResolver: ResolveFn = (route: ActivatedRouteSnapshot) => { 10 | return inject(UserService) 11 | .getUser(route.paramMap.get('userId')) 12 | .pipe(map(User.Build), catchError(transformError)) 13 | } 14 | -------------------------------------------------------------------------------- /projects/stage12/src/app/user/user/user.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { inject, TestBed } from '@angular/core/testing' 2 | 3 | import { commonTestingModules, commonTestingProviders } from '../../common/common.testing' 4 | import { UserService } from './user.service' 5 | 6 | describe('UserService', () => { 7 | beforeEach(() => { 8 | TestBed.configureTestingModule({ 9 | imports: [commonTestingModules], 10 | providers: [UserService, commonTestingProviders], 11 | }) 12 | }) 13 | 14 | it('should be created', inject([UserService], (service: UserService) => { 15 | expect(service).toBeTruthy() 16 | })) 17 | }) 18 | -------------------------------------------------------------------------------- /projects/stage12/src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/apple-touch-icon.png -------------------------------------------------------------------------------- /projects/stage12/src/assets/img/lemon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/assets/img/lemon.png -------------------------------------------------------------------------------- /projects/stage12/src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffc40d 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /projects/stage12/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | baseUrl: 'http://localhost:3000', 6 | authMode: AuthMode.CustomServer, 7 | firebase: { 8 | apiKey: 'AIzaSyA_39OnkusNS7WeMqTuhRosonMV20WntcA', 9 | authDomain: 'lemon-mart-007.firebaseapp.com', 10 | databaseURL: 'https://lemon-mart-007.firebaseio.com', 11 | projectId: 'lemon-mart-007', 12 | storageBucket: '', 13 | messagingSenderId: '416892066612', 14 | appId: '1:416892066612:web:ec2f404c18fd4bd8', 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage12/src/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/favicon-16x16.png -------------------------------------------------------------------------------- /projects/stage12/src/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/favicon-32x32.png -------------------------------------------------------------------------------- /projects/stage12/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/favicon.ico -------------------------------------------------------------------------------- /projects/stage12/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core' 2 | import { bootstrapApplication } from '@angular/platform-browser' 3 | 4 | import { AppComponent } from './app/app.component' 5 | import { appConfig } from './app/app.config' 6 | import { environment } from './environments/environment' 7 | 8 | if (environment.production) { 9 | enableProdMode() 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.log(err)) 13 | -------------------------------------------------------------------------------- /projects/stage12/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png?v=rMlKOnvxlK", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png?v=rMlKOnvxlK", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /projects/stage12/src/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/mstile-144x144.png -------------------------------------------------------------------------------- /projects/stage12/src/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/mstile-150x150.png -------------------------------------------------------------------------------- /projects/stage12/src/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/mstile-310x150.png -------------------------------------------------------------------------------- /projects/stage12/src/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/mstile-310x310.png -------------------------------------------------------------------------------- /projects/stage12/src/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage12/src/mstile-70x70.png -------------------------------------------------------------------------------- /projects/stage12/src/styles.scss: -------------------------------------------------------------------------------- 1 | @use 'lemonmart-theme'; 2 | /* You can add global styles to this file, and also import other style files */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | } 8 | body { 9 | margin: 0; 10 | font-family: Roboto, 'Helvetica Neue', sans-serif; 11 | } 12 | 13 | .top-pad { 14 | margin-top: 16px; 15 | } 16 | 17 | .h-pad { 18 | margin: 0 16px; 19 | } 20 | 21 | .flex-spacer { 22 | flex: 1 1 auto; 23 | } 24 | -------------------------------------------------------------------------------- /projects/stage12/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /projects/stage12/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/spec", 5 | "types": ["jasmine"] 6 | }, 7 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage7/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc.json", 3 | "ignorePatterns": ["!**/*", "coverage"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts"], 7 | "rules": { 8 | "@angular-eslint/directive-selector": [ 9 | "error", 10 | { 11 | "type": "attribute", 12 | "prefix": "app", 13 | "style": "camelCase" 14 | } 15 | ], 16 | "@angular-eslint/component-selector": [ 17 | "error", 18 | { 19 | "type": "element", 20 | "prefix": "app", 21 | "style": "kebab-case" 22 | } 23 | ] 24 | } 25 | }, 26 | { 27 | "files": ["*.html"], 28 | "rules": {} 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /projects/stage7/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4200', 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: 'angular', 11 | bundler: 'webpack', 12 | }, 13 | specPattern: '**/*.cy.ts', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /projects/stage7/cypress/e2e/spec.cy.ts: -------------------------------------------------------------------------------- 1 | describe('My First Test', () => { 2 | it('Visits the initial project page', () => { 3 | cy.visit('/') 4 | cy.contains('app is running!') 5 | }) 6 | }) 7 | -------------------------------------------------------------------------------- /projects/stage7/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /projects/stage7/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/stage7/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /projects/stage7/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "sourceMap": false, 6 | "types": ["cypress"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage7/src/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/android-chrome-192x192.png -------------------------------------------------------------------------------- /projects/stage7/src/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/android-chrome-512x512.png -------------------------------------------------------------------------------- /projects/stage7/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { provideHttpClient } from '@angular/common/http' 2 | import { ApplicationConfig } from '@angular/core' 3 | import { provideAnimationsAsync } from '@angular/platform-browser/animations/async' 4 | import { provideRouter } from '@angular/router' 5 | 6 | import { routes } from './app.routes' 7 | 8 | export const appConfig: ApplicationConfig = { 9 | providers: [provideAnimationsAsync(), provideHttpClient(), provideRouter(routes)], 10 | } 11 | -------------------------------------------------------------------------------- /projects/stage7/src/app/common/common.testing.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { ReactiveFormsModule } from '@angular/forms' 3 | import { MatIconTestingModule } from '@angular/material/icon/testing' 4 | import { NoopAnimationsModule } from '@angular/platform-browser/animations' 5 | import { RouterTestingModule } from '@angular/router/testing' 6 | 7 | export const commonTestingProviders = [ 8 | // Intentionally Left Blank!!! 9 | ] 10 | 11 | export const commonTestingModules = [ 12 | ReactiveFormsModule, 13 | NoopAnimationsModule, 14 | HttpClientTestingModule, 15 | RouterTestingModule, 16 | MatIconTestingModule, 17 | ] as unknown[] 18 | -------------------------------------------------------------------------------- /projects/stage7/src/app/home/home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | import { RouterTestingModule } from '@angular/router/testing' 3 | 4 | import { HomeComponent } from './home.component' 5 | 6 | describe('HomeComponent', () => { 7 | let component: HomeComponent 8 | let fixture: ComponentFixture 9 | 10 | beforeEach(waitForAsync(() => { 11 | TestBed.configureTestingModule({ 12 | imports: [HomeComponent, RouterTestingModule], 13 | }).compileComponents() 14 | })) 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(HomeComponent) 18 | component = fixture.componentInstance 19 | fixture.detectChanges() 20 | }) 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy() 24 | }) 25 | }) 26 | -------------------------------------------------------------------------------- /projects/stage7/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { MatButtonModule } from '@angular/material/button' 3 | import { RouterLink } from '@angular/router' 4 | import { FlexModule } from '@ngbracket/ngx-layout/flex' 5 | 6 | @Component({ 7 | selector: 'app-home', 8 | styles: ` 9 | div[fxLayout] { 10 | margin-top: 32px; 11 | } 12 | `, 13 | template: ` 14 |
15 | Hello, Limoncu! 16 | 19 |
20 | `, 21 | standalone: true, 22 | imports: [FlexModule, MatButtonModule, RouterLink], 23 | }) 24 | export class HomeComponent {} 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/categories/categories.component.html: -------------------------------------------------------------------------------- 1 |

2 | Categories 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/categories/categories.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/inventory/categories/categories.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/categories/categories.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { CategoriesComponent } from './categories.component' 4 | 5 | describe('CategoriesComponent', () => { 6 | let component: CategoriesComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [CategoriesComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(CategoriesComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/categories/categories.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-categories', 5 | templateUrl: './categories.component.html', 6 | styleUrls: ['./categories.component.scss'], 7 | standalone: true, 8 | }) 9 | export class CategoriesComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/inventory-home/inventory-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-inventory-home', 5 | template: ` 6 |

7 | Inventory 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class InventoryHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/products/products.component.html: -------------------------------------------------------------------------------- 1 |

2 | Products 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/products/products.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/inventory/products/products.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/products/products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProductsComponent } from './products.component' 4 | 5 | describe('ProductsComponent', () => { 6 | let component: ProductsComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProductsComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProductsComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/products/products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-products', 5 | templateUrl: './products.component.html', 6 | styleUrls: ['./products.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProductsComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/stock-entry/stock-entry.component.html: -------------------------------------------------------------------------------- 1 |

2 | Stock Entry 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/stock-entry/stock-entry.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/inventory/stock-entry/stock-entry.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/stock-entry/stock-entry.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { StockEntryComponent } from './stock-entry.component' 4 | 5 | describe('StockEntryComponent', () => { 6 | let component: StockEntryComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [StockEntryComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(StockEntryComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/inventory/stock-entry/stock-entry.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-stock-entry', 5 | templateUrl: './stock-entry.component.html', 6 | styleUrls: ['./stock-entry.component.scss'], 7 | standalone: true, 8 | }) 9 | export class StockEntryComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/manager-home/manager-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ManagerHomeComponent } from './manager-home.component' 4 | 5 | describe('ManagerHomeComponent', () => { 6 | let component: ManagerHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ManagerHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ManagerHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/manager-home/manager-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-manager-home', 5 | template: ` 6 |

7 | Manager 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class ManagerHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/receipt-lookup/receipt-lookup.component.html: -------------------------------------------------------------------------------- 1 |

2 | Receipt Lookup 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/receipt-lookup/receipt-lookup.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/manager/receipt-lookup/receipt-lookup.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/receipt-lookup/receipt-lookup.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ReceiptLookupComponent } from './receipt-lookup.component' 4 | 5 | describe('ReceiptLookupComponent', () => { 6 | let component: ReceiptLookupComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ReceiptLookupComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ReceiptLookupComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/receipt-lookup/receipt-lookup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-receipt-lookup', 5 | templateUrl: './receipt-lookup.component.html', 6 | styleUrls: ['./receipt-lookup.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ReceiptLookupComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/user-management/user-management.component.html: -------------------------------------------------------------------------------- 1 |

2 | User Management 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/user-management/user-management.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/manager/user-management/user-management.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/manager/user-management/user-management.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-user-management', 5 | templateUrl: './user-management.component.html', 6 | styleUrls: ['./user-management.component.scss'], 7 | standalone: true, 8 | }) 9 | export class UserManagementComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-page-not-found', 6 | template: ` 7 |

This page doesn't exist. Go back to home.

8 | `, 9 | styles: ``, 10 | standalone: true, 11 | imports: [RouterLink], 12 | }) 13 | export class PageNotFoundComponent {} 14 | -------------------------------------------------------------------------------- /projects/stage7/src/app/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | 6 | const routes: Routes = [{ path: '', component: PosComponent }] 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class PosRoutingModule {} 13 | -------------------------------------------------------------------------------- /projects/stage7/src/app/pos/pos.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | import { PosRoutingModule } from './pos-routing.module' 6 | 7 | @NgModule({ 8 | imports: [CommonModule, PosRoutingModule, PosComponent], 9 | }) 10 | export class PosModule {} 11 | -------------------------------------------------------------------------------- /projects/stage7/src/app/pos/pos/pos.component.html: -------------------------------------------------------------------------------- 1 |

2 | POS 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/pos/pos/pos.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/pos/pos/pos.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/pos/pos/pos.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { PosComponent } from './pos.component' 4 | 5 | describe('PosComponent', () => { 6 | let component: PosComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [PosComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(PosComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/pos/pos/pos.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-pos', 5 | templateUrl: './pos.component.html', 6 | styleUrls: ['./pos.component.scss'], 7 | standalone: true, 8 | }) 9 | export class PosComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/logout/logout.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { LogoutComponent } from './logout.component' 4 | 5 | describe('LogoutComponent', () => { 6 | let component: LogoutComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [LogoutComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(LogoutComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-logout', 5 | template: `

logout works!

`, 6 | styles: ``, 7 | standalone: true, 8 | }) 9 | export class LogoutComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/navigation-menu/navigation-menu.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-navigation-menu', 5 | template: `

navigation-menu works!

`, 6 | styles: ``, 7 | standalone: true, 8 | }) 9 | export class NavigationMenuComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/profile/profile.component.html: -------------------------------------------------------------------------------- 1 |

2 | Profile 5 |

6 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/profile/profile.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/app/user/profile/profile.component.scss -------------------------------------------------------------------------------- /projects/stage7/src/app/user/profile/profile.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProfileComponent } from './profile.component' 4 | 5 | describe('ProfileComponent', () => { 6 | let component: ProfileComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProfileComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProfileComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/profile/profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-profile', 5 | templateUrl: './profile.component.html', 6 | styleUrls: ['./profile.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProfileComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/user-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { LogoutComponent } from './logout/logout.component' 5 | import { ProfileComponent } from './profile/profile.component' 6 | 7 | const routes: Routes = [ 8 | { path: 'profile', component: ProfileComponent }, 9 | { path: 'logout', component: LogoutComponent }, 10 | ] 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule], 15 | }) 16 | export class UserRoutingModule {} 17 | -------------------------------------------------------------------------------- /projects/stage7/src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { LogoutComponent } from './logout/logout.component' 5 | import { NavigationMenuComponent } from './navigation-menu/navigation-menu.component' 6 | import { ProfileComponent } from './profile/profile.component' 7 | import { UserRoutingModule } from './user-routing.module' 8 | 9 | @NgModule({ 10 | imports: [ 11 | CommonModule, 12 | UserRoutingModule, 13 | ProfileComponent, 14 | LogoutComponent, 15 | NavigationMenuComponent, 16 | ], 17 | }) 18 | export class UserModule {} 19 | -------------------------------------------------------------------------------- /projects/stage7/src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/apple-touch-icon.png -------------------------------------------------------------------------------- /projects/stage7/src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffc40d 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /projects/stage7/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | } 4 | -------------------------------------------------------------------------------- /projects/stage7/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false, 7 | } 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/plugins/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /projects/stage7/src/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/favicon-16x16.png -------------------------------------------------------------------------------- /projects/stage7/src/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/favicon-32x32.png -------------------------------------------------------------------------------- /projects/stage7/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/favicon.ico -------------------------------------------------------------------------------- /projects/stage7/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core' 2 | import { bootstrapApplication } from '@angular/platform-browser' 3 | 4 | import { AppComponent } from './app/app.component' 5 | import { appConfig } from './app/app.config' 6 | import { environment } from './environments/environment' 7 | 8 | if (environment.production) { 9 | enableProdMode() 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)) 13 | -------------------------------------------------------------------------------- /projects/stage7/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png?v=rMlKOnvxlK", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png?v=rMlKOnvxlK", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /projects/stage7/src/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/mstile-144x144.png -------------------------------------------------------------------------------- /projects/stage7/src/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/mstile-150x150.png -------------------------------------------------------------------------------- /projects/stage7/src/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/mstile-310x150.png -------------------------------------------------------------------------------- /projects/stage7/src/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/mstile-310x310.png -------------------------------------------------------------------------------- /projects/stage7/src/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage7/src/mstile-70x70.png -------------------------------------------------------------------------------- /projects/stage7/src/styles.scss: -------------------------------------------------------------------------------- 1 | @use 'lemonmart-theme'; 2 | /* You can add global styles to this file, and also import other style files */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | } 8 | body { 9 | margin: 0; 10 | font-family: Roboto, 'Helvetica Neue', sans-serif; 11 | } 12 | 13 | .top-pad { 14 | margin-top: 16px; 15 | } 16 | 17 | .h-pad { 18 | margin: 0 16px; 19 | } 20 | 21 | .flex-spacer { 22 | flex: 1 1 auto; 23 | } 24 | -------------------------------------------------------------------------------- /projects/stage7/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "angularCompilerOptions": { 10 | "enableIvy": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /projects/stage7/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/spec", 5 | "types": ["jasmine"] 6 | }, 7 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage8/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc.json", 3 | "ignorePatterns": ["!**/*", "coverage"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts"], 7 | "rules": { 8 | "@angular-eslint/directive-selector": [ 9 | "error", 10 | { 11 | "type": "attribute", 12 | "prefix": "app", 13 | "style": "camelCase" 14 | } 15 | ], 16 | "@angular-eslint/component-selector": [ 17 | "error", 18 | { 19 | "type": "element", 20 | "prefix": "app", 21 | "style": "kebab-case" 22 | } 23 | ] 24 | } 25 | }, 26 | { 27 | "files": ["*.html"], 28 | "rules": {} 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /projects/stage8/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress' 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: 'http://localhost:4200', 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: 'angular', 11 | bundler: 'webpack', 12 | }, 13 | specPattern: '**/*.cy.ts', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /projects/stage8/cypress/e2e/spec.cy.ts: -------------------------------------------------------------------------------- 1 | describe('My First Test', () => { 2 | it('Visits the initial project page', () => { 3 | cy.visit('/') 4 | cy.contains('app is running!') 5 | }) 6 | }) 7 | -------------------------------------------------------------------------------- /projects/stage8/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /projects/stage8/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/stage8/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | // import './commands'; 18 | -------------------------------------------------------------------------------- /projects/stage8/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "sourceMap": false, 6 | "types": ["cypress"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /projects/stage8/src/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/android-chrome-192x192.png -------------------------------------------------------------------------------- /projects/stage8/src/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/android-chrome-512x512.png -------------------------------------------------------------------------------- /projects/stage8/src/app/auth/auth.enum.ts: -------------------------------------------------------------------------------- 1 | export enum Role { 2 | None = 'none', 3 | Clerk = 'clerk', 4 | Cashier = 'cashier', 5 | Manager = 'manager', 6 | } 7 | 8 | export enum AuthMode { 9 | InMemory = 'In Memory', 10 | CustomServer = 'Custom Server', 11 | Firebase = 'Firebase', 12 | } 13 | -------------------------------------------------------------------------------- /projects/stage8/src/app/auth/auth.factory.ts: -------------------------------------------------------------------------------- 1 | import { environment } from '../../environments/environment' 2 | import { AuthMode } from './auth.enum' 3 | import { FirebaseAuthService } from './auth.firebase.service' 4 | import { InMemoryAuthService } from './auth.in-memory.service' 5 | 6 | export function authFactory() { 7 | switch (environment.authMode) { 8 | case AuthMode.InMemory: 9 | return new InMemoryAuthService() 10 | case AuthMode.Firebase: 11 | return new FirebaseAuthService() 12 | case AuthMode.CustomServer: 13 | throw new Error('Not yet implemented') 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /projects/stage8/src/app/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { TestBed } from '@angular/core/testing' 3 | import { autoSpyObj } from 'angular-unit-test-helper' 4 | 5 | import { UiService } from '../common/ui.service' 6 | import { AuthService } from './auth.service' 7 | 8 | describe('AuthService', () => { 9 | let service: AuthService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [HttpClientTestingModule], 14 | providers: [AuthService, { provide: UiService, useValue: autoSpyObj(UiService) }], 15 | }) 16 | service = TestBed.inject(AuthService) 17 | }) 18 | 19 | it('should be created', () => { 20 | expect(service).toBeTruthy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /projects/stage8/src/app/common/common.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http' 2 | import { throwError } from 'rxjs' 3 | 4 | export function transformError(error: HttpErrorResponse | string) { 5 | let errorMessage = 'An unknown error has occurred' 6 | if (typeof error === 'string') { 7 | errorMessage = error 8 | } else if (error.error instanceof ErrorEvent) { 9 | errorMessage = `Error! ${error.error.message}` 10 | } else if (error.status) { 11 | errorMessage = `Request failed with ${error.status} ${error.statusText}` 12 | } else if (error instanceof Error) { 13 | errorMessage = error.message 14 | } 15 | return throwError(() => errorMessage) 16 | } 17 | -------------------------------------------------------------------------------- /projects/stage8/src/app/common/ui.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { MatDialogModule } from '@angular/material/dialog' 3 | import { MatSnackBarModule } from '@angular/material/snack-bar' 4 | 5 | import { commonTestingModules } from './common.testing' 6 | import { UiService } from './ui.service' 7 | 8 | describe('UiService', () => { 9 | let service: UiService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [...commonTestingModules, MatSnackBarModule, MatDialogModule], 14 | }) 15 | service = TestBed.inject(UiService) 16 | }) 17 | 18 | it('should be created', () => { 19 | expect(service).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /projects/stage8/src/app/common/validations.ts: -------------------------------------------------------------------------------- 1 | import { Validators } from '@angular/forms' 2 | 3 | export const EmailValidation = [Validators.required, Validators.email] 4 | export const PasswordValidation = [ 5 | Validators.required, 6 | Validators.minLength(8), 7 | Validators.maxLength(50), 8 | ] 9 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/categories/categories.component.html: -------------------------------------------------------------------------------- 1 |

2 | Categories 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/categories/categories.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/inventory/categories/categories.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/categories/categories.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { CategoriesComponent } from './categories.component' 4 | 5 | describe('CategoriesComponent', () => { 6 | let component: CategoriesComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [CategoriesComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(CategoriesComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/categories/categories.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-categories', 5 | templateUrl: './categories.component.html', 6 | styleUrls: ['./categories.component.scss'], 7 | standalone: true, 8 | }) 9 | export class CategoriesComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/inventory-home/inventory-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-inventory-home', 5 | template: ` 6 |

7 | Inventory Home 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class InventoryHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/products/products.component.html: -------------------------------------------------------------------------------- 1 |

2 | Products 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/products/products.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/inventory/products/products.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/products/products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProductsComponent } from './products.component' 4 | 5 | describe('ProductsComponent', () => { 6 | let component: ProductsComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProductsComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProductsComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/products/products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-products', 5 | templateUrl: './products.component.html', 6 | styleUrls: ['./products.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProductsComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/stock-entry/stock-entry.component.html: -------------------------------------------------------------------------------- 1 |

2 | Stock Entry 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/stock-entry/stock-entry.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/inventory/stock-entry/stock-entry.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/stock-entry/stock-entry.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { StockEntryComponent } from './stock-entry.component' 4 | 5 | describe('StockEntryComponent', () => { 6 | let component: StockEntryComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [StockEntryComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(StockEntryComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/inventory/stock-entry/stock-entry.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-stock-entry', 5 | templateUrl: './stock-entry.component.html', 6 | styleUrls: ['./stock-entry.component.scss'], 7 | standalone: true, 8 | }) 9 | export class StockEntryComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/login/login.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/login/login.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/manager-home/manager-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ManagerHomeComponent } from './manager-home.component' 4 | 5 | describe('ManagerHomeComponent', () => { 6 | let component: ManagerHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ManagerHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ManagerHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/manager-home/manager-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-manager-home', 5 | template: ` 6 |

7 | Manager Home 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class ManagerHomeComponent {} 16 | -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/receipt-lookup/receipt-lookup.component.html: -------------------------------------------------------------------------------- 1 |

2 | Receipt Lookup 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/receipt-lookup/receipt-lookup.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/manager/receipt-lookup/receipt-lookup.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/receipt-lookup/receipt-lookup.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ReceiptLookupComponent } from './receipt-lookup.component' 4 | 5 | describe('ReceiptLookupComponent', () => { 6 | let component: ReceiptLookupComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ReceiptLookupComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ReceiptLookupComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/receipt-lookup/receipt-lookup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-receipt-lookup', 5 | templateUrl: './receipt-lookup.component.html', 6 | styleUrls: ['./receipt-lookup.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ReceiptLookupComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/user-management/user-management.component.html: -------------------------------------------------------------------------------- 1 |

2 | User Management 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/user-management/user-management.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/manager/user-management/user-management.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/manager/user-management/user-management.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-user-management', 5 | templateUrl: './user-management.component.html', 6 | styleUrls: ['./user-management.component.scss'], 7 | standalone: true, 8 | }) 9 | export class UserManagementComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-page-not-found', 6 | template: ` 7 |

8 | This page doesn't exist. Go back to 9 | home 10 | . 11 |

12 | `, 13 | standalone: true, 14 | imports: [RouterLink], 15 | }) 16 | export class PageNotFoundComponent {} 17 | -------------------------------------------------------------------------------- /projects/stage8/src/app/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | 6 | const routes: Routes = [{ path: '', component: PosComponent }] 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class PosRoutingModule {} 13 | -------------------------------------------------------------------------------- /projects/stage8/src/app/pos/pos.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | import { PosRoutingModule } from './pos-routing.module' 6 | 7 | @NgModule({ 8 | imports: [CommonModule, PosRoutingModule, PosComponent], 9 | }) 10 | export class PosModule {} 11 | -------------------------------------------------------------------------------- /projects/stage8/src/app/pos/pos/pos.component.html: -------------------------------------------------------------------------------- 1 |

2 | POS 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/pos/pos/pos.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/pos/pos/pos.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/pos/pos/pos.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { PosComponent } from './pos.component' 4 | 5 | describe('PosComponent', () => { 6 | let component: PosComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [PosComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(PosComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/pos/pos/pos.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-pos', 5 | templateUrl: './pos.component.html', 6 | styleUrls: ['./pos.component.scss'], 7 | standalone: true, 8 | }) 9 | export class PosComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/user/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | import { Router } from '@angular/router' 3 | 4 | import { AuthService } from '../../auth/auth.service' 5 | 6 | @Component({ 7 | selector: 'app-logout', 8 | template: `

Logging out...

`, 9 | standalone: true, 10 | }) 11 | export class LogoutComponent implements OnInit { 12 | constructor( 13 | private router: Router, 14 | private authService: AuthService 15 | ) {} 16 | 17 | ngOnInit() { 18 | this.authService.logout(true) 19 | this.router.navigate(['/']) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /projects/stage8/src/app/user/profile/profile.component.html: -------------------------------------------------------------------------------- 1 |

2 | Profile 5 |

6 | -------------------------------------------------------------------------------- /projects/stage8/src/app/user/profile/profile.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/app/user/profile/profile.component.scss -------------------------------------------------------------------------------- /projects/stage8/src/app/user/profile/profile.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProfileComponent } from './profile.component' 4 | 5 | describe('ProfileComponent', () => { 6 | let component: ProfileComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProfileComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProfileComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /projects/stage8/src/app/user/profile/profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-profile', 5 | templateUrl: './profile.component.html', 6 | styleUrls: ['./profile.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProfileComponent {} 10 | -------------------------------------------------------------------------------- /projects/stage8/src/app/user/user-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { authGuard } from '../auth/auth.guard' 5 | import { LogoutComponent } from './logout/logout.component' 6 | import { ProfileComponent } from './profile/profile.component' 7 | 8 | const routes: Routes = [ 9 | { path: 'profile', component: ProfileComponent, canActivate: [authGuard] }, 10 | { path: 'logout', component: LogoutComponent }, 11 | ] 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule], 16 | }) 17 | export class UserRoutingModule {} 18 | -------------------------------------------------------------------------------- /projects/stage8/src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { LogoutComponent } from './logout/logout.component' 5 | import { ProfileComponent } from './profile/profile.component' 6 | import { UserRoutingModule } from './user-routing.module' 7 | 8 | @NgModule({ 9 | imports: [CommonModule, UserRoutingModule, ProfileComponent, LogoutComponent], 10 | }) 11 | export class UserModule {} 12 | -------------------------------------------------------------------------------- /projects/stage8/src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/apple-touch-icon.png -------------------------------------------------------------------------------- /projects/stage8/src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffc40d 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /projects/stage8/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | authMode: AuthMode.Firebase, 6 | firebase: { 7 | apiKey: 'AIzaSyA_39OnkusNS7WeMqTuhRosonMV20WntcA', 8 | authDomain: 'lemon-mart-007.firebaseapp.com', 9 | databaseURL: 'https://lemon-mart-007.firebaseio.com', 10 | projectId: 'lemon-mart-007', 11 | storageBucket: '', 12 | messagingSenderId: '416892066612', 13 | appId: '1:416892066612:web:ec2f404c18fd4bd8', 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /projects/stage8/src/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/favicon-16x16.png -------------------------------------------------------------------------------- /projects/stage8/src/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/favicon-32x32.png -------------------------------------------------------------------------------- /projects/stage8/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/favicon.ico -------------------------------------------------------------------------------- /projects/stage8/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core' 2 | import { bootstrapApplication } from '@angular/platform-browser' 3 | 4 | import { AppComponent } from './app/app.component' 5 | import { appConfig } from './app/app.config' 6 | import { environment } from './environments/environment' 7 | 8 | if (environment.production) { 9 | enableProdMode() 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.log(err)) 13 | -------------------------------------------------------------------------------- /projects/stage8/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png?v=rMlKOnvxlK", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png?v=rMlKOnvxlK", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /projects/stage8/src/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/mstile-144x144.png -------------------------------------------------------------------------------- /projects/stage8/src/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/mstile-150x150.png -------------------------------------------------------------------------------- /projects/stage8/src/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/mstile-310x150.png -------------------------------------------------------------------------------- /projects/stage8/src/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/mstile-310x310.png -------------------------------------------------------------------------------- /projects/stage8/src/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/projects/stage8/src/mstile-70x70.png -------------------------------------------------------------------------------- /projects/stage8/src/styles.scss: -------------------------------------------------------------------------------- 1 | @use 'lemonmart-theme'; 2 | /* You can add global styles to this file, and also import other style files */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | } 8 | body { 9 | margin: 0; 10 | font-family: Roboto, 'Helvetica Neue', sans-serif; 11 | } 12 | 13 | .top-pad { 14 | margin-top: 16px; 15 | } 16 | 17 | .h-pad { 18 | margin: 0 16px; 19 | } 20 | 21 | .flex-spacer { 22 | flex: 1 1 auto; 23 | } 24 | -------------------------------------------------------------------------------- /projects/stage8/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /projects/stage8/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/spec", 5 | "types": ["jasmine"] 6 | }, 7 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api": { 3 | "target": "http://localhost:3000", 4 | "secure": false, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Feature/Change Description 2 | 3 | _Describe changes made here, link to any issue that is addressed_ 4 | 5 | # Developer Checklist 6 | 7 | - [ ] Updated documentation or README.md 8 | - [ ] If adding new feature(s), added and ran unit tests 9 | - [ ] If create new release, bumped version number 10 | - [ ] Ran `npm run style:fix` for code style enforcement 11 | - [ ] Ran `npm run lint:fix` for linting 12 | - [ ] Ran `npm audit` to discover vulnerabilities -------------------------------------------------------------------------------- /src/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/app/auth/auth.enum.ts: -------------------------------------------------------------------------------- 1 | export enum Role { 2 | None = 'none', 3 | Clerk = 'clerk', 4 | Cashier = 'cashier', 5 | Manager = 'manager', 6 | } 7 | 8 | export enum AuthMode { 9 | InMemory = 'In Memory', 10 | CustomServer = 'Custom Server', 11 | CustomGraphQL = 'Custom GraphQL', 12 | Firebase = 'Firebase', 13 | } 14 | -------------------------------------------------------------------------------- /src/app/auth/auth.factory.ts: -------------------------------------------------------------------------------- 1 | import { environment } from '../../environments/environment' 2 | import { CustomAuthService } from './auth.custom.service' 3 | import { AuthMode } from './auth.enum' 4 | import { FirebaseAuthService } from './auth.firebase.service' 5 | import { CustomGraphQLAuthService } from './auth.graphql.custom.service' 6 | import { InMemoryAuthService } from './auth.in-memory.service' 7 | 8 | export function authFactory() { 9 | switch (environment.authMode) { 10 | case AuthMode.InMemory: 11 | return new InMemoryAuthService() 12 | case AuthMode.CustomServer: 13 | return new CustomAuthService() 14 | case AuthMode.CustomGraphQL: 15 | return new CustomGraphQLAuthService() 16 | case AuthMode.Firebase: 17 | return new FirebaseAuthService() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/auth/auth.graphql.queries.ts: -------------------------------------------------------------------------------- 1 | import { gql } from 'apollo-angular' 2 | 3 | export const GET_ME = gql` 4 | query Me { 5 | me { 6 | address { 7 | line1 8 | line2 9 | city 10 | state 11 | zip 12 | } 13 | dateOfBirth 14 | email 15 | id 16 | level 17 | name { 18 | first 19 | middle 20 | last 21 | } 22 | phones { 23 | digits 24 | type 25 | } 26 | picture 27 | role 28 | userStatus 29 | } 30 | } 31 | ` 32 | 33 | export const LOGIN = gql` 34 | mutation Login($email: String!, $password: String!) { 35 | login(email: $email, password: $password) { 36 | accessToken 37 | } 38 | } 39 | ` 40 | -------------------------------------------------------------------------------- /src/app/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { inject, TestBed } from '@angular/core/testing' 3 | 4 | import { UiService } from '../common/ui.service' 5 | import { AuthService } from './auth.service' 6 | 7 | describe('AuthService', () => { 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({ 10 | imports: [HttpClientTestingModule], 11 | providers: [AuthService, UiService], 12 | }) 13 | }) 14 | 15 | it('should be created', inject([AuthService], (service: AuthService) => { 16 | expect(service).toBeTruthy() 17 | })) 18 | }) 19 | -------------------------------------------------------------------------------- /src/app/common/base-form.class.spec.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core' 2 | import { FormGroup } from '@angular/forms' 3 | 4 | import { BaseFormDirective } from './base-form.class' 5 | 6 | interface ITestData { 7 | name: string 8 | } 9 | 10 | @Directive() 11 | class TestFormDirective extends BaseFormDirective { 12 | buildForm(): FormGroup { 13 | return jasmine.createSpyObj('form', []) 14 | } 15 | } 16 | 17 | describe('BaseFormDirective', () => { 18 | it('should create an instance', () => { 19 | expect(new TestFormDirective()).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /src/app/common/common.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http' 2 | import { throwError } from 'rxjs' 3 | 4 | export function transformError(error: HttpErrorResponse | string) { 5 | let errorMessage = 'An unknown error has occurred' 6 | if (typeof error === 'string') { 7 | errorMessage = error 8 | } else if (error.error instanceof ErrorEvent) { 9 | errorMessage = `Error! ${error.error.message}` 10 | } else if (error.status) { 11 | errorMessage = `Request failed with ${error.status} ${error.statusText}` 12 | } else if (error instanceof Error) { 13 | errorMessage = error.message 14 | } 15 | return throwError(() => errorMessage) 16 | } 17 | -------------------------------------------------------------------------------- /src/app/common/loading.http.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { HttpHandlerFn, HttpRequest } from '@angular/common/http' 2 | import { inject } from '@angular/core' 3 | import { finalize } from 'rxjs' 4 | 5 | import { UiService } from './ui.service' 6 | 7 | export function LoadingHttpInterceptor(req: HttpRequest, next: HttpHandlerFn) { 8 | const uiService = inject(UiService) 9 | uiService.showLoader() 10 | return next(req).pipe(finalize(() => uiService.hideLoader())) 11 | } 12 | -------------------------------------------------------------------------------- /src/app/common/ui.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { MatDialogModule } from '@angular/material/dialog' 3 | import { MatSnackBarModule } from '@angular/material/snack-bar' 4 | 5 | import { commonTestingModules } from './common.testing' 6 | import { UiService } from './ui.service' 7 | 8 | describe('UiService', () => { 9 | let service: UiService 10 | 11 | beforeEach(() => { 12 | TestBed.configureTestingModule({ 13 | imports: [...commonTestingModules, MatSnackBarModule, MatDialogModule], 14 | }) 15 | service = TestBed.inject(UiService) 16 | }) 17 | 18 | it('should be created', () => { 19 | expect(service).toBeTruthy() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /src/app/common/validations.ts: -------------------------------------------------------------------------------- 1 | import { Validators } from '@angular/forms' 2 | 3 | export const OptionalTextValidation = [Validators.minLength(2), Validators.maxLength(50)] 4 | export const RequiredTextValidation = OptionalTextValidation.concat([Validators.required]) 5 | export const OneCharValidation = [Validators.minLength(1), Validators.maxLength(1)] 6 | export const EmailValidation = [Validators.required, Validators.email] 7 | export const PasswordValidation = [ 8 | Validators.required, 9 | Validators.minLength(8), 10 | Validators.maxLength(50), 11 | ] 12 | export const USAZipCodeValidation = [ 13 | Validators.required, 14 | Validators.pattern(/^\d{5}(?:[-\s]\d{4})?$/), 15 | ] 16 | export const USAPhoneNumberValidation = [ 17 | Validators.required, 18 | Validators.pattern(/^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$/), 19 | ] 20 | -------------------------------------------------------------------------------- /src/app/entity-metadata.ts: -------------------------------------------------------------------------------- 1 | import { EntityMetadataMap } from '@ngrx/data' 2 | 3 | const entityMetadata: EntityMetadataMap = { 4 | User: {}, 5 | } 6 | 7 | export const entityConfig = { 8 | entityMetadata, 9 | } 10 | -------------------------------------------------------------------------------- /src/app/inventory/categories/categories.component.html: -------------------------------------------------------------------------------- 1 |

2 | Categories 5 |

6 | -------------------------------------------------------------------------------- /src/app/inventory/categories/categories.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/app/inventory/categories/categories.component.scss -------------------------------------------------------------------------------- /src/app/inventory/categories/categories.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { CategoriesComponent } from './categories.component' 4 | 5 | describe('CategoriesComponent', () => { 6 | let component: CategoriesComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [CategoriesComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(CategoriesComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/app/inventory/categories/categories.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-categories', 5 | templateUrl: './categories.component.html', 6 | styleUrls: ['./categories.component.scss'], 7 | standalone: true, 8 | }) 9 | export class CategoriesComponent {} 10 | -------------------------------------------------------------------------------- /src/app/inventory/inventory-home/inventory-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { InventoryHomeComponent } from './inventory-home.component' 4 | 5 | describe('InventoryHomeComponent', () => { 6 | let component: InventoryHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [InventoryHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(InventoryHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/app/inventory/inventory-home/inventory-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-inventory-home', 5 | template: ` 6 |

7 | Inventory Home 10 |

11 | `, 12 | styles: ``, 13 | standalone: true, 14 | }) 15 | export class InventoryHomeComponent {} 16 | -------------------------------------------------------------------------------- /src/app/inventory/products/products.component.html: -------------------------------------------------------------------------------- 1 |

2 | Products 5 |

6 | -------------------------------------------------------------------------------- /src/app/inventory/products/products.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/app/inventory/products/products.component.scss -------------------------------------------------------------------------------- /src/app/inventory/products/products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ProductsComponent } from './products.component' 4 | 5 | describe('ProductsComponent', () => { 6 | let component: ProductsComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ProductsComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ProductsComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/app/inventory/products/products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-products', 5 | templateUrl: './products.component.html', 6 | styleUrls: ['./products.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ProductsComponent {} 10 | -------------------------------------------------------------------------------- /src/app/inventory/stock-entry/stock-entry.component.html: -------------------------------------------------------------------------------- 1 |

2 | Stock Entry 5 |

6 | -------------------------------------------------------------------------------- /src/app/inventory/stock-entry/stock-entry.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/app/inventory/stock-entry/stock-entry.component.scss -------------------------------------------------------------------------------- /src/app/inventory/stock-entry/stock-entry.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { StockEntryComponent } from './stock-entry.component' 4 | 5 | describe('StockEntryComponent', () => { 6 | let component: StockEntryComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [StockEntryComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(StockEntryComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/app/inventory/stock-entry/stock-entry.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-stock-entry', 5 | templateUrl: './stock-entry.component.html', 6 | styleUrls: ['./stock-entry.component.scss'], 7 | standalone: true, 8 | }) 9 | export class StockEntryComponent {} 10 | -------------------------------------------------------------------------------- /src/app/manager/manager-home/manager-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ManagerHomeComponent } from './manager-home.component' 4 | 5 | describe('ManagerHomeComponent', () => { 6 | let component: ManagerHomeComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ManagerHomeComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ManagerHomeComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/app/manager/manager-home/manager-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-manager-home', 5 | styles: ``, 6 | template: ` 7 |

8 | Manager Home 11 |

12 | `, 13 | standalone: true, 14 | }) 15 | export class ManagerHomeComponent {} 16 | -------------------------------------------------------------------------------- /src/app/manager/receipt-lookup/receipt-lookup.component.html: -------------------------------------------------------------------------------- 1 |

2 | Receipt Lookup 5 |

6 | -------------------------------------------------------------------------------- /src/app/manager/receipt-lookup/receipt-lookup.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/app/manager/receipt-lookup/receipt-lookup.component.scss -------------------------------------------------------------------------------- /src/app/manager/receipt-lookup/receipt-lookup.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { ReceiptLookupComponent } from './receipt-lookup.component' 4 | 5 | describe('ReceiptLookupComponent', () => { 6 | let component: ReceiptLookupComponent 7 | let fixture: ComponentFixture 8 | 9 | beforeEach(waitForAsync(() => { 10 | TestBed.configureTestingModule({ 11 | imports: [ReceiptLookupComponent], 12 | }).compileComponents() 13 | })) 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(ReceiptLookupComponent) 17 | component = fixture.componentInstance 18 | fixture.detectChanges() 19 | }) 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy() 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/app/manager/receipt-lookup/receipt-lookup.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-receipt-lookup', 5 | templateUrl: './receipt-lookup.component.html', 6 | styleUrls: ['./receipt-lookup.component.scss'], 7 | standalone: true, 8 | }) 9 | export class ReceiptLookupComponent {} 10 | -------------------------------------------------------------------------------- /src/app/manager/user-management/user-management.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterOutlet } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-user-management', 6 | template: ` 7 |
8 | 9 |
10 | 11 |
12 | `, 13 | standalone: true, 14 | imports: [RouterOutlet], 15 | }) 16 | export class UserManagementComponent {} 17 | -------------------------------------------------------------------------------- /src/app/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-page-not-found', 6 | template: ` 7 |

8 | This page doesn't exist. Go back to 9 | home 10 | . 11 |

12 | `, 13 | standalone: true, 14 | imports: [RouterLink], 15 | }) 16 | export class PageNotFoundComponent {} 17 | -------------------------------------------------------------------------------- /src/app/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | 6 | const routes: Routes = [{ path: '', component: PosComponent }] 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class PosRoutingModule {} 13 | -------------------------------------------------------------------------------- /src/app/pos/pos.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | 4 | import { PosComponent } from './pos/pos.component' 5 | import { PosRoutingModule } from './pos-routing.module' 6 | import { TransactionService } from './transaction/transaction.service' 7 | 8 | @NgModule({ 9 | imports: [CommonModule, PosRoutingModule, PosComponent], 10 | providers: [TransactionService], 11 | }) 12 | export class PosModule {} 13 | -------------------------------------------------------------------------------- /src/app/pos/pos/pos.component.html: -------------------------------------------------------------------------------- 1 |

2 | Point of Sale 5 |

6 |

7 | 10 |

11 | -------------------------------------------------------------------------------- /src/app/pos/pos/pos.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/app/pos/pos/pos.component.scss -------------------------------------------------------------------------------- /src/app/pos/transaction/transaction.enum.ts: -------------------------------------------------------------------------------- 1 | export enum TransactionType { 2 | Cash, 3 | Credit, 4 | LemonCoin, 5 | } 6 | -------------------------------------------------------------------------------- /src/app/pos/transaction/transaction.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { HttpClientTestingModule } from '@angular/common/http/testing' 2 | import { inject, TestBed } from '@angular/core/testing' 3 | 4 | import { TransactionService } from './transaction.service' 5 | 6 | describe('TransactionService', () => { 7 | beforeEach(() => { 8 | TestBed.configureTestingModule({ 9 | imports: [HttpClientTestingModule], 10 | providers: [TransactionService], 11 | }) 12 | }) 13 | 14 | it('should be created', inject([TransactionService], (service: TransactionService) => { 15 | expect(service).toBeTruthy() 16 | })) 17 | }) 18 | -------------------------------------------------------------------------------- /src/app/pos/transaction/transaction.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core' 2 | import { BehaviorSubject, Observable } from 'rxjs' 3 | 4 | import { ITransaction } from './transaction' 5 | 6 | @Injectable() 7 | export class TransactionService { 8 | processTransaction(_transaction: ITransaction): Observable { 9 | return new BehaviorSubject('5a6352c6810c19729de860ea').asObservable() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/pos/transaction/transaction.ts: -------------------------------------------------------------------------------- 1 | import { TransactionType } from './transaction.enum' 2 | 3 | export interface ITransaction { 4 | paymentType: TransactionType 5 | paymentAmount: number 6 | transactionId?: string 7 | } 8 | -------------------------------------------------------------------------------- /src/app/user-controls/field-error/field-error.directive.spec.ts: -------------------------------------------------------------------------------- 1 | import { ElementRef } from '@angular/core' 2 | import { autoSpyObj } from 'angular-unit-test-helper' 3 | 4 | import { FieldErrorDirective } from './field-error.directive' 5 | 6 | describe('FormErrorDirective', () => { 7 | it('should create an instance', () => { 8 | const directive = new FieldErrorDirective(autoSpyObj(ElementRef)) 9 | expect(directive).toBeTruthy() 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /src/app/user-controls/lemon-rater/lemon-rater.component.scss: -------------------------------------------------------------------------------- 1 | .lemons { 2 | cursor: pointer; 3 | } 4 | 5 | .lemons:hover .lemon #fill-area { 6 | fill: #ffe200 !important; 7 | } 8 | 9 | .lemons.disabled:hover { 10 | cursor: not-allowed; 11 | } 12 | 13 | .lemons.disabled:hover .lemon #fill-area { 14 | fill: #d8d8d8 !important; 15 | } 16 | 17 | .lemons .lemon { 18 | float: left; 19 | margin: 0px 5px; 20 | } 21 | 22 | .lemons .lemon #fill-area { 23 | fill: #d8d8d8; 24 | } 25 | 26 | .lemons .lemon:hover ~ .lemon #fill-area { 27 | fill: #d8d8d8 !important; 28 | } 29 | 30 | .lemons .lemon.selected #fill-area { 31 | fill: #ffe200 !important; 32 | } 33 | -------------------------------------------------------------------------------- /src/app/user/logout/logout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | import { Router } from '@angular/router' 3 | 4 | import { AuthService } from '../../auth/auth.service' 5 | 6 | @Component({ 7 | selector: 'app-logout', 8 | template: `

Logging out...

`, 9 | standalone: true, 10 | }) 11 | export class LogoutComponent implements OnInit { 12 | constructor( 13 | private router: Router, 14 | private authService: AuthService 15 | ) {} 16 | 17 | ngOnInit() { 18 | this.authService.logout(true) 19 | this.router.navigate(['/']) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/app/user/profile/profile.component.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | color: red; 3 | } 4 | 5 | .mat-mdc-form-field { 6 | padding-top: 16px; 7 | } 8 | 9 | .mat-mdc-list-item { 10 | height: 72px; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/user/user/user.resolve.ts: -------------------------------------------------------------------------------- 1 | import { inject } from '@angular/core' 2 | import { ActivatedRouteSnapshot, ResolveFn } from '@angular/router' 3 | import { catchError, map } from 'rxjs/operators' 4 | 5 | import { transformError } from '../../common/common' 6 | import { User } from './user' 7 | import { UserService } from './user.service' 8 | 9 | export const userResolver: ResolveFn = (route: ActivatedRouteSnapshot) => { 10 | return inject(UserService) 11 | .getUser(route.paramMap.get('userId')) 12 | .pipe(map(User.Build), catchError(transformError)) 13 | } 14 | -------------------------------------------------------------------------------- /src/app/user/user/user.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { inject, TestBed } from '@angular/core/testing' 2 | 3 | import { commonTestingModules, commonTestingProviders } from '../../common/common.testing' 4 | import { UserService } from './user.service' 5 | 6 | describe('UserService', () => { 7 | beforeEach(() => { 8 | TestBed.configureTestingModule({ 9 | imports: [commonTestingModules], 10 | providers: [UserService, commonTestingProviders], 11 | }) 12 | }) 13 | 14 | it('should be created', inject([UserService], (service: UserService) => { 15 | expect(service).toBeTruthy() 16 | })) 17 | }) 18 | -------------------------------------------------------------------------------- /src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/img/lemon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/assets/img/lemon.png -------------------------------------------------------------------------------- /src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ffc40d 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/environments/environment.firebase.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | baseUrl: 'http://localhost:3000', 6 | authMode: AuthMode.Firebase, 7 | } 8 | -------------------------------------------------------------------------------- /src/environments/environment.lemon-mart-server.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | baseUrl: 'http://localhost:3000', 6 | authMode: AuthMode.CustomServer, 7 | } 8 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | export const environment = { 4 | production: true, 5 | baseUrl: 'http://localhost:3000', 6 | authMode: AuthMode.CustomServer, 7 | } 8 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | import { AuthMode } from '../app/auth/auth.enum' 2 | 3 | // The file contents for the current environment will overwrite these during build. 4 | // The build system defaults to the dev environment which uses `environment.ts`, 5 | // but if you do `ng build --env=prod` then `environment.prod.ts` will be used instead. 6 | // The list of which env maps to which file can be found in `.angular-cli.json`. 7 | 8 | export const environment = { 9 | production: false, 10 | baseUrl: 'http://localhost:3000', 11 | authMode: AuthMode.CustomServer, 12 | } 13 | -------------------------------------------------------------------------------- /src/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/favicon-16x16.png -------------------------------------------------------------------------------- /src/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/favicon-32x32.png -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/favicon.ico -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core' 2 | import { bootstrapApplication } from '@angular/platform-browser' 3 | 4 | import { AppComponent } from './app/app.component' 5 | import { appConfig } from './app/app.config' 6 | import { environment } from './environments/environment' 7 | 8 | if (environment.production) { 9 | enableProdMode() 10 | } 11 | 12 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.log(err)) 13 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png?v=rMlKOnvxlK", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png?v=rMlKOnvxlK", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /src/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/mstile-144x144.png -------------------------------------------------------------------------------- /src/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/mstile-150x150.png -------------------------------------------------------------------------------- /src/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/mstile-310x150.png -------------------------------------------------------------------------------- /src/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/mstile-310x310.png -------------------------------------------------------------------------------- /src/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duluca/lemon-mart/3597fe099003ef7fd1fb56e0aefa02851f274f60/src/mstile-70x70.png -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | @use 'lemonmart-theme'; 2 | /* You can add global styles to this file, and also import other style files */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | } 8 | body { 9 | margin: 0; 10 | font-family: Roboto, 'Helvetica Neue', sans-serif; 11 | } 12 | 13 | .top-pad { 14 | margin-top: 16px; 15 | } 16 | 17 | .h-pad { 18 | margin: 0 16px; 19 | } 20 | 21 | .v-pad { 22 | margin: 16px 0; 23 | } 24 | 25 | .left-pad { 26 | margin-left: 8px; 27 | } 28 | 29 | .flex-spacer { 30 | flex: 1 1 auto; 31 | } 32 | -------------------------------------------------------------------------------- /test.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM duluca/minimal-node-chromium:lts-alpine as tester 2 | #FROM circleci/node:lts-browsers 3 | #FROM chromium 4 | 5 | WORKDIR /usr/src 6 | 7 | COPY . . 8 | 9 | # install dependencies and build 10 | RUN npm ci 11 | 12 | WORKDIR /usr/src 13 | 14 | RUN npm run test:prod 15 | # RUN npm run test:prod:e2e 16 | 17 | 18 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "noImplicitAny": false, 6 | "types": ["jasmine"] 7 | }, 8 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 9 | } 10 | --------------------------------------------------------------------------------