├── .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 |
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 |
10 |
11 | `,
12 | styles: ``,
13 | standalone: true,
14 | })
15 | export class InventoryHomeComponent {}
16 |
--------------------------------------------------------------------------------
/projects/stage10/src/app/inventory/products/products.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
10 |
11 | `,
12 | styles: ``,
13 | standalone: true,
14 | })
15 | export class InventoryHomeComponent {}
16 |
--------------------------------------------------------------------------------
/projects/stage11/src/app/inventory/products/products.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
10 |
11 | `,
12 | styles: ``,
13 | standalone: true,
14 | })
15 | export class InventoryHomeComponent {}
16 |
--------------------------------------------------------------------------------
/projects/stage12/src/app/inventory/products/products.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
10 |
11 | `,
12 | styles: ``,
13 | standalone: true,
14 | })
15 | export class InventoryHomeComponent {}
16 |
--------------------------------------------------------------------------------
/projects/stage7/src/app/inventory/products/products.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
10 |
11 | `,
12 | styles: ``,
13 | standalone: true,
14 | })
15 | export class InventoryHomeComponent {}
16 |
--------------------------------------------------------------------------------
/projects/stage8/src/app/inventory/products/products.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
10 |
11 | `,
12 | styles: ``,
13 | standalone: true,
14 | })
15 | export class InventoryHomeComponent {}
16 |
--------------------------------------------------------------------------------
/src/app/inventory/products/products.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
11 |
12 | `,
13 | standalone: true,
14 | })
15 | export class ManagerHomeComponent {}
16 |
--------------------------------------------------------------------------------
/src/app/manager/receipt-lookup/receipt-lookup.component.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
--------------------------------------------------------------------------------