diff --git a/.env b/.env index c5dfef0..9c3ef91 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ HOST=0.0.0.0 PORT=9995 LOG_LEVEL=INFO DEBUG=true -SQLALCHEMY_DATABASE_URI=postgresql://postgres:123456@localhost:5432/petty +SQLALCHEMY_DATABASE_URI=postgresql+psycopg://postgres:123456@localhost:5432/petty MODULE_NAME=barker.main PROJECT_NAME=barker diff --git a/.vscode/settings.json b/.vscode/settings.json index 923be5f..e01fa3f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.defaultInterpreterPath": "/home/tanshu/.cache/pypoetry/virtualenvs/barker-3ndhMgBR-py3.11/bin/python", + "python.defaultInterpreterPath": "/home/tanshu/.cache/pypoetry/virtualenvs/barker-3ndhMgBR-py3.12/bin/python", "files.exclude": { "**/__pycache__": true, "**/.mypy_cache": true, diff --git a/barker/.pre-commit-config.yaml b/barker/.pre-commit-config.yaml index 6a8987d..391c05f 100644 --- a/barker/.pre-commit-config.yaml +++ b/barker/.pre-commit-config.yaml @@ -1,19 +1,18 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - - repo: https://github.com/psf/black - rev: 23.1.0 + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.4.6 hooks: - - id: black - - # - repo: https://github.com/astral-sh/ruff-pre-commit - # # Ruff version. - # rev: v0.0.286 - # hooks: - # - id: ruff + # Run the linter. + - id: ruff + args: [ --fix ] + # Run the formatter. + - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer diff --git a/barker/alembic/env.py b/barker/alembic/env.py index 869e48d..a6afa00 100644 --- a/barker/alembic/env.py +++ b/barker/alembic/env.py @@ -1,9 +1,10 @@ import logging +from sqlalchemy import create_engine, pool + from alembic import context from barker.core.config import settings from barker.db.base import reg -from sqlalchemy import create_engine, pool logging.basicConfig() diff --git a/barker/alembic/versions/0e326930b8a4_temporal_products_fixed.py b/barker/alembic/versions/0e326930b8a4_temporal_products_fixed.py index 832854c..dff6bc4 100644 --- a/barker/alembic/versions/0e326930b8a4_temporal_products_fixed.py +++ b/barker/alembic/versions/0e326930b8a4_temporal_products_fixed.py @@ -5,12 +5,14 @@ Revises: 3609c44430c8 Create Date: 2021-10-22 09:36:11.746119 """ + import sqlalchemy as sa -from alembic import op from sqlalchemy import column, func, table, text from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision = "0e326930b8a4" diff --git a/barker/alembic/versions/1d95eb10ea20_cancel_bill.py b/barker/alembic/versions/1d95eb10ea20_cancel_bill.py index dad4b2b..cd89e2e 100644 --- a/barker/alembic/versions/1d95eb10ea20_cancel_bill.py +++ b/barker/alembic/versions/1d95eb10ea20_cancel_bill.py @@ -5,13 +5,15 @@ Revises: 5967e6603c3e Create Date: 2023-03-17 01:04:25.809115 """ + import sqlalchemy as sa -from alembic import op from sqlalchemy import column, table from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import ENUM +from alembic import op + # revision identifiers, used by Alembic. revision = "1d95eb10ea20" diff --git a/barker/alembic/versions/34fe3d061c5f_finish_import.py b/barker/alembic/versions/34fe3d061c5f_finish_import.py index 5840f6c..d64abf9 100644 --- a/barker/alembic/versions/34fe3d061c5f_finish_import.py +++ b/barker/alembic/versions/34fe3d061c5f_finish_import.py @@ -5,17 +5,19 @@ Revises: 8c06ac60d125 Create Date: 2020-10-27 19:38:48.445908 """ + from datetime import date, timedelta import sqlalchemy as sa -from alembic import op # revision identifiers, used by Alembic. from sqlalchemy import column, func, select, table, text from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import insert as pg_insert +from alembic import op + revision = "34fe3d061c5f" down_revision = "8c06ac60d125" @@ -181,7 +183,7 @@ def upgrade(): op.drop_constraint("pk_products", "products", type_="primary") op.rename_table("products", "product_versions") with op.batch_alter_table("product_versions") as batch_op: - batch_op.add_column(sa.Column("product_id", postgresql.UUID(as_uuid=True), nullable=True)), + (batch_op.add_column(sa.Column("product_id", postgresql.UUID(as_uuid=True), nullable=True)),) batch_op.add_column(sa.Column("valid_from", sa.Date(), nullable=True)) batch_op.add_column(sa.Column("valid_till", sa.Date(), nullable=True)) batch_op.create_primary_key("pk_product_versions", ["id"]) diff --git a/barker/alembic/versions/3609c44430c8_user.py b/barker/alembic/versions/3609c44430c8_user.py index 9ce01aa..f89adb4 100644 --- a/barker/alembic/versions/3609c44430c8_user.py +++ b/barker/alembic/versions/3609c44430c8_user.py @@ -5,6 +5,7 @@ Revises: 81d94c5223a7 Create Date: 2021-09-28 09:18:10.666701 """ + import sqlalchemy as sa from alembic import op diff --git a/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py b/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py index 1a2fbb4..980f171 100644 --- a/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py +++ b/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py @@ -5,14 +5,16 @@ Revises: 34fe3d061c5f Create Date: 2020-12-10 08:29:39.175097 """ + import sqlalchemy as sa -from alembic import op # revision identifiers, used by Alembic. from sqlalchemy import column, table from sqlalchemy.sql import expression +from alembic import op + revision = "48bc1c7c07ce" down_revision = "34fe3d061c5f" diff --git a/barker/alembic/versions/5967e6603c3e_tax_regimes.py b/barker/alembic/versions/5967e6603c3e_tax_regimes.py index 0e28c9d..0eee1d5 100644 --- a/barker/alembic/versions/5967e6603c3e_tax_regimes.py +++ b/barker/alembic/versions/5967e6603c3e_tax_regimes.py @@ -5,12 +5,14 @@ Revises: f135019a4ebf Create Date: 2023-02-22 03:55:58.764092 """ + import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import ENUM +from alembic import op + # revision identifiers, used by Alembic. revision = "5967e6603c3e" diff --git a/barker/alembic/versions/7e9944b430d6_booking.py b/barker/alembic/versions/7e9944b430d6_booking.py index 6b18c4e..edd9a09 100644 --- a/barker/alembic/versions/7e9944b430d6_booking.py +++ b/barker/alembic/versions/7e9944b430d6_booking.py @@ -5,11 +5,13 @@ Revises: 1d95eb10ea20 Create Date: 2023-08-19 14:25:40.206187 """ + import sqlalchemy as sa -from alembic import op from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision = "7e9944b430d6" diff --git a/barker/alembic/versions/81d94c5223a7_section_printer.py b/barker/alembic/versions/81d94c5223a7_section_printer.py index 7f20194..bdddf7c 100644 --- a/barker/alembic/versions/81d94c5223a7_section_printer.py +++ b/barker/alembic/versions/81d94c5223a7_section_printer.py @@ -5,12 +5,14 @@ Revises: c123dbf9c659 Create Date: 2021-08-17 12:10:01.082632 """ + import sqlalchemy as sa -from alembic import op from sqlalchemy import column, table from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision = "81d94c5223a7" diff --git a/barker/alembic/versions/8c06ac60d125_initial_commit.py b/barker/alembic/versions/8c06ac60d125_initial_commit.py index 8ddb4e1..d2f2963 100644 --- a/barker/alembic/versions/8c06ac60d125_initial_commit.py +++ b/barker/alembic/versions/8c06ac60d125_initial_commit.py @@ -5,16 +5,18 @@ Revises: Create Date: 2020-06-04 08:14:34.132248 """ + import sqlalchemy as sa +from sqlalchemy import column, table +from sqlalchemy.dialects import postgresql + from alembic import op from barker.models.db_setting import DbSetting from barker.models.modifier_category import ModifierCategory from barker.models.permission import Permission from barker.models.section import Section from barker.models.user import User # noqa: F401 -from sqlalchemy import column, table -from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. diff --git a/barker/alembic/versions/c123dbf9c659_temporal_products_editing.py b/barker/alembic/versions/c123dbf9c659_temporal_products_editing.py index f379857..09c3337 100644 --- a/barker/alembic/versions/c123dbf9c659_temporal_products_editing.py +++ b/barker/alembic/versions/c123dbf9c659_temporal_products_editing.py @@ -5,6 +5,7 @@ Revises: e5e8acfc6495 Create Date: 2021-08-06 10:15:57.719313 """ + from alembic import op # revision identifiers, used by Alembic. diff --git a/barker/alembic/versions/e5e8acfc6495_print_customer.py b/barker/alembic/versions/e5e8acfc6495_print_customer.py index 3fd85f7..14651e2 100644 --- a/barker/alembic/versions/e5e8acfc6495_print_customer.py +++ b/barker/alembic/versions/e5e8acfc6495_print_customer.py @@ -5,13 +5,15 @@ Revises: 48bc1c7c07ce Create Date: 2021-06-27 09:57:43.034956 """ + import sqlalchemy as sa -from alembic import op # revision identifiers, used by Alembic. from sqlalchemy.sql import expression +from alembic import op + revision = "e5e8acfc6495" down_revision = "48bc1c7c07ce" diff --git a/barker/alembic/versions/f135019a4ebf_fix_nullability.py b/barker/alembic/versions/f135019a4ebf_fix_nullability.py index 2f4c365..a910794 100644 --- a/barker/alembic/versions/f135019a4ebf_fix_nullability.py +++ b/barker/alembic/versions/f135019a4ebf_fix_nullability.py @@ -5,6 +5,7 @@ Revises: 0e326930b8a4 Create Date: 2023-02-22 03:41:23.537388 """ + import sqlalchemy as sa from alembic import op diff --git a/barker/barker/core/security.py b/barker/barker/core/security.py index 5106c67..6c22a5d 100644 --- a/barker/barker/core/security.py +++ b/barker/barker/core/security.py @@ -1,6 +1,7 @@ import uuid -from datetime import datetime, timedelta +from datetime import UTC, datetime, timedelta +from typing import Any from fastapi import Depends, HTTPException, Security, status from fastapi.security import OAuth2PasswordBearer, SecurityScopes @@ -32,18 +33,9 @@ class TokenData(BaseModel): scopes: list[str] = [] -def f7(seq): - seen = set() - seen_add = seen.add - return [x for x in seq if not (x in seen or seen_add(x))] - - -def create_access_token(*, data: dict, expires_delta: timedelta | None = None): +def create_access_token(*, data: dict[str, Any], expires_delta: timedelta | None = None) -> str: to_encode = data.copy() - if expires_delta: - expire = datetime.utcnow() + expires_delta - else: - expire = datetime.utcnow() + timedelta(minutes=15) + expire = datetime.now(UTC).replace(tzinfo=None) + (expires_delta or timedelta(minutes=15)) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) return encoded_jwt @@ -77,10 +69,7 @@ async def get_current_user( security_scopes: SecurityScopes, token: str = Depends(oauth2_scheme), ) -> UserToken: - if security_scopes.scopes: - authenticate_value = f'Bearer scope="{security_scopes.scope_str}"' - else: - authenticate_value = "Bearer" + authenticate_value = f'Bearer scope="{security_scopes.scope_str}"' if security_scopes.scopes else "Bearer" credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", @@ -114,7 +103,7 @@ async def get_current_user( async def get_current_active_user( - current_user: UserToken = Security(get_current_user, scopes=["authenticated"]) + current_user: UserToken = Security(get_current_user, scopes=["authenticated"]), ) -> UserToken: if current_user.locked_out: raise HTTPException(status_code=400, detail="Inactive user") diff --git a/barker/barker/core/session.py b/barker/barker/core/session.py index 13abcd8..15315a2 100644 --- a/barker/barker/core/session.py +++ b/barker/barker/core/session.py @@ -1,40 +1,42 @@ from datetime import date, timedelta +from typing import Any -def get_date(session) -> str: +def get_date(session: dict[str, Any]) -> str: if "date" not in session: session["date"] = date.today().strftime("%d-%b-%Y") - return session["date"] + return session["date"] # type: ignore[no-any-return] -def set_date(date_, session): - session["date"] = date_ - return session["date"] +def set_date(date_: str | date, session: dict[str, Any]) -> None: + session["date"] = date_ if isinstance(date_, str) else date_.strftime("%d-%b-%Y") -def get_start_date(session): +def get_start_date(session: dict[str, Any]) -> str: if "start" not in session: session["start"] = get_first_day(date.today()).strftime("%d-%b-%Y") - return session["start"] + return session["start"] # type: ignore[no-any-return] -def get_finish_date(session): +def get_finish_date(session: dict[str, Any]) -> str: if "finish" not in session: session["finish"] = get_last_day(date.today()).strftime("%d-%b-%Y") - return session["finish"] + return session["finish"] # type: ignore[no-any-return] -def set_period(start, finish, session): - session["start"] = start if isinstance(start, str) else start.strftime("%d-%b-%Y") - session["finish"] = finish if isinstance(finish, str) else finish.strftime("%d-%b-%Y") +def set_period(start: str | date | None, finish: str | date | None, session: dict[str, Any]) -> None: + if start is not None: + session["start"] = start if isinstance(start, str) else start.strftime("%d-%b-%Y") + if finish is not None: + session["finish"] = finish if isinstance(finish, str) else finish.strftime("%d-%b-%Y") -def get_first_day(dt, d_years=0, d_months=0): +def get_first_day(dt: date, d_years: int = 0, d_months: int = 0) -> date: # d_years, d_months are "deltas" to apply to dt y, m = dt.year + d_years, dt.month + d_months a, m = divmod(m - 1, 12) return date(y + a, m + 1, 1) -def get_last_day(dt): +def get_last_day(dt: date) -> date: return get_first_day(dt, 0, 1) + timedelta(-1) diff --git a/barker/barker/db/session.py b/barker/barker/db/session.py index 330a2a7..c584b81 100644 --- a/barker/barker/db/session.py +++ b/barker/barker/db/session.py @@ -8,5 +8,5 @@ from ..core.config import settings logging.basicConfig() logging.getLogger("sqlalchemy.engine").setLevel(settings.LOG_LEVEL) -engine = create_engine(settings.SQLALCHEMY_DATABASE_URI, pool_pre_ping=True, future=True) +engine = create_engine(settings.SQLALCHEMY_DATABASE_URI, pool_pre_ping=True, future=True) # type: ignore[arg-type] SessionFuture = sessionmaker(autoflush=False, bind=engine, future=True) diff --git a/barker/barker/models/customer.py b/barker/barker/models/customer.py index 999150f..5d751da 100644 --- a/barker/barker/models/customer.py +++ b/barker/barker/models/customer.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -24,7 +24,7 @@ class Customer: print_in_bill: Mapped[bool] = mapped_column(Boolean, server_default=expression.false(), nullable=False) - discounts: Mapped[List["CustomerDiscount"]] = relationship(back_populates="customer") + discounts: Mapped[list["CustomerDiscount"]] = relationship(back_populates="customer") @property def __name__(self): diff --git a/barker/barker/models/customer_discount.py b/barker/barker/models/customer_discount.py index 5418a79..0e578de 100644 --- a/barker/barker/models/customer_discount.py +++ b/barker/barker/models/customer_discount.py @@ -1,6 +1,6 @@ import uuid -from datetime import datetime +from datetime import UTC, datetime from decimal import Decimal from typing import TYPE_CHECKING @@ -32,7 +32,7 @@ class CustomerDiscount: self.sale_category_id = sale_category_id self.discount = discount self.id = id_ - self.date = datetime.utcnow() + self.date = datetime.now(UTC).replace(tzinfo=None) if customer is None: self.customer_id = customer_id else: diff --git a/barker/barker/models/device.py b/barker/barker/models/device.py index 4685282..8978f4d 100644 --- a/barker/barker/models/device.py +++ b/barker/barker/models/device.py @@ -2,8 +2,8 @@ import random import string import uuid -from datetime import datetime -from typing import TYPE_CHECKING, List +from datetime import UTC, datetime +from typing import TYPE_CHECKING from sqlalchemy import Boolean, DateTime, ForeignKey, Text, Uuid, desc, text from sqlalchemy.orm import Mapped, Session, mapped_column, relationship @@ -27,7 +27,7 @@ class Device: creation_date: Mapped[datetime] = mapped_column(DateTime(), nullable=False) section: Mapped["Section"] = relationship(back_populates="devices") - login_history: Mapped[List["LoginHistory"]] = relationship( + login_history: Mapped[list["LoginHistory"]] = relationship( order_by=desc(LoginHistory.date), back_populates="device" ) @@ -35,7 +35,7 @@ class Device: self.name = name self.enabled = enabled self.section_id = section_id - self.creation_date = datetime.utcnow() if creation_date is None else creation_date + self.creation_date = datetime.now(UTC).replace(tzinfo=None) if creation_date is None else creation_date self.id = id_ @classmethod diff --git a/barker/barker/models/guest_book.py b/barker/barker/models/guest_book.py index 392550c..f204f7d 100644 --- a/barker/barker/models/guest_book.py +++ b/barker/barker/models/guest_book.py @@ -1,6 +1,6 @@ import uuid -from datetime import datetime +from datetime import UTC, datetime from typing import TYPE_CHECKING, Optional from sqlalchemy import ( @@ -32,8 +32,8 @@ class GuestBook: id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, server_default=text("gen_random_uuid()")) customer_id: Mapped[uuid.UUID] = mapped_column(Uuid, ForeignKey("customers.id"), nullable=False) pax: Mapped[int] = mapped_column(Integer, nullable=False) - booking_date: Mapped[Optional[datetime]] = mapped_column(DateTime(), nullable=True) - arrival_date: Mapped[Optional[datetime]] = mapped_column(DateTime(), nullable=True) + booking_date: Mapped[datetime | None] = mapped_column(DateTime(), nullable=True) + arrival_date: Mapped[datetime | None] = mapped_column(DateTime(), nullable=True) last_edit_date: Mapped[datetime] = mapped_column(DateTime(), nullable=False) notes: Mapped[str | None] = mapped_column(Text, nullable=True) type_: Mapped[GuestBookType] = mapped_column("type", Enum(GuestBookType), nullable=False) @@ -60,7 +60,7 @@ class GuestBook: self.booking_date = booking_date self.arrival_date = arrival_date - self.last_edit_date = datetime.utcnow() + self.last_edit_date = datetime.now(UTC).replace(tzinfo=None) self.notes = notes self.type_ = type_ if customer is None: diff --git a/barker/barker/models/inventory.py b/barker/barker/models/inventory.py index b4ab756..ba3b4b1 100644 --- a/barker/barker/models/inventory.py +++ b/barker/barker/models/inventory.py @@ -1,7 +1,7 @@ import uuid from decimal import Decimal -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import ( Boolean, @@ -49,7 +49,7 @@ class Inventory: tax: Mapped["Tax"] = relationship(back_populates="inventories") product: Mapped["Product"] = relationship(back_populates="inventories") - modifiers: Mapped[List["InventoryModifier"]] = relationship(back_populates="inventory") + modifiers: Mapped[list["InventoryModifier"]] = relationship(back_populates="inventory") def __init__( self, @@ -89,7 +89,8 @@ class Inventory: @classmethod def _effective_price_expression(cls) -> ColumnElement[Decimal]: return type_coerce( - case((cls.is_happy_hour == True, 0), else_=cls.price), Numeric(precision=15, scale=2) # noqa: E712 + case((cls.is_happy_hour == True, 0), else_=cls.price), # noqa: E712 + Numeric(precision=15, scale=2), ).label("effective_price") @hybrid_property diff --git a/barker/barker/models/kot.py b/barker/barker/models/kot.py index 66e85d5..d7b271b 100644 --- a/barker/barker/models/kot.py +++ b/barker/barker/models/kot.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import DateTime, ForeignKey, Integer, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -39,7 +39,7 @@ class Kot: voucher: Mapped["Voucher"] = relationship(back_populates="kots") user: Mapped["User"] = relationship(backref="kots") food_table: Mapped["FoodTable"] = relationship(backref="kots") - inventories: Mapped[List["Inventory"]] = relationship(back_populates="kot") + inventories: Mapped[list["Inventory"]] = relationship(back_populates="kot") def __init__( self, diff --git a/barker/barker/models/login_history.py b/barker/barker/models/login_history.py index 9447676..7622bca 100644 --- a/barker/barker/models/login_history.py +++ b/barker/barker/models/login_history.py @@ -1,6 +1,6 @@ import uuid -from datetime import datetime +from datetime import UTC, datetime from typing import TYPE_CHECKING from sqlalchemy import DateTime, ForeignKey, UniqueConstraint, Uuid, text @@ -33,5 +33,5 @@ class LoginHistory: def __init__(self, user_id=None, device_id=None, date=None, id_=None): self.user_id = user_id self.device_id = device_id - self.date = datetime.utcnow() if date is None else date + self.date = datetime.now(UTC).replace(tzinfo=None) if date is None else date self.id = id_ diff --git a/barker/barker/models/menu_category.py b/barker/barker/models/menu_category.py index 536bee7..9b2c793 100644 --- a/barker/barker/models/menu_category.py +++ b/barker/barker/models/menu_category.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, Integer, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -23,7 +23,7 @@ class MenuCategory: is_fixture: Mapped[bool] = mapped_column(Boolean, nullable=False) sort_order: Mapped[int] = mapped_column(Integer, nullable=False) - products: Mapped[List["ProductVersion"]] = relationship(back_populates="menu_category") + products: Mapped[list["ProductVersion"]] = relationship(back_populates="menu_category") def __init__(self, name, is_active, sort_order, is_fixture=False, id_=None): self.name = name diff --git a/barker/barker/models/modifier_category.py b/barker/barker/models/modifier_category.py index 6fb48e7..2618df2 100644 --- a/barker/barker/models/modifier_category.py +++ b/barker/barker/models/modifier_category.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, Integer, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -25,11 +25,11 @@ class ModifierCategory: is_active: Mapped[bool] = mapped_column(Boolean, nullable=False) sort_order: Mapped[int] = mapped_column(Integer, nullable=False) - products: Mapped[List["Product"]] = relationship( + products: Mapped[list["Product"]] = relationship( secondary=ModifierCategoryProduct.__table__, # type: ignore[attr-defined] back_populates="modifier_categories", ) - modifiers: Mapped[List["Modifier"]] = relationship(back_populates="modifier_category") + modifiers: Mapped[list["Modifier"]] = relationship(back_populates="modifier_category") def __init__( self, diff --git a/barker/barker/models/overview.py b/barker/barker/models/overview.py index 299e589..d5ddd88 100644 --- a/barker/barker/models/overview.py +++ b/barker/barker/models/overview.py @@ -36,9 +36,9 @@ class Overview: guest_book_id: Mapped[uuid.UUID] = mapped_column(Uuid, ForeignKey("guest_book.id"), unique=True, nullable=True) status: Mapped[OverviewStatus] = mapped_column(Enum(OverviewStatus), nullable=False) - voucher: Mapped["Voucher"] = relationship(back_populates="status") - food_table: Mapped["FoodTable"] = relationship(back_populates="status") - guest: Mapped["GuestBook"] = relationship(back_populates="status") + voucher: Mapped[Voucher] = relationship(back_populates="status") + food_table: Mapped[FoodTable] = relationship(back_populates="status") + guest: Mapped[GuestBook] = relationship(back_populates="status") def __init__(self, voucher_id, food_table_id, guest_book_id, status, id_=None): self.voucher_id = voucher_id diff --git a/barker/barker/models/permission.py b/barker/barker/models/permission.py index 2ccdb74..8eabb23 100644 --- a/barker/barker/models/permission.py +++ b/barker/barker/models/permission.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -20,8 +20,9 @@ class Permission: id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, server_default=text("gen_random_uuid()")) name: Mapped[str] = mapped_column(Text, unique=True, nullable=False) - roles: Mapped[List["Role"]] = relationship( - secondary=RolePermission.__table__, back_populates="permissions" # type: ignore[attr-defined] + roles: Mapped[list["Role"]] = relationship( + secondary=RolePermission.__table__, + back_populates="permissions", # type: ignore[attr-defined] ) def __init__(self, name=None, id_=None): diff --git a/barker/barker/models/product.py b/barker/barker/models/product.py index aab3559..a95dac3 100644 --- a/barker/barker/models/product.py +++ b/barker/barker/models/product.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -19,9 +19,9 @@ if TYPE_CHECKING: class Product: __tablename__ = "products" id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, server_default=text("gen_random_uuid()")) - versions: Mapped[List["ProductVersion"]] = relationship(back_populates="product") - inventories: Mapped[List["Inventory"]] = relationship(back_populates="product") - modifier_categories: Mapped[List["ModifierCategory"]] = relationship( + versions: Mapped[list["ProductVersion"]] = relationship(back_populates="product") + inventories: Mapped[list["Inventory"]] = relationship(back_populates="product") + modifier_categories: Mapped[list["ModifierCategory"]] = relationship( "ModifierCategory", secondary=ModifierCategoryProduct.__table__, # type: ignore[attr-defined] order_by="ModifierCategory.sort_order", diff --git a/barker/barker/models/regime.py b/barker/barker/models/regime.py index f16eb91..244094d 100644 --- a/barker/barker/models/regime.py +++ b/barker/barker/models/regime.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, Integer, Text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -21,8 +21,8 @@ class Regime: prefix: Mapped[str] = mapped_column(Text, nullable=False, unique=True) is_fixture: Mapped[bool] = mapped_column(Boolean, nullable=False) - taxes: Mapped[List["Tax"]] = relationship(back_populates="regime") - bills: Mapped[List["Bill"]] = relationship(back_populates="regime") + taxes: Mapped[list["Tax"]] = relationship(back_populates="regime") + bills: Mapped[list["Bill"]] = relationship(back_populates="regime") def __init__(self, id=None, name=None, header=None, prefix=None, is_fixture=False, id_=None): self.id = id diff --git a/barker/barker/models/reprint.py b/barker/barker/models/reprint.py index 79f3a7e..5cc15e5 100644 --- a/barker/barker/models/reprint.py +++ b/barker/barker/models/reprint.py @@ -1,6 +1,6 @@ import uuid -from datetime import datetime +from datetime import UTC, datetime from typing import TYPE_CHECKING from sqlalchemy import DateTime, ForeignKey, Uuid, text @@ -33,6 +33,6 @@ class Reprint: def __init__(self, voucher_id=None, user_id=None, id_=None): self.id = id_ - self.date = datetime.utcnow() + self.date = datetime.now(UTC).replace(tzinfo=None) self.voucher_id = voucher_id self.user_id = user_id diff --git a/barker/barker/models/role.py b/barker/barker/models/role.py index 443dff6..3ecb6d1 100644 --- a/barker/barker/models/role.py +++ b/barker/barker/models/role.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -20,8 +20,10 @@ class Role: id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, server_default=text("gen_random_uuid()")) name: Mapped[str] = mapped_column(Text, unique=True, nullable=False) - permissions: Mapped[List["Permission"]] = relationship( - "Permission", secondary=RolePermission.__table__, back_populates="roles" # type: ignore[attr-defined] + permissions: Mapped[list["Permission"]] = relationship( + "Permission", + secondary=RolePermission.__table__, # type: ignore[attr-defined] + back_populates="roles", ) def __init__(self, name=None, id_=None): diff --git a/barker/barker/models/sale_category.py b/barker/barker/models/sale_category.py index 8d01c83..c48187b 100644 --- a/barker/barker/models/sale_category.py +++ b/barker/barker/models/sale_category.py @@ -1,7 +1,7 @@ import uuid from decimal import Decimal -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, Numeric, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -24,7 +24,7 @@ class SaleCategory: tax_id: Mapped[uuid.UUID] = mapped_column(Uuid, ForeignKey("taxes.id"), nullable=False) tax: Mapped["Tax"] = relationship(back_populates="sale_categories") - products: Mapped[List["ProductVersion"]] = relationship(back_populates="sale_category") + products: Mapped[list["ProductVersion"]] = relationship(back_populates="sale_category") def __init__(self, name, discount_limit=None, tax_id=False, id_=None): self.name = name diff --git a/barker/barker/models/section.py b/barker/barker/models/section.py index 25f27b5..05bda2e 100644 --- a/barker/barker/models/section.py +++ b/barker/barker/models/section.py @@ -1,6 +1,6 @@ import uuid -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -20,7 +20,7 @@ class Section: name: Mapped[str] = mapped_column(Text, unique=True, nullable=False) is_fixture: Mapped[bool] = mapped_column(Boolean, nullable=False, insert_default=False) - devices: Mapped[List["Device"]] = relationship(back_populates="section") + devices: Mapped[list["Device"]] = relationship(back_populates="section") def __init__(self, name=None, is_fixture=None, id_=None): self.id = id_ diff --git a/barker/barker/models/tax.py b/barker/barker/models/tax.py index 9344d08..769cadd 100644 --- a/barker/barker/models/tax.py +++ b/barker/barker/models/tax.py @@ -1,7 +1,7 @@ import uuid from decimal import Decimal -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, ForeignKey, Integer, Numeric, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -25,8 +25,8 @@ class Tax: regime_id: Mapped[int] = mapped_column(Integer, ForeignKey("regimes.id"), nullable=False) is_fixture: Mapped[bool] = mapped_column(Boolean, nullable=False) - sale_categories: Mapped[List["SaleCategory"]] = relationship(back_populates="tax") - inventories: Mapped[List["Inventory"]] = relationship(back_populates="tax") + sale_categories: Mapped[list["SaleCategory"]] = relationship(back_populates="tax") + inventories: Mapped[list["Inventory"]] = relationship(back_populates="tax") regime: Mapped["Regime"] = relationship(back_populates="taxes") def __init__(self, name=None, rate=None, regime_id=None, is_fixture=False, id_=None): diff --git a/barker/barker/models/tzinfoutc.py b/barker/barker/models/tzinfoutc.py deleted file mode 100644 index b993e59..0000000 --- a/barker/barker/models/tzinfoutc.py +++ /dev/null @@ -1,47 +0,0 @@ -from datetime import datetime, timedelta, tzinfo - - -ZERO = timedelta(0) -HOUR = timedelta(hours=1) - - -# A UTC class. - - -class UTC(tzinfo): - """UTC""" - - def utcoffset(self, dt): - return ZERO - - def tzname(self, dt): - return "UTC" - - def dst(self, dt): - return ZERO - - -utc = UTC() - - -def get_age(old_date, now=None): - def is_naive(date): - return date.tzinfo is None or date.tzinfo.utcoffset(date) is None - - if now is None: - now = datetime.utcnow().replace(tzinfo=utc) - if is_naive(old_date) == is_naive(now): - pass - elif is_naive(old_date): - old_date = old_date.replace(tzinfo=utc) - else: - now = now.replace(tzinfo=utc) - - delta = now - old_date - if delta.days > 0: - return "{0} days".format(delta.days) - if delta.seconds > 3600: - return "{0} hours".format(delta.seconds // 3600) - if delta.seconds > 60: - return "{0} minutes".format(delta.seconds // 60) - return "{0} seconds".format(delta.seconds) diff --git a/barker/barker/models/user.py b/barker/barker/models/user.py index d8e1a4a..8d8badf 100644 --- a/barker/barker/models/user.py +++ b/barker/barker/models/user.py @@ -1,7 +1,9 @@ +from __future__ import annotations + import uuid from hashlib import md5 -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy import Boolean, Index, Text, Uuid, desc, func, select, text from sqlalchemy.ext.hybrid import hybrid_property @@ -24,10 +26,12 @@ class User: _password: Mapped[str] = mapped_column("password", Text, nullable=False) locked_out: Mapped[bool] = mapped_column(Boolean, nullable=False) - roles: Mapped[List["Role"]] = relationship( - "Role", secondary=UserRole.__table__, order_by="Role.name" # type: ignore[attr-defined] + roles: Mapped[list[Role]] = relationship( + "Role", + secondary=UserRole.__table__, + order_by="Role.name", # type: ignore[attr-defined] ) - login_history: Mapped[List["LoginHistory"]] = relationship(order_by=desc(LoginHistory.date), back_populates="user") + login_history: Mapped[list[LoginHistory]] = relationship(order_by=desc(LoginHistory.date), back_populates="user") Index("uq_users_name", func.lower(name), unique=True) @@ -46,7 +50,7 @@ class User: self.id = id_ @classmethod - def auth(cls, name: str, password: str, db: Session): + def auth(cls, name: str, password: str, db: Session) -> User | None: if password is None: return None user = db.execute(select(User).where(User.name.ilike(name))).scalars().one_or_none() @@ -59,4 +63,4 @@ class User: def encrypt(val): - return md5(val.encode("utf-8") + "v2".encode("utf-8")).hexdigest() + return md5(val.encode("utf-8") + b"v2").hexdigest() diff --git a/barker/barker/models/voucher.py b/barker/barker/models/voucher.py index 22e4ff5..d5916cd 100644 --- a/barker/barker/models/voucher.py +++ b/barker/barker/models/voucher.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from typing import TYPE_CHECKING, List, Optional +from typing import TYPE_CHECKING, Optional from sqlalchemy import DateTime, Enum, ForeignKey, Integer, Text, Uuid, text from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -46,20 +46,20 @@ class Voucher: food_table: Mapped["FoodTable"] = relationship(backref="vouchers") customer: Mapped["Customer"] = relationship(backref="vouchers") - bills: Mapped[List["Bill"]] = relationship( + bills: Mapped[list["Bill"]] = relationship( back_populates="voucher", cascade="delete, delete-orphan", ) - kots: Mapped[List["Kot"]] = relationship( + kots: Mapped[list["Kot"]] = relationship( back_populates="voucher", cascade="delete, delete-orphan", order_by=Kot.code, ) - settlements: Mapped[List["Settlement"]] = relationship( + settlements: Mapped[list["Settlement"]] = relationship( back_populates="voucher", cascade="delete, delete-orphan", ) - reprints: Mapped[List["Reprint"]] = relationship( + reprints: Mapped[list["Reprint"]] = relationship( back_populates="voucher", cascade="delete, delete-orphan", ) diff --git a/barker/barker/printing/bill.py b/barker/barker/printing/bill.py index cbc7dbe..a6bfa86 100644 --- a/barker/barker/printing/bill.py +++ b/barker/barker/printing/bill.py @@ -5,7 +5,6 @@ import uuid from datetime import timedelta from decimal import Decimal -from typing import Dict, List, Tuple from arq import ArqRedis, create_pool from sqlalchemy import and_, or_, select @@ -36,7 +35,7 @@ def print_bill(voucher_id: uuid.UUID, db: Session): ).scalar_one() regimes = get_regimes(get_inventories(voucher), voucher.voucher_type, db) - bills: List[str] = [] + bills: list[str] = [] for regime_id, inventories in regimes: taxes_dict: dict[str, Decimal] = {} for i in inventories: @@ -63,7 +62,7 @@ def print_bill(voucher_id: uuid.UUID, db: Session): loop.close() -def get_inventories(voucher: Voucher) -> List[Inventory]: +def get_inventories(voucher: Voucher) -> list[Inventory]: items_dict: dict[tuple[uuid.UUID, bool, Decimal, frozenset[uuid.UUID]], Inventory] = {} for i in [i for k in voucher.kots for i in k.inventories]: key = ( @@ -89,14 +88,14 @@ def get_inventories(voucher: Voucher) -> List[Inventory]: def get_regimes( - inventories: List[Inventory], voucher_type: VoucherType, db: Session -) -> List[Tuple[int, List[Inventory]]]: + inventories: list[Inventory], voucher_type: VoucherType, db: Session +) -> list[tuple[int, list[Inventory]]]: if voucher_type != VoucherType.REGULAR_BILL: return [ (int(voucher_type), inventories), ] - items_dict: Dict[int, List[Inventory]] = {} + items_dict: dict[int, list[Inventory]] = {} for inv in inventories: key = inv.tax.regime_id @@ -106,7 +105,7 @@ def get_regimes( return list(items_dict.items()) -def get_tax_item(id_: uuid.UUID, tax_name: str, amount: Decimal, taxes: Dict[str, Decimal]) -> None: +def get_tax_item(id_: uuid.UUID, tax_name: str, amount: Decimal, taxes: dict[str, Decimal]) -> None: items = tax_name.split(";") if len(items) == 1: if tax_name not in taxes: @@ -126,8 +125,8 @@ def get_tax_item(id_: uuid.UUID, tax_name: str, amount: Decimal, taxes: Dict[str def design_bill( voucher: Voucher, regime_id: int, - inventories: List[Inventory], - taxes: List[Tuple[str, Decimal]], + inventories: list[Inventory], + taxes: list[tuple[str, Decimal]], db: Session, ) -> str: # Header @@ -208,7 +207,7 @@ def design_bill( def design_total( voucher: Voucher, - regimes: List[Tuple[int, List[Inventory]]], + regimes: list[tuple[int, list[Inventory]]], db: Session, ) -> str: # Header diff --git a/barker/barker/printing/product_sale_report.py b/barker/barker/printing/product_sale_report.py index 25571e8..6dfd24f 100644 --- a/barker/barker/printing/product_sale_report.py +++ b/barker/barker/printing/product_sale_report.py @@ -48,8 +48,6 @@ def design_product_sale_report(report): f"{item['regularBill']: >7.2f} " if "regularBill" in item else " " ) + (f"{item['noCharge']: >7.2f} " if "noCharge" in item else " ") + ( f"{item['staff']: >7.2f} " if "staff" in item else " " - ) + ( - f"{item['void']: >7.2f}" if "void" in item else " " - ) + ) + (f"{item['void']: >7.2f}" if "void" in item else " ") s += "\n\r" + "=" * 42 return s diff --git a/barker/barker/routers/__init__.py b/barker/barker/routers/__init__.py index f7d57e0..a5d16c3 100644 --- a/barker/barker/routers/__init__.py +++ b/barker/barker/routers/__init__.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, timedelta +from datetime import UTC, date, datetime, timedelta from barker.core.config import settings @@ -14,7 +14,8 @@ def optional_query_date(d: str | None = None) -> date | None: def effective_date(d: str | None = None) -> date: return ( ( - datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES - settings.NEW_DAY_OFFSET_MINUTES) + datetime.now(UTC).replace(tzinfo=None) + + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES - settings.NEW_DAY_OFFSET_MINUTES) ).date() if d is None else datetime.strptime(d, "%d-%b-%Y").date() diff --git a/barker/barker/routers/customer.py b/barker/barker/routers/customer.py index 1e13f02..ed14780 100644 --- a/barker/barker/routers/customer.py +++ b/barker/barker/routers/customer.py @@ -1,7 +1,7 @@ import uuid +from collections.abc import Sequence from decimal import Decimal -from typing import Sequence from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy import delete, or_, select diff --git a/barker/barker/routers/guest_book.py b/barker/barker/routers/guest_book.py index 9954294..84b8c32 100644 --- a/barker/barker/routers/guest_book.py +++ b/barker/barker/routers/guest_book.py @@ -1,6 +1,6 @@ import uuid -from datetime import date, datetime, timedelta +from datetime import UTC, date, datetime, timedelta from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy import and_, desc, func, or_, select @@ -131,10 +131,7 @@ def show_list( q: str | None = None, user: UserToken = Depends(get_user), ) -> schemas.GuestBookList: - if q is None or q == "": - d = date.today() - else: - d = datetime.strptime(q, "%d-%b-%Y") + d = date.today() if q is None or q == "" else datetime.strptime(q, "%d-%b-%Y") s = d + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES) f = d + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES, days=1) list_ = ( @@ -220,7 +217,7 @@ def guest_book_info(item: GuestBook) -> schemas.GuestBook: def blank_guest_book_info(type_: GuestBookStatus) -> schemas.GuestBookIn: - now = datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) + now = datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) booking_date = None if type_ != GuestBookStatus.booking else now arrival_date = None if type_ != GuestBookStatus.walk_in else now return schemas.GuestBookIn( diff --git a/barker/barker/routers/modifier_category.py b/barker/barker/routers/modifier_category.py index 2ef7956..af93ac0 100644 --- a/barker/barker/routers/modifier_category.py +++ b/barker/barker/routers/modifier_category.py @@ -238,7 +238,7 @@ def modifier_category_info(item: ModifierCategory, date_: date, db: Session) -> ProductLinkSchema( id_=p.product_id, name=p.name, - enabled=True if p.product_id in products else False, + enabled=p.product_id in products, ) for p in mc.products ], diff --git a/barker/barker/routers/reports/__init__.py b/barker/barker/routers/reports/__init__.py index f48eb80..5d091bf 100644 --- a/barker/barker/routers/reports/__init__.py +++ b/barker/barker/routers/reports/__init__.py @@ -1,12 +1,13 @@ -from datetime import date, datetime, timedelta +from datetime import UTC, date, datetime, timedelta + +from fastapi import HTTPException, status from barker.core.config import settings -from fastapi import HTTPException, status def report_start_date(s: str | None = None) -> date: return ( - (datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() + (datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() if s is None else datetime.strptime(s, "%d-%b-%Y").date() ) @@ -14,14 +15,14 @@ def report_start_date(s: str | None = None) -> date: def report_finish_date(f: str | None = None) -> date: return ( - (datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() + (datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() if f is None else datetime.strptime(f, "%d-%b-%Y").date() ) def check_audit_permission(start_date: date, user_permissions: list[str]): - today = (datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() + today = (datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() if (today - start_date).days > 5 and "audit" not in user_permissions: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, diff --git a/barker/barker/routers/reports/menu_engineering_report.py b/barker/barker/routers/reports/menu_engineering_report.py index ef31483..bea06be 100644 --- a/barker/barker/routers/reports/menu_engineering_report.py +++ b/barker/barker/routers/reports/menu_engineering_report.py @@ -2,7 +2,6 @@ import uuid from datetime import date, datetime, time, timedelta from decimal import Decimal -from typing import Dict from fastapi import APIRouter, Cookie, Depends, Security from sqlalchemy import func, nulls_last, or_, select @@ -101,8 +100,8 @@ def menu_engineering_report(s: date, f: date, db: Session): .order_by(SaleCategory.name, nulls_last(func.sum(Inventory.net).desc())) ).all() info: list[MeItem] = [] - sc_sales: Dict[str, Decimal] = {} - sc_quantity: Dict[str, Decimal] = {} + sc_sales: dict[str, Decimal] = {} + sc_quantity: dict[str, Decimal] = {} for sc, mc, id_, name, price, quantity, sales in list_: if sc not in sc_sales: sc_sales[sc] = Decimal(0) diff --git a/barker/barker/routers/role.py b/barker/barker/routers/role.py index 246622b..646febd 100644 --- a/barker/barker/routers/role.py +++ b/barker/barker/routers/role.py @@ -122,7 +122,7 @@ def role_info(item: Role, db: Session) -> schemas.Role: schemas.PermissionItem( id_=p.id, name=p.name, - enabled=True if p in item.permissions else False, + enabled=p in item.permissions, ) for p in db.execute(select(Permission).order_by(Permission.name)).scalars().all() ], diff --git a/barker/barker/routers/user.py b/barker/barker/routers/user.py index 28c82c7..24fb3ff 100644 --- a/barker/barker/routers/user.py +++ b/barker/barker/routers/user.py @@ -169,7 +169,7 @@ def user_info(item: User, db: Session, user: UserToken) -> schemas.User: schemas.RoleItem( id_=r.id, name=r.name, - enabled=True if r in item.roles else False, + enabled=r in item.roles, ) for r in db.execute(select(Role).order_by(Role.name)).scalars().all() ] diff --git a/barker/barker/routers/voucher/__init__.py b/barker/barker/routers/voucher/__init__.py index 73462cf..3034b2d 100644 --- a/barker/barker/routers/voucher/__init__.py +++ b/barker/barker/routers/voucher/__init__.py @@ -2,16 +2,16 @@ import uuid from datetime import datetime from decimal import Decimal -from typing import Set + +from fastapi import HTTPException, status +from sqlalchemy import func +from sqlalchemy.orm import Session +from sqlalchemy.sql import expression import barker.schemas.voucher as schemas from barker.models.guest_book_type import GuestBookType from barker.models.overview_status import OverviewStatus -from fastapi import HTTPException, status -from sqlalchemy import func -from sqlalchemy.orm import Session -from sqlalchemy.sql import expression from ...models.bill import Bill from ...models.guest_book import GuestBook @@ -129,8 +129,8 @@ def do_update_settlements(voucher: Voucher, others: list[SettleSchema], db: Sess def do_update_bill_numbers(voucher: Voucher, db: Session) -> bool: - regimes: Set[int] = set() - old_regimes: Set[int] = set() + regimes: set[int] = set() + old_regimes: set[int] = set() old_regimes = set( db.execute(expression.select(Bill.regime_id).where(Bill.voucher_id == voucher.id)).scalars().all() ) @@ -181,7 +181,4 @@ def happy_hour_items_more_than_regular(kots: list[schemas.Kot]) -> bool: inventories[inventory.product.id_]["happy"] += inventory.quantity else: inventories[inventory.product.id_]["normal"] += inventory.quantity - for value in inventories.values(): - if value["happy"] > value["normal"]: - return True - return False + return any(value["happy"] > value["normal"] for value in inventories.values()) diff --git a/barker/barker/routers/voucher/merge_move.py b/barker/barker/routers/voucher/merge_move.py index bfc7dc1..467fedd 100644 --- a/barker/barker/routers/voucher/merge_move.py +++ b/barker/barker/routers/voucher/merge_move.py @@ -1,7 +1,7 @@ import traceback import uuid -from datetime import datetime +from datetime import UTC, datetime from fastapi import APIRouter, HTTPException, Security, status from sqlalchemy import delete, func, select, update @@ -79,7 +79,7 @@ def move_kot( ): try: with SessionFuture() as db: - now = datetime.utcnow() + now = datetime.now(UTC).replace(tzinfo=None) check_if_voucher_is_unprinted(data.voucher_id, db) kots: int = db.execute(select(func.count(Kot.id)).where(Kot.voucher_id == data.voucher_id)).scalar_one() if kots <= 1: diff --git a/barker/barker/routers/voucher/save.py b/barker/barker/routers/voucher/save.py index 46681fa..f25d6b0 100644 --- a/barker/barker/routers/voucher/save.py +++ b/barker/barker/routers/voucher/save.py @@ -1,7 +1,7 @@ import traceback import uuid -from datetime import datetime, timedelta +from datetime import UTC, datetime, timedelta from decimal import Decimal from fastapi import APIRouter, HTTPException, Security, status @@ -78,7 +78,7 @@ def do_save( db: Session, user: UserToken, ): - now = datetime.utcnow() + now = datetime.now(UTC).replace(tzinfo=None) product_date = (now + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES - settings.NEW_DAY_OFFSET_MINUTES)).date() check_permissions(None, voucher_type, user.permissions) @@ -143,13 +143,11 @@ def do_save( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=f"Quantity of {product.full_name} cannot be less than 0", ) - if round(i.quantity, 2) < 0: - if "edit-printed-product" not in user.permissions: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"You are not allowed to delete printed products." - f"\n In this case {product.full_name}", - ) + if round(i.quantity, 2) < 0 and "edit-printed-product" not in user.permissions: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=f"You are not allowed to delete printed products." f"\n In this case {product.full_name}", + ) tax_rate = get_tax(product.sale_category.tax.rate, voucher_type) inv = Inventory( kot.id, diff --git a/barker/barker/routers/voucher/split.py b/barker/barker/routers/voucher/split.py index bbe287e..1b1bdda 100644 --- a/barker/barker/routers/voucher/split.py +++ b/barker/barker/routers/voucher/split.py @@ -1,7 +1,7 @@ import uuid from collections import defaultdict -from datetime import datetime +from datetime import UTC, datetime from decimal import Decimal from fastapi import APIRouter, HTTPException, Security, status @@ -42,7 +42,7 @@ def split( ): try: with SessionFuture() as db: - now = datetime.utcnow() + now = datetime.now(UTC).replace(tzinfo=None) update_table = u item: Voucher = db.execute(select(Voucher).where(Voucher.id == id_)).scalar_one() original_voucher_type = item.voucher_type @@ -174,10 +174,7 @@ def are_product_quantities_positive(inventories: list[Inventory]) -> bool: for i in inventories: key = (i.product_id, i.is_happy_hour) quantities[key] += i.quantity - for j in quantities.values(): - if j < 0: - return False - return True + return all(j >= 0 for j in quantities.values()) def happy_hour_items_more_than_regular(invs: list[Inventory]) -> bool: @@ -189,7 +186,4 @@ def happy_hour_items_more_than_regular(invs: list[Inventory]) -> bool: inventories[inventory.product_id]["happy"] += inventory.quantity else: inventories[inventory.product_id]["normal"] += inventory.quantity - for value in inventories.values(): - if value["happy"] > value["normal"]: - return True - return False + return any(value["happy"] > value["normal"] for value in inventories.values()) diff --git a/barker/barker/routers/voucher/update.py b/barker/barker/routers/voucher/update.py index 9f5de4f..3f2db9a 100644 --- a/barker/barker/routers/voucher/update.py +++ b/barker/barker/routers/voucher/update.py @@ -1,6 +1,6 @@ import uuid -from datetime import datetime, timedelta +from datetime import UTC, datetime, timedelta from decimal import Decimal from fastapi import APIRouter, HTTPException, Security, status @@ -48,7 +48,7 @@ def update_route( ): try: with SessionFuture() as db: - now = datetime.utcnow() + now = datetime.now(UTC).replace(tzinfo=None) product_date = ( now + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES - settings.NEW_DAY_OFFSET_MINUTES) ).date() diff --git a/barker/gunicorn.conf.py b/barker/gunicorn.conf.py index 583553f..e8f07c0 100644 --- a/barker/gunicorn.conf.py +++ b/barker/gunicorn.conf.py @@ -14,10 +14,7 @@ host = os.getenv("HOST", "0.0.0.0") port = os.getenv("PORT", "9995") bind_env = os.getenv("BIND", None) use_loglevel = os.getenv("LOG_LEVEL", "info") -if bind_env: - use_bind = bind_env -else: - use_bind = f"{host}:{port}" +use_bind = bind_env if bind_env else f"{host}:{port}" cores = multiprocessing.cpu_count() workers_per_core = float(workers_per_core_str) diff --git a/barker/pyproject.toml b/barker/pyproject.toml index aa1be03..539c954 100644 --- a/barker/pyproject.toml +++ b/barker/pyproject.toml @@ -5,87 +5,112 @@ description = "Point of Sale for a restaurant" authors = ["tanshu "] [tool.poetry.dependencies] -python = "^3.11" -uvicorn = {extras = ["standard"], version = "^0.21.1"} -fastapi = {extras = ["all"], version = "^0.103.0"} +python = "^3.12" +uvicorn = {extras = ["standard"], version = "^0.30.0"} +fastapi = {extras = ["all"], version = "^0.111.0"} python-jose = {extras = ["cryptography"], version = "^3.3.0"} passlib = {extras = ["bcrypt"], version = "^1.7.4"} -psycopg2-binary = "^2.9.7" -SQLAlchemy = "^2.0.20" -python-multipart = "^0.0.6" +psycopg = {extras = ["binary", "pool"], version = "^3.1.19"} +SQLAlchemy = "^2.0.30" +python-multipart = "^0.0.9" PyJWT = "^2.8.0" -alembic = "^1.11.3" -itsdangerous = "^2.1.2" -python-dotenv = "^1.0.0" -pydantic = {extras = ["dotenv"], version = "^2.3.0"} -starlette = "^0.27.0" -arq = "^0.25.0" -aiohttp = "^3.8.5" -cryptography = "^41.0.3" -gunicorn = "^21.2.0" +alembic = "^1.13.1" +itsdangerous = "^2.2.0" +python-dotenv = "^1.0.1" +pydantic = {extras = ["dotenv"], version = "^2.7.2"} +arq = "^0.26.0" +aiohttp = "^3.9.5" +cryptography = "^42.0.7" +gunicorn = "^22.0.0" [tool.poetry.group.dev.dependencies] -# flake8 = "^6.1.0" -black = "^23.7.0" -# isort = {extras = ["toml"], version = "^5.12.0"} -pre-commit = "^3.3.3" -mypy = "^1.5.1" -types-python-jose = "^3.3.4.8" -tomli = "^2.0.1" -ruff = "^0.0.286" +pre-commit = "^3.7.1" +mypy = "^1.10.0" +types-python-jose = "^3.3.4.20240106" +ruff = "^0.4.6" +bandit = "^1.7.8" +# safety = "^3.2.0" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.ruff] -# Assume Python 3.11. -target-version = "py311" line-length = 120 +# Assume Python 3.12. +target-version = "py312" exclude = [ + ".eggs", ".git", - "__pycache__", - "__init__.py", + ".hg", ".mypy_cache", - ".pytest_cache", + ".tox", + ".venv", + "_build", + "buck-out", + "build", ] -ignore = [] + +[tool.ruff.lint] +# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. +# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or +# McCabe complexity (`C901`) by default. +# select = ["E4", "E7", "E9", "F"] select = [ + # pycodestyle + "E", # Pyflakes "F", - # Pycodestyle - "E", - "W", + # pyupgrade + "UP", + # flake8-bugbear + # "B", + # flake8-simplify + "SIM", # isort - "I001" + "I", ] +ignore = ["E203", "E501"] -# Note: Ruff supports a top-level `src` option in lieu of isort's `src_paths` setting. -# src = ["barker"] -# Only allow autofix behavior for `E` and `F` rules. -fixable = ["I"] +# Allow fix for all enabled rules (when `--fix`) is provided. +fixable = ["ALL"] -[tool.ruff.isort] +# Avoid trying to fix flake8-bugbear (`B`) violations. +unfixable = ["B", "F401"] + +[tool.ruff.lint.isort] # include-trailing-comma = true lines-after-imports = 2 lines-between-types = 1 # use-parentheses = true -[tool.black] -line-length = 120 -include = '\.pyi?$' -exclude = ''' -/( - \.eggs - | \.git - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | _build - | buck-out - | build - | dist - | tests/.*/setup.py -)/ -''' +[tool.ruff.format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" + +[tool.mypy] +# --strict +disallow_any_generics = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_defs = true +disallow_incomplete_defs = true +check_untyped_defs = true +disallow_untyped_decorators = true +no_implicit_optional = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_return_any = true +warn_unused_configs = true +strict_equality = true +plugins = ["sqlalchemy.ext.mypy.plugin"] +# --strict end diff --git a/bookie/.eslintrc.json b/bookie/.eslintrc.json index 52b87c8..c50a03c 100644 --- a/bookie/.eslintrc.json +++ b/bookie/.eslintrc.json @@ -8,6 +8,9 @@ "files": [ "*.ts" ], + "parserOptions": { + "project": ["tsconfig.(app|spec).json"] + }, "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", @@ -17,7 +20,8 @@ ], "plugins": [ "import", - "unused-imports" + "unused-imports", + "deprecation" ], "rules": { "@angular-eslint/directive-selector": [ @@ -57,7 +61,8 @@ "error" ], "unused-imports/no-unused-imports": "error", - "@typescript-eslint/no-empty-function": "off" + "@typescript-eslint/no-empty-function": "off", + "deprecation/deprecation": "warn" } }, { diff --git a/bookie/.gitignore b/bookie/.gitignore index b9d2d8c..68aec83 100644 --- a/bookie/.gitignore +++ b/bookie/.gitignore @@ -1,8 +1,5 @@ # See http://help.github.com/ignore-files/ for more about ignoring files. -# package-lock -package-lock.json - # compiled output /dist /tmp @@ -13,6 +10,7 @@ package-lock.json /node_modules npm-debug.log yarn-error.log +package-lock.json # profiling files chrome-profiler-events*.json diff --git a/bookie/angular.json b/bookie/angular.json index a30da05..6984740 100644 --- a/bookie/angular.json +++ b/bookie/angular.json @@ -6,8 +6,10 @@ "bookie": { "projectType": "application", "schematics": { + "@schematics/angular:component": { + "style": "sass" + }, "@schematics/angular:application": { - "style": "sass", "strict": true } }, @@ -16,11 +18,12 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { - "outputPath": "../frontend", + "outputPath": { + "base": "../frontend" + }, "index": "src/index.html", - "main": "src/main.ts", "polyfills": [ "zone.js" ], @@ -34,7 +37,8 @@ "@angular/material/prebuilt-themes/indigo-pink.css", "src/styles.sass" ], - "scripts": [] + "scripts": [], + "browser": "src/main.ts" }, "configurations": { "production": { @@ -50,18 +54,10 @@ "maximumError": "6kb" } ], - "outputHashing": "all", - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ] + "outputHashing": "all" }, "development": { - "buildOptimizer": false, "optimization": false, - "vendorChunk": true, "extractLicenses": false, "sourceMap": true, "namedChunks": true @@ -72,15 +68,14 @@ "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "bookie:build", "proxyConfig": "proxy.conf.json" }, "configurations": { "production": { - "browserTarget": "bookie:build:production" + "buildTarget": "bookie:build:production" }, "development": { - "browserTarget": "bookie:build:development" + "buildTarget": "bookie:build:development" } }, "defaultConfiguration": "development" @@ -88,7 +83,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "bookie:build" + "buildTarget": "bookie:build" } }, "test": { @@ -127,6 +122,6 @@ "schematicCollections": [ "@angular-eslint/schematics" ], - "analytics": "2ed8d47e-2b1e-41cb-b290-47ac8bbe6e16" + "analytics": false } } diff --git a/bookie/package.json b/bookie/package.json index faf8044..b6f669d 100644 --- a/bookie/package.json +++ b/bookie/package.json @@ -13,54 +13,55 @@ }, "private": true, "dependencies": { - "@angular/animations": "^16.1.6", - "@angular/cdk": "^16.1.5", - "@angular/common": "^16.1.6", - "@angular/compiler": "^16.1.6", - "@angular/core": "^16.1.6", - "@angular/forms": "^16.1.6", - "@angular/material": "^16.1.5", - "@angular/material-moment-adapter": "^16.1.5", - "@angular/platform-browser": "^16.1.6", - "@angular/platform-browser-dynamic": "^16.1.6", - "@angular/router": "^16.1.6", - "mathjs": "^11.9.0", - "moment": "^2.29.4", + "@angular/animations": "^18.0.1", + "@angular/cdk": "^18.0.1", + "@angular/common": "^18.0.1", + "@angular/compiler": "^18.0.1", + "@angular/core": "^18.0.1", + "@angular/forms": "^18.0.1", + "@angular/material": "^18.0.1", + "@angular/material-moment-adapter": "^18.0.1", + "@angular/platform-browser": "^18.0.1", + "@angular/platform-browser-dynamic": "^18.0.1", + "@angular/router": "^18.0.1", + "mathjs": "^13.0.0", + "moment": "^2.30.1", "rxjs": "~7.8.0", "tslib": "^2.6.0", - "zone.js": "^0.13.1" + "zone.js": "^0.14.6" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.1.5", - "@angular-eslint/builder": "^16.1.0", - "@angular-eslint/eslint-plugin": "^16.1.0", - "@angular-eslint/eslint-plugin-template": "^16.1.0", - "@angular-eslint/schematics": "^16.1.0", - "@angular-eslint/template-parser": "^16.1.0", - "@angular/cli": "^16.1.5", - "@angular/compiler-cli": "^16.1.6", - "@types/jasmine": "~4.3.5", - "@typescript-eslint/eslint-plugin": "^6.1.0", - "@typescript-eslint/parser": "^6.1.0", + "@angular-devkit/build-angular": "^18.0.2", + "@angular-eslint/builder": "^18.0.1", + "@angular-eslint/eslint-plugin": "^18.0.1", + "@angular-eslint/eslint-plugin-template": "^18.0.1", + "@angular-eslint/schematics": "^18.0.1", + "@angular-eslint/template-parser": "^18.0.1", + "@angular/cli": "^18.0.2", + "@angular/compiler-cli": "^18.0.1", + "@types/jasmine": "~4.3.6", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", "autoprefixer": "^10.4.13", - "eslint": "^8.39.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-unused-imports": "^3.0.0", - "husky": "^8.0.3", - "jasmine-core": "5.0.1", + "eslint": "^8.57.0", + "eslint-config-prettier": "^8.10.0", + "eslint-plugin-deprecation": "^3.0.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-unused-imports": "^3.2.0", + "husky": "^9.0.11", + "jasmine-core": "5.1.2", "jasmine-spec-reporter": "^7.0.0", - "karma": "^6.4.2", + "karma": "^6.4.3", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "^2.2.1", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", - "lint-staged": "^13.2.3", + "lint-staged": "^15.2.5", "postcss": "^8.4.27", - "prettier": "^3.0.0", + "prettier": "^3.3.0", "standard-version": "^9.5.0", - "tailwindcss": "^3.3.3", - "typescript": "~5.1.3" + "tailwindcss": "^3.4.3", + "typescript": "~5.4.5" }, "husky": { "hooks": { diff --git a/bookie/src/app/app-routing.module.ts b/bookie/src/app/app-routing.module.ts deleted file mode 100644 index 52c2f92..0000000 --- a/bookie/src/app/app-routing.module.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { LoginComponent } from './auth/login/login.component'; -import { LogoutComponent } from './auth/logout/logout.component'; -import { HomeComponent } from './home/home.component'; - -const routes: Routes = [ - { - path: 'beer-sale-report', - loadChildren: () => import('./beer-sale-report/beer-sale-report.module').then((mod) => mod.BeerSaleReportModule), - }, - { - path: 'bill-settlement-report', - loadChildren: () => - import('./bill-settlement-report/bill-settlement-report.module').then((mod) => mod.BillSettlementReportModule), - }, - { - path: 'cashier-report', - loadChildren: () => import('./cashier-report/cashier-report.module').then((mod) => mod.CashierReportModule), - }, - { - path: 'customers', - loadChildren: () => import('./customers/customer.module').then((mod) => mod.CustomerModule), - }, - { - path: 'devices', - loadChildren: () => import('./devices/devices.module').then((mod) => mod.DevicesModule), - }, - { - path: 'discount-report', - loadChildren: () => import('./discount-report/discount-report.module').then((mod) => mod.DiscountReportModule), - }, - { - path: 'guest-book', - loadChildren: () => import('./guest-book/guest-book.module').then((mod) => mod.GuestBookModule), - }, - { - path: 'header-footer', - loadChildren: () => import('./header-footer/header-footer.module').then((mod) => mod.HeaderFooterModule), - }, - { - path: 'menu-engineering-report', - loadChildren: () => - import('./menu-engineering-report/menu-engineering-report.module').then((mod) => mod.MenuEngineeringReportModule), - }, - { - path: 'modifiers', - loadChildren: () => import('./modifiers/modifiers.module').then((mod) => mod.ModifiersModule), - }, - { - path: 'modifier-categories', - loadChildren: () => - import('./modifier-categories/modifier-categories.module').then((mod) => mod.ModifierCategoriesModule), - }, - { - path: 'regimes', - loadChildren: () => import('./regimes/regimes.module').then((mod) => mod.RegimesModule), - }, - { - path: 'printers', - loadChildren: () => import('./printers/printers.module').then((mod) => mod.PrintersModule), - }, - { - path: 'products', - loadChildren: () => import('./product/products.module').then((mod) => mod.ProductsModule), - }, - { - path: 'product-sale-report', - loadChildren: () => - import('./product-sale-report/product-sale-report.module').then((mod) => mod.ProductSaleReportModule), - }, - { - path: 'product-updates-report', - loadChildren: () => - import('./product-updates-report/product-updates-report.module').then((mod) => mod.ProductUpdatesReportModule), - }, - { - path: 'menu-categories', - loadChildren: () => import('./menu-category/menu-categories.module').then((mod) => mod.MenuCategoriesModule), - }, - { - path: 'roles', - loadChildren: () => import('./roles/roles.module').then((mod) => mod.RolesModule), - }, - { - path: 'sales', - loadChildren: () => import('./sales/sales.module').then((mod) => mod.SalesModule), - }, - { - path: 'sale-report', - loadChildren: () => import('./sale-report/sale-report.module').then((mod) => mod.SaleReportModule), - }, - { - path: 'sale-categories', - loadChildren: () => import('./sale-category/sale-categories.module').then((mod) => mod.SaleCategoriesModule), - }, - { - path: 'sections', - loadChildren: () => import('./sections/sections.module').then((mod) => mod.SectionsModule), - }, - { - path: 'section-printers', - loadChildren: () => import('./section-printers/section-printers.module').then((mod) => mod.SectionPrintersModule), - }, - { - path: 'settings', - loadChildren: () => import('./settings/settings.module').then((mod) => mod.SettingsModule), - }, - { - path: 'settle-options', - loadChildren: () => import('./settle-option/settle-options.module').then((mod) => mod.SettleOptionsModule), - }, - { - path: 'tables', - loadChildren: () => import('./tables/tables.module').then((mod) => mod.TableModule), - }, - { - path: 'taxes', - loadChildren: () => import('./taxes/taxes.module').then((mod) => mod.TaxesModule), - }, - { - path: 'tax-report', - loadChildren: () => import('./tax-report/tax-report.module').then((mod) => mod.TaxReportModule), - }, - { - path: 'temporal-products', - loadChildren: () => import('./temporal-product/temporal-products.module').then((mod) => mod.TemporalProductsModule), - }, - { - path: 'update-product-prices', - loadChildren: () => - import('./update-product-prices/update-product-prices.module').then((mod) => mod.UpdateProductPricesModule), - }, - { - path: 'users', - loadChildren: () => import('./users/users.module').then((mod) => mod.UsersModule), - }, - { path: 'login', component: LoginComponent }, - { path: 'logout', component: LogoutComponent }, - { path: '', component: HomeComponent }, -]; -@NgModule({ - imports: [ - RouterModule.forRoot(routes, { - onSameUrlNavigation: 'reload', - }), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/bookie/src/app/app.component.ts b/bookie/src/app/app.component.ts index 9d2cb84..b0de256 100644 --- a/bookie/src/app/app.component.ts +++ b/bookie/src/app/app.component.ts @@ -1,9 +1,14 @@ import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +import { NavBarComponent } from './nav-bar/nav-bar.component'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], + standalone: true, + imports: [NavBarComponent, RouterOutlet], }) export class AppComponent { title = 'bookie'; diff --git a/bookie/src/app/app.config.ts b/bookie/src/app/app.config.ts new file mode 100644 index 0000000..3508c64 --- /dev/null +++ b/bookie/src/app/app.config.ts @@ -0,0 +1,66 @@ +import { LayoutModule } from '@angular/cdk/layout'; +import { provideHttpClient, withInterceptors } from '@angular/common/http'; +import { ApplicationConfig, LOCALE_ID, importProvidersFrom } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; +import { BrowserModule } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { provideRouter, withRouterConfig } from '@angular/router'; + +import { dateFormat } from './app.environment'; +import { routes } from './app.routes'; +import { AuthService } from './auth/auth.service'; +import { authInterceptor } from './core/auth.interceptor'; +import { jwtInterceptor } from './core/jwt.interceptor'; +import { refreshInterceptor } from './core/refresh.interceptor'; + +export const appConfig: ApplicationConfig = { + providers: [ + importProvidersFrom( + BrowserModule, + MatButtonModule, + MatCardModule, + MatDialogModule, + MatDividerModule, + MatFormFieldModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatSnackBarModule, + MatToolbarModule, + LayoutModule, + ReactiveFormsModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + ), + { provide: LOCALE_ID, useValue: 'en-IN' }, + AuthService, + provideHttpClient(withInterceptors([refreshInterceptor, jwtInterceptor, authInterceptor])), + provideAnimations(), + provideRouter( + routes, + withRouterConfig({ + onSameUrlNavigation: 'reload', + }), + ), + { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, + { provide: MAT_DATE_FORMATS, useValue: dateFormat }, + ], +}; diff --git a/bookie/src/app/app.environment.ts b/bookie/src/app/app.environment.ts new file mode 100644 index 0000000..7d6a1c5 --- /dev/null +++ b/bookie/src/app/app.environment.ts @@ -0,0 +1,17 @@ +export const environment = { + production: true, + ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry + version: '11.7.0', +}; + +export const dateFormat = { + parse: { + dateInput: 'DD-MMM-YYYY', + }, + display: { + dateInput: 'DD-MMM-YYYY', + monthYearLabel: 'MMM YYYY', + dateA11yLabel: 'DD-MMM-YYYY', + monthYearA11yLabel: 'MMM YYYY', + }, +}; diff --git a/bookie/src/app/app.module.ts b/bookie/src/app/app.module.ts deleted file mode 100644 index 20f028c..0000000 --- a/bookie/src/app/app.module.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { LayoutModule } from '@angular/cdk/layout'; -import { registerLocaleData } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import enIN from '@angular/common/locales/en-IN'; -import { LOCALE_ID, NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatGridListModule } from '@angular/material/grid-list'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { LoginComponent } from './auth/login/login.component'; -import { LogoutComponent } from './auth/logout/logout.component'; -import { CoreModule } from './core/core.module'; -import { HomeComponent } from './home/home.component'; -import { NavBarComponent } from './nav-bar/nav-bar.component'; -import { SharedModule } from './shared/shared.module'; - -registerLocaleData(enIN); - -@NgModule({ - declarations: [AppComponent, LoginComponent, LogoutComponent, HomeComponent, NavBarComponent], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - HttpClientModule, - MatButtonModule, - MatCardModule, - MatDialogModule, - MatDividerModule, - MatFormFieldModule, - MatGridListModule, - MatIconModule, - MatInputModule, - MatMenuModule, - MatSnackBarModule, - MatToolbarModule, - LayoutModule, - ReactiveFormsModule, - CoreModule, - SharedModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - ], - providers: [{ provide: LOCALE_ID, useValue: 'en-IN' }], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/bookie/src/app/app.routes.ts b/bookie/src/app/app.routes.ts new file mode 100644 index 0000000..1492a44 --- /dev/null +++ b/bookie/src/app/app.routes.ts @@ -0,0 +1,135 @@ +import { Routes } from '@angular/router'; + +import { LoginComponent } from './auth/login/login.component'; +import { LogoutComponent } from './auth/logout/logout.component'; +import { HomeComponent } from './home/home.component'; + +export const routes: Routes = [ + { + path: 'beer-sale-report', + loadChildren: () => import('./beer-sale-report/beer-sale-report.routes').then((mod) => mod.routes), + }, + { + path: 'bill-settlement-report', + loadChildren: () => import('./bill-settlement-report/bill-settlement-report.routes').then((mod) => mod.routes), + }, + { + path: 'cashier-report', + loadChildren: () => import('./cashier-report/cashier-report.routes').then((mod) => mod.routes), + }, + { + path: 'customers', + loadChildren: () => import('./customers/customer.routes').then((mod) => mod.routes), + }, + { + path: 'devices', + loadChildren: () => import('./devices/devices.routes').then((mod) => mod.routes), + }, + { + path: 'discount-report', + loadChildren: () => import('./discount-report/discount-report.routes').then((mod) => mod.routes), + }, + { + path: 'guest-book', + loadChildren: () => import('./guest-book/guest-book.routes').then((mod) => mod.routes), + }, + { + path: 'header-footer', + loadChildren: () => import('./header-footer/header-footer.routes').then((mod) => mod.routes), + }, + { + path: 'menu-engineering-report', + loadChildren: () => import('./menu-engineering-report/menu-engineering-report.routes').then((mod) => mod.routes), + }, + { + path: 'modifiers', + loadChildren: () => import('./modifiers/modifiers.routes').then((mod) => mod.routes), + }, + { + path: 'modifier-categories', + loadChildren: () => import('./modifier-categories/modifier-categories.routes').then((mod) => mod.routes), + }, + { + path: 'regimes', + loadChildren: () => import('./regimes/regimes.routes').then((mod) => mod.routes), + }, + { + path: 'printers', + loadChildren: () => import('./printers/printers.routes').then((mod) => mod.routes), + }, + { + path: 'products', + loadChildren: () => import('./product/products.routes').then((mod) => mod.routes), + }, + { + path: 'product-sale-report', + loadChildren: () => import('./product-sale-report/product-sale-report.routes').then((mod) => mod.routes), + }, + { + path: 'product-updates-report', + loadChildren: () => import('./product-updates-report/product-updates-report.routes').then((mod) => mod.routes), + }, + { + path: 'menu-categories', + loadChildren: () => import('./menu-category/menu-categories.routes').then((mod) => mod.routes), + }, + { + path: 'roles', + loadChildren: () => import('./roles/roles.routes').then((mod) => mod.routes), + }, + { + path: 'sales', + loadChildren: () => import('./sales/sales.routes').then((mod) => mod.routes), + }, + { + path: 'sale-report', + loadChildren: () => import('./sale-report/sale-report.routes').then((mod) => mod.routes), + }, + { + path: 'sale-categories', + loadChildren: () => import('./sale-category/sale-categories.routes').then((mod) => mod.routes), + }, + { + path: 'sections', + loadChildren: () => import('./sections/sections.routes').then((mod) => mod.routes), + }, + { + path: 'section-printers', + loadChildren: () => import('./section-printers/section-printers.routes').then((mod) => mod.routes), + }, + { + path: 'settings', + loadChildren: () => import('./settings/settings.routes').then((mod) => mod.routes), + }, + { + path: 'settle-options', + loadChildren: () => import('./settle-option/settle-options.routes').then((mod) => mod.routes), + }, + { + path: 'tables', + loadChildren: () => import('./tables/tables.routes').then((mod) => mod.routes), + }, + { + path: 'taxes', + loadChildren: () => import('./taxes/taxes.routes').then((mod) => mod.routes), + }, + { + path: 'tax-report', + loadChildren: () => import('./tax-report/tax-report.routes').then((mod) => mod.routes), + }, + { + path: 'temporal-products', + loadChildren: () => import('./temporal-product/temporal-products.routes').then((mod) => mod.routes), + }, + { + path: 'update-product-prices', + loadChildren: () => import('./update-product-prices/update-product-prices.routes').then((mod) => mod.routes), + }, + { + path: 'users', + loadChildren: () => import('./users/users.routes').then((mod) => mod.routes), + }, + { path: 'login', component: LoginComponent }, + { path: 'logout', component: LogoutComponent }, + { path: '', component: HomeComponent }, +]; diff --git a/bookie/src/app/auth/auth-guard.service.ts b/bookie/src/app/auth/auth-guard.service.ts index 9b2ee3c..c098fae 100644 --- a/bookie/src/app/auth/auth-guard.service.ts +++ b/bookie/src/app/auth/auth-guard.service.ts @@ -1,34 +1,26 @@ -import { Injectable } from '@angular/core'; -import { Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { inject } from '@angular/core'; +import { CanActivateFn } from '@angular/router'; +import { Router } from '@angular/router'; import { ToasterService } from '../core/toaster.service'; import { AuthService } from './auth.service'; -@Injectable({ providedIn: 'root' }) -export class AuthGuard { - constructor( - private router: Router, - private authService: AuthService, - private toaster: ToasterService, - ) {} - - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - const { user } = this.authService; - const permission = - route.data['permission'] === undefined - ? route.data['permission'] - : route.data['permission'].replace(/ /g, '-').toLowerCase(); - if (!user) { - // not logged in so redirect to login page with the return url - this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } }); - return false; - } - if (permission !== undefined && !this.authService.allowed(permission)) { - this.toaster.show('Error', 'You do not have the permission to access this area.'); - return false; - } - // logged in so return true - return true; +export const authGuard: CanActivateFn = (route, state) => { + const user = inject(AuthService).user; + const permission = + route.data['permission'] === undefined + ? route.data['permission'] + : route.data['permission'].replace(/ /g, '-').toLowerCase(); + if (!user) { + // not logged in so redirect to login page with the return url + inject(Router).navigate(['/login'], { queryParams: { returnUrl: state.url } }); + return false; } -} + if (permission !== undefined && user.perms.indexOf(permission) === -1) { + inject(ToasterService).show('Danger', 'You do not have the permission to access this area.'); + return false; + } + // logged in so return true + return true; +}; diff --git a/bookie/src/app/auth/auth.service.ts b/bookie/src/app/auth/auth.service.ts index 8d8fc73..b653555 100644 --- a/bookie/src/app/auth/auth.service.ts +++ b/bookie/src/app/auth/auth.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { environment } from '../../environments/environment'; +import { environment } from '../app.environment'; import { Device } from '../core/device'; import { Section } from '../core/section'; import { User } from '../core/user'; @@ -18,6 +18,7 @@ export class AuthService { public currentUser: Observable; public device: Device; private currentUserSubject: BehaviorSubject = new BehaviorSubject(null); + public isRefreshing = false; constructor( private http: HttpClient, diff --git a/bookie/src/app/auth/login/login.component.html b/bookie/src/app/auth/login/login.component.html index fe4b009..955add6 100644 --- a/bookie/src/app/auth/login/login.component.html +++ b/bookie/src/app/auth/login/login.component.html @@ -18,7 +18,9 @@ -

Sorry, device {{ deviceName }} is not enabled.

+ @if (unregisteredDevice) { +

Sorry, device {{ deviceName }} is not enabled.

+ } diff --git a/bookie/src/app/auth/login/login.component.ts b/bookie/src/app/auth/login/login.component.ts index 8e4213d..e0d82f9 100644 --- a/bookie/src/app/auth/login/login.component.ts +++ b/bookie/src/app/auth/login/login.component.ts @@ -1,5 +1,11 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -10,6 +16,22 @@ import { AuthService } from '../auth.service'; selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatIcon, + MatSuffix, + MatDivider, + MatCardActions, + MatButton, + ], }) export class LoginComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -61,17 +83,17 @@ export class LoginComponent implements OnInit, AfterViewInit { this.auth .login(username.trim(), password.trim()) // .pipe(first()) - .subscribe( - () => { + .subscribe({ + next: () => { this.router.navigateByUrl(this.returnUrl); }, - (error) => { - if (error.status === 401 && error.error.detail === 'Device is not registered') { + error: (error) => { + if (error.status === 401 && error.detail === 'Device is not registered') { this.unregisteredDevice = true; this.deviceName = this.cs.getCookie('device'); } - this.toaster.show('Error', error.error.detail); + this.toaster.show('Error', error.detail); }, - ); + }); } } diff --git a/bookie/src/app/auth/logout/logout.component.ts b/bookie/src/app/auth/logout/logout.component.ts index fc2fb68..1d1d5aa 100644 --- a/bookie/src/app/auth/logout/logout.component.ts +++ b/bookie/src/app/auth/logout/logout.component.ts @@ -5,6 +5,7 @@ import { AuthService } from '../auth.service'; @Component({ selector: 'app-logout', template: '', + standalone: true, }) export class LogoutComponent implements OnInit { constructor(private auth: AuthService) {} diff --git a/bookie/src/app/beer-sale-report/beer-sale-report-resolver.service.ts b/bookie/src/app/beer-sale-report/beer-sale-report-resolver.service.ts deleted file mode 100644 index ae3fba5..0000000 --- a/bookie/src/app/beer-sale-report/beer-sale-report-resolver.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { BeerSaleReport } from './beer-sale-report'; -import { BeerSaleReportService } from './beer-sale-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class BeerSaleReportResolver { - constructor(private ser: BeerSaleReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - const regular = route.queryParamMap.get('regular') !== 'false'; - const happy = route.queryParamMap.get('happy') !== 'false'; - const staff = route.queryParamMap.get('staff') !== 'false'; - const nc = route.queryParamMap.get('nc') !== 'false'; - return this.ser.get(startDate, finishDate, regular, happy, staff, nc); - } -} diff --git a/bookie/src/app/beer-sale-report/beer-sale-report-routing.module.spec.ts b/bookie/src/app/beer-sale-report/beer-sale-report-routing.module.spec.ts deleted file mode 100644 index beb44eb..0000000 --- a/bookie/src/app/beer-sale-report/beer-sale-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BeerSaleReportRoutingModule } from './beer-sale-report-routing.module'; - -describe('BeerSaleReportRoutingModule', () => { - let beerSaleReportRoutingModule: BeerSaleReportRoutingModule; - - beforeEach(() => { - beerSaleReportRoutingModule = new BeerSaleReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(beerSaleReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/beer-sale-report/beer-sale-report-routing.module.ts b/bookie/src/app/beer-sale-report/beer-sale-report-routing.module.ts deleted file mode 100644 index 0fd5dfc..0000000 --- a/bookie/src/app/beer-sale-report/beer-sale-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { BeerSaleReportResolver } from './beer-sale-report-resolver.service'; -import { BeerSaleReportComponent } from './beer-sale-report.component'; - -const beerSaleReportRoutes: Routes = [ - { - path: '', - component: BeerSaleReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Beer Sale Report', - }, - resolve: { - info: BeerSaleReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(beerSaleReportRoutes)], - exports: [RouterModule], - providers: [BeerSaleReportResolver], -}) -export class BeerSaleReportRoutingModule {} diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.component.html b/bookie/src/app/beer-sale-report/beer-sale-report.component.html index 382d328..a71992b 100644 --- a/bookie/src/app/beer-sale-report/beer-sale-report.component.html +++ b/bookie/src/app/beer-sale-report/beer-sale-report.component.html @@ -51,10 +51,12 @@ - - {{ col }} - {{ row[col] }} - + @for (col of info.headers; track col) { + + {{ col }} + {{ row[col] }} + + } diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.component.spec.ts b/bookie/src/app/beer-sale-report/beer-sale-report.component.spec.ts index 63b4e6a..7e23451 100644 --- a/bookie/src/app/beer-sale-report/beer-sale-report.component.spec.ts +++ b/bookie/src/app/beer-sale-report/beer-sale-report.component.spec.ts @@ -8,7 +8,7 @@ describe('BeerSaleReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BeerSaleReportComponent], + imports: [BeerSaleReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.component.ts b/bookie/src/app/beer-sale-report/beer-sale-report.component.ts index 11c7f00..6fe2e29 100644 --- a/bookie/src/app/beer-sale-report/beer-sale-report.component.ts +++ b/bookie/src/app/beer-sale-report/beer-sale-report.component.ts @@ -1,7 +1,26 @@ import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToCsvService } from '../shared/to-csv.service'; @@ -13,6 +32,36 @@ import { BeerSaleReportDataSource } from './beer-sale-report-datasource'; selector: 'app-beer-sale-report', templateUrl: './beer-sale-report.component.html', styleUrls: ['./beer-sale-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatCheckbox, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class BeerSaleReportComponent implements OnInit { info: BeerSaleReport = new BeerSaleReport(); diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.module.spec.ts b/bookie/src/app/beer-sale-report/beer-sale-report.module.spec.ts deleted file mode 100644 index 7c268c1..0000000 --- a/bookie/src/app/beer-sale-report/beer-sale-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BeerSaleReportModule } from './beer-sale-report.module'; - -describe('BeerSaleReportModule', () => { - let beerSaleReportModule: BeerSaleReportModule; - - beforeEach(() => { - beerSaleReportModule = new BeerSaleReportModule(); - }); - - it('should create an instance', () => { - expect(beerSaleReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.module.ts b/bookie/src/app/beer-sale-report/beer-sale-report.module.ts deleted file mode 100644 index abf96d8..0000000 --- a/bookie/src/app/beer-sale-report/beer-sale-report.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { BeerSaleReportRoutingModule } from './beer-sale-report-routing.module'; -import { BeerSaleReportComponent } from './beer-sale-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - BeerSaleReportRoutingModule, - MatCheckboxModule, - ], - declarations: [BeerSaleReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class BeerSaleReportModule {} diff --git a/bookie/src/app/beer-sale-report/beer-sale-report-resolver.service.spec.ts b/bookie/src/app/beer-sale-report/beer-sale-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/beer-sale-report/beer-sale-report-resolver.service.spec.ts rename to bookie/src/app/beer-sale-report/beer-sale-report.resolver.spec.ts diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.resolver.ts b/bookie/src/app/beer-sale-report/beer-sale-report.resolver.ts new file mode 100644 index 0000000..911997c --- /dev/null +++ b/bookie/src/app/beer-sale-report/beer-sale-report.resolver.ts @@ -0,0 +1,15 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { BeerSaleReport } from './beer-sale-report'; +import { BeerSaleReportService } from './beer-sale-report.service'; + +export const beerSaleReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + const regular = route.queryParamMap.get('regular') !== 'false'; + const happy = route.queryParamMap.get('happy') !== 'false'; + const staff = route.queryParamMap.get('staff') !== 'false'; + const nc = route.queryParamMap.get('nc') !== 'false'; + return inject(BeerSaleReportService).get(startDate, finishDate, regular, happy, staff, nc); +}; diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.routes.ts b/bookie/src/app/beer-sale-report/beer-sale-report.routes.ts new file mode 100644 index 0000000..2d55297 --- /dev/null +++ b/bookie/src/app/beer-sale-report/beer-sale-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { BeerSaleReportComponent } from './beer-sale-report.component'; +import { beerSaleReportResolver } from './beer-sale-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: BeerSaleReportComponent, + canActivate: [authGuard], + data: { + permission: 'Beer Sale Report', + }, + resolve: { + info: beerSaleReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report-resolver.service.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report-resolver.service.ts deleted file mode 100644 index cecd76d..0000000 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { BillSettlementReport } from './bill-settlement-report'; -import { BillSettlementReportService } from './bill-settlement-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class BillSettlementReportResolver { - constructor(private ser: BillSettlementReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report-routing.module.spec.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report-routing.module.spec.ts deleted file mode 100644 index 04a8d82..0000000 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BillSettlementReportRoutingModule } from './bill-settlement-report-routing.module'; - -describe('BillSettlementReportRoutingModule', () => { - let pbillSettlementReportRoutingModule: BillSettlementReportRoutingModule; - - beforeEach(() => { - pbillSettlementReportRoutingModule = new BillSettlementReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(pbillSettlementReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report-routing.module.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report-routing.module.ts deleted file mode 100644 index fbe6eeb..0000000 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { BillSettlementReportResolver } from './bill-settlement-report-resolver.service'; -import { BillSettlementReportComponent } from './bill-settlement-report.component'; - -const billSettlementReportRoutes: Routes = [ - { - path: '', - component: BillSettlementReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Bill Settlement Report', - }, - resolve: { - info: BillSettlementReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(billSettlementReportRoutes)], - exports: [RouterModule], - providers: [BillSettlementReportResolver], -}) -export class BillSettlementReportRoutingModule {} diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.component.spec.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.component.spec.ts index 5fa8f12..1168e7b 100644 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report.component.spec.ts +++ b/bookie/src/app/bill-settlement-report/bill-settlement-report.component.spec.ts @@ -8,7 +8,7 @@ describe('BillSettlementReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BillSettlementReportComponent], + imports: [BillSettlementReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts index 9fdf0a1..a835c6b 100644 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts +++ b/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts @@ -1,8 +1,28 @@ +import { DecimalPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; +import { LocalTimePipe } from '../shared/local-time.pipe'; import { ToCsvService } from '../shared/to-csv.service'; import { BillSettlementReport } from './bill-settlement-report'; @@ -12,6 +32,37 @@ import { BillSettlementReportDataSource } from './bill-settlement-report-datasou selector: 'app-bill-settlement-report', templateUrl: './bill-settlement-report.component.html', styleUrls: ['./bill-settlement-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + DecimalPipe, + LocalTimePipe, + ], }) export class BillSettlementReportComponent implements OnInit { info: BillSettlementReport = new BillSettlementReport(); diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.module.spec.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.module.spec.ts deleted file mode 100644 index 30ad474..0000000 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BillSettlementReportModule } from './bill-settlement-report.module'; - -describe('BillSettlementReportModule', () => { - let pbillSettlementReportModule: BillSettlementReportModule; - - beforeEach(() => { - pbillSettlementReportModule = new BillSettlementReportModule(); - }); - - it('should create an instance', () => { - expect(pbillSettlementReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.module.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.module.ts deleted file mode 100644 index e240c36..0000000 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { BillSettlementReportRoutingModule } from './bill-settlement-report-routing.module'; -import { BillSettlementReportComponent } from './bill-settlement-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - BillSettlementReportRoutingModule, - ], - declarations: [BillSettlementReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class BillSettlementReportModule {} diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report-resolver.service.spec.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/bill-settlement-report/bill-settlement-report-resolver.service.spec.ts rename to bookie/src/app/bill-settlement-report/bill-settlement-report.resolver.spec.ts diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.resolver.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.resolver.ts new file mode 100644 index 0000000..4577f6c --- /dev/null +++ b/bookie/src/app/bill-settlement-report/bill-settlement-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { BillSettlementReport } from './bill-settlement-report'; +import { BillSettlementReportService } from './bill-settlement-report.service'; + +export const billSettlementReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(BillSettlementReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.routes.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.routes.ts new file mode 100644 index 0000000..21bcebc --- /dev/null +++ b/bookie/src/app/bill-settlement-report/bill-settlement-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { BillSettlementReportComponent } from './bill-settlement-report.component'; +import { billSettlementReportResolver } from './bill-settlement-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: BillSettlementReportComponent, + canActivate: [authGuard], + data: { + permission: 'Bill Settlement Report', + }, + resolve: { + info: billSettlementReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/cashier-report/active-cashiers-resolver.service.ts b/bookie/src/app/cashier-report/active-cashiers-resolver.service.ts deleted file mode 100644 index df16e17..0000000 --- a/bookie/src/app/cashier-report/active-cashiers-resolver.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { User } from '../core/user'; - -import { CashierReportService } from './cashier-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ActiveCashiersResolver { - constructor(private ser: CashierReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.activeCashiers(startDate, finishDate); - } -} diff --git a/bookie/src/app/cashier-report/active-cashiers-resolver.service.spec.ts b/bookie/src/app/cashier-report/active-cashiers.resolver.spec.ts similarity index 100% rename from bookie/src/app/cashier-report/active-cashiers-resolver.service.spec.ts rename to bookie/src/app/cashier-report/active-cashiers.resolver.spec.ts diff --git a/bookie/src/app/cashier-report/active-cashiers.resolver.ts b/bookie/src/app/cashier-report/active-cashiers.resolver.ts new file mode 100644 index 0000000..4c8cf1c --- /dev/null +++ b/bookie/src/app/cashier-report/active-cashiers.resolver.ts @@ -0,0 +1,12 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { User } from '../core/user'; + +import { CashierReportService } from './cashier-report.service'; + +export const activeCashiersResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(CashierReportService).activeCashiers(startDate, finishDate); +}; diff --git a/bookie/src/app/cashier-report/cashier-report-resolver.service.ts b/bookie/src/app/cashier-report/cashier-report-resolver.service.ts deleted file mode 100644 index 42f0063..0000000 --- a/bookie/src/app/cashier-report/cashier-report-resolver.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { CashierReport } from './cashier-report'; -import { CashierReportService } from './cashier-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class CashierReportResolver { - constructor(private ser: CashierReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.list(id, startDate, finishDate); - } -} diff --git a/bookie/src/app/cashier-report/cashier-report-routing.module.spec.ts b/bookie/src/app/cashier-report/cashier-report-routing.module.spec.ts deleted file mode 100644 index a3e052b..0000000 --- a/bookie/src/app/cashier-report/cashier-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CashierReportRoutingModule } from './cashier-report-routing.module'; - -describe('CashierReportRoutingModule', () => { - let cashierReportRoutingModule: CashierReportRoutingModule; - - beforeEach(() => { - cashierReportRoutingModule = new CashierReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(cashierReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/cashier-report/cashier-report-routing.module.ts b/bookie/src/app/cashier-report/cashier-report-routing.module.ts deleted file mode 100644 index 827287f..0000000 --- a/bookie/src/app/cashier-report/cashier-report-routing.module.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { ActiveCashiersResolver } from './active-cashiers-resolver.service'; -import { CashierReportResolver } from './cashier-report-resolver.service'; -import { CashierReportComponent } from './cashier-report.component'; - -const cashierReportRoutes: Routes = [ - { - path: '', - component: CashierReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Cashier Report', - }, - resolve: { - info: CashierReportResolver, - cashiers: ActiveCashiersResolver, - }, - runGuardsAndResolvers: 'always', - }, - { - path: ':id', - component: CashierReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Cashier Report', - }, - resolve: { - info: CashierReportResolver, - cashiers: ActiveCashiersResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(cashierReportRoutes)], - exports: [RouterModule], - providers: [CashierReportResolver], -}) -export class CashierReportRoutingModule {} diff --git a/bookie/src/app/cashier-report/cashier-report.component.html b/bookie/src/app/cashier-report/cashier-report.component.html index 373a8d0..5c7cd1c 100644 --- a/bookie/src/app/cashier-report/cashier-report.component.html +++ b/bookie/src/app/cashier-report/cashier-report.component.html @@ -44,9 +44,11 @@ Cashier -- Cashier -- - - {{ ac.name }} - + @for (ac of activeCashiers; track ac) { + + {{ ac.name }} + + } diff --git a/bookie/src/app/cashier-report/cashier-report.component.spec.ts b/bookie/src/app/cashier-report/cashier-report.component.spec.ts index fdff58d..4af4b79 100644 --- a/bookie/src/app/cashier-report/cashier-report.component.spec.ts +++ b/bookie/src/app/cashier-report/cashier-report.component.spec.ts @@ -8,7 +8,7 @@ describe('CashierReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CashierReportComponent], + imports: [CashierReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/cashier-report/cashier-report.component.ts b/bookie/src/app/cashier-report/cashier-report.component.ts index 62b4216..9aed7c8 100644 --- a/bookie/src/app/cashier-report/cashier-report.component.ts +++ b/bookie/src/app/cashier-report/cashier-report.component.ts @@ -1,7 +1,28 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToasterService } from '../core/toaster.service'; import { User } from '../core/user'; @@ -15,6 +36,38 @@ import { CashierReportService } from './cashier-report.service'; selector: 'app-cashier-report', templateUrl: './cashier-report.component.html', styleUrls: ['./cashier-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatSelect, + MatOption, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class CashierReportComponent implements OnInit { activeCashiers: User[] = []; @@ -73,14 +126,14 @@ export class CashierReportComponent implements OnInit { } print() { - this.ser.print(this.info.cashier.id as string, this.info.startDate, this.info.finishDate).subscribe( - () => { + this.ser.print(this.info.cashier.id as string, this.info.startDate, this.info.finishDate).subscribe({ + next: () => { this.toaster.show('', 'Successfully Printed'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } getInfo(): CashierReport { diff --git a/bookie/src/app/cashier-report/cashier-report.module.spec.ts b/bookie/src/app/cashier-report/cashier-report.module.spec.ts deleted file mode 100644 index 622a8c6..0000000 --- a/bookie/src/app/cashier-report/cashier-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CashierReportModule } from './cashier-report.module'; - -describe('CashierReportModule', () => { - let cashierReportModule: CashierReportModule; - - beforeEach(() => { - cashierReportModule = new CashierReportModule(); - }); - - it('should create an instance', () => { - expect(cashierReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/cashier-report/cashier-report.module.ts b/bookie/src/app/cashier-report/cashier-report.module.ts deleted file mode 100644 index 8748771..0000000 --- a/bookie/src/app/cashier-report/cashier-report.module.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { CashierReportRoutingModule } from './cashier-report-routing.module'; -import { CashierReportComponent } from './cashier-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - CashierReportRoutingModule, - ], - declarations: [CashierReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class CashierReportModule {} diff --git a/bookie/src/app/cashier-report/cashier-report-resolver.service.spec.ts b/bookie/src/app/cashier-report/cashier-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/cashier-report/cashier-report-resolver.service.spec.ts rename to bookie/src/app/cashier-report/cashier-report.resolver.spec.ts diff --git a/bookie/src/app/cashier-report/cashier-report.resolver.ts b/bookie/src/app/cashier-report/cashier-report.resolver.ts new file mode 100644 index 0000000..a80e711 --- /dev/null +++ b/bookie/src/app/cashier-report/cashier-report.resolver.ts @@ -0,0 +1,12 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { CashierReport } from './cashier-report'; +import { CashierReportService } from './cashier-report.service'; + +export const cashierReportResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(CashierReportService).list(id, startDate, finishDate); +}; diff --git a/bookie/src/app/cashier-report/cashier-report.routes.ts b/bookie/src/app/cashier-report/cashier-report.routes.ts new file mode 100644 index 0000000..db9223f --- /dev/null +++ b/bookie/src/app/cashier-report/cashier-report.routes.ts @@ -0,0 +1,36 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { activeCashiersResolver } from './active-cashiers.resolver'; +import { CashierReportComponent } from './cashier-report.component'; +import { cashierReportResolver } from './cashier-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: CashierReportComponent, + canActivate: [authGuard], + data: { + permission: 'Cashier Report', + }, + resolve: { + info: cashierReportResolver, + cashiers: activeCashiersResolver, + }, + runGuardsAndResolvers: 'always', + }, + { + path: ':id', + component: CashierReportComponent, + canActivate: [authGuard], + data: { + permission: 'Cashier Report', + }, + resolve: { + info: cashierReportResolver, + cashiers: activeCashiersResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/core/auth.interceptor.spec.ts b/bookie/src/app/core/auth.interceptor.spec.ts new file mode 100644 index 0000000..7847895 --- /dev/null +++ b/bookie/src/app/core/auth.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { authInterceptor } from './auth.interceptor'; + +describe('authInterceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => TestBed.runInInjectionContext(() => authInterceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/bookie/src/app/core/auth.interceptor.ts b/bookie/src/app/core/auth.interceptor.ts new file mode 100644 index 0000000..b965adf --- /dev/null +++ b/bookie/src/app/core/auth.interceptor.ts @@ -0,0 +1,53 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { inject } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Router } from '@angular/router'; +import { throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +import { AuthService } from '../auth/auth.service'; +import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; + +import { ToasterService } from './toaster.service'; + +export const authInterceptor: HttpInterceptorFn = (req, next) => { + return next(req).pipe( + catchError((err) => { + // We don't want to refresh token for some requests like login or refresh token itself + // So we verify url and we throw an error if it's the case + if (req.url.includes('/refresh') || req.url.includes('/token')) { + // We do another check to see if refresh token failed + // In this case we want to logout user and to redirect it to login page + if (req.url.includes('/refresh')) { + inject(AuthService).logout(); + } + return throwError(() => new Error(err)); + } + // If error status is different than 401 we want to skip refresh token + // So we check that and throw the error if it's the case + if (err.status !== 401) { + const error = err.error.message || err.error.detail || err.statusText; + return throwError(() => new Error(error)); + } + // auto logout if 401 response returned from api + inject(AuthService).logout(); + inject(ToasterService).show('Danger', 'User has been logged out'); + const dialogRef = inject(MatDialog).open(ConfirmDialogComponent, { + width: '250px', + data: { + title: 'Logged out!', + content: + 'You have been logged out.\n' + + 'You can press Cancel to stay on page and login in another tab to resume here, ' + + 'or you can press Ok to navigate to the login page.', + }, + }); + dialogRef.afterClosed().subscribe((result: boolean) => { + if (result) { + inject(Router).navigate(['login']); + } + }); + return throwError(() => new Error(err)); + }), + ); +}; diff --git a/bookie/src/app/core/core.module.ts b/bookie/src/app/core/core.module.ts deleted file mode 100644 index 6c4932d..0000000 --- a/bookie/src/app/core/core.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { RouterModule } from '@angular/router'; - -import { ErrorInterceptor } from './http-auth-interceptor'; -import { JwtInterceptor } from './jwt.interceptor'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule, RouterModule], - declarations: [], - providers: [ - { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, - ], -}) -export class CoreModule {} diff --git a/bookie/src/app/core/error-logger.service.spec.ts b/bookie/src/app/core/error-logger.service.spec.ts new file mode 100644 index 0000000..9a06343 --- /dev/null +++ b/bookie/src/app/core/error-logger.service.spec.ts @@ -0,0 +1,15 @@ +import { inject, TestBed } from '@angular/core/testing'; + +import { ErrorLoggerService } from './error-logger.service'; + +describe('ErrorLoggerService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ErrorLoggerService], + }); + }); + + it('should be created', inject([ErrorLoggerService], (service: ErrorLoggerService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/bookie/src/app/core/error-logger.service.ts b/bookie/src/app/core/error-logger.service.ts index cdbdeb2..ce5ec8a 100644 --- a/bookie/src/app/core/error-logger.service.ts +++ b/bookie/src/app/core/error-logger.service.ts @@ -1,13 +1,11 @@ import { Injectable } from '@angular/core'; -import { throwError } from 'rxjs'; -import { Observable } from 'rxjs'; +import { Observable, throwError } from 'rxjs'; @Injectable({ providedIn: 'root', }) export class ErrorLoggerService { public static log(serviceName = 'error-logger', message: string) { - // eslint-disable-next-line no-console console.log(`${serviceName}Service: ${message}`); } @@ -18,11 +16,10 @@ export class ErrorLoggerService { * @param operation - name of the operation that failed * @param result - optional value to return as the observable result */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this - public handleError(serviceName = 'error-logger', operation = 'operation', result?: T) { + public handleError(serviceName = 'error-logger', operation = 'operation') { return (error: unknown): Observable => { ErrorLoggerService.log(serviceName, `${operation} failed: ${error}`); - return throwError(error); + return throwError(() => error); }; } } diff --git a/bookie/src/app/core/http-auth-interceptor.ts b/bookie/src/app/core/http-auth-interceptor.ts deleted file mode 100644 index 04ac1c5..0000000 --- a/bookie/src/app/core/http-auth-interceptor.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { Router } from '@angular/router'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import { AuthService } from '../auth/auth.service'; -import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; - -import { ToasterService } from './toaster.service'; - -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - constructor( - private authService: AuthService, - private router: Router, - private dialog: MatDialog, - private toaster: ToasterService, - ) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe( - catchError((err) => { - // We don't want to refresh token for some requests like login or refresh token itself - // So we verify url and we throw an error if it's the case - if (request.url.includes('/refresh') || request.url.includes('/token')) { - // We do another check to see if refresh token failed - // In this case we want to logout user and to redirect it to login page - if (request.url.includes('/refresh')) { - this.authService.logout(); - } - return throwError(() => err); - } - // If error status is different than 401 we want to skip refresh token - // So we check that and throw the error if it's the case - if (err.status !== 401) { - const error = err.error.message ?? err.error.detail ?? err.statusText; - return throwError(() => error); - } - // auto logout if 401 response returned from api - this.authService.logout(); - this.toaster.show('Error', 'User has been logged out'); - const dialogRef = this.dialog.open(ConfirmDialogComponent, { - width: '250px', - data: { - title: 'Logged out!', - content: - 'You have been logged out.\n' + - 'You can press Cancel to stay on page and login in another tab to resume here,' + - ' or you can press Ok to navigate to the login page.', - }, - }); - dialogRef.afterClosed().subscribe((result: boolean) => { - if (result) { - this.router.navigate(['login']); - } - }); - return throwError(() => err); - }), - ); - } -} diff --git a/bookie/src/app/core/jwt.interceptor.spec.ts b/bookie/src/app/core/jwt.interceptor.spec.ts new file mode 100644 index 0000000..3922799 --- /dev/null +++ b/bookie/src/app/core/jwt.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { jwtInterceptor } from './jwt.interceptor'; + +describe('jwtInterceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => TestBed.runInInjectionContext(() => jwtInterceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/bookie/src/app/core/jwt.interceptor.ts b/bookie/src/app/core/jwt.interceptor.ts index 0f4529a..2dfe194 100644 --- a/bookie/src/app/core/jwt.interceptor.ts +++ b/bookie/src/app/core/jwt.interceptor.ts @@ -1,35 +1,18 @@ -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; +import { HttpInterceptorFn } from '@angular/common/http'; +import { inject } from '@angular/core'; import { AuthService } from '../auth/auth.service'; -@Injectable() -export class JwtInterceptor implements HttpInterceptor { - private isRefreshing = false; - - constructor(private authService: AuthService) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - // add authorization header with jwt token if available - - // We use this line to debug token refreshing - if (!this.isRefreshing && this.authService.user && this.authService.needsRefreshing()) { - this.isRefreshing = true; - this.authService.refreshToken().subscribe(() => { - this.isRefreshing = false; - }); - } - const currentUser = this.authService.user; - if (currentUser?.access_token) { - // eslint-disable-next-line no-param-reassign - request = request.clone({ - setHeaders: { - Authorization: `Bearer ${currentUser.access_token}`, - }, - }); - } - - return next.handle(request); +export const jwtInterceptor: HttpInterceptorFn = (req, next) => { + // add authorization header with jwt token if available + const currentUser = inject(AuthService).user; + if (currentUser?.access_token) { + req = req.clone({ + setHeaders: { + Authorization: `Bearer ${currentUser.access_token}`, + }, + }); } -} + + return next(req); +}; diff --git a/bookie/src/app/core/refresh.interceptor.spec.ts b/bookie/src/app/core/refresh.interceptor.spec.ts new file mode 100644 index 0000000..9e45c29 --- /dev/null +++ b/bookie/src/app/core/refresh.interceptor.spec.ts @@ -0,0 +1,17 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; + +import { refreshInterceptor } from './refresh.interceptor'; + +describe('refreshInterceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => + TestBed.runInInjectionContext(() => refreshInterceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/bookie/src/app/core/refresh.interceptor.ts b/bookie/src/app/core/refresh.interceptor.ts new file mode 100644 index 0000000..c76bf02 --- /dev/null +++ b/bookie/src/app/core/refresh.interceptor.ts @@ -0,0 +1,17 @@ +import { HttpInterceptorFn } from '@angular/common/http'; +import { inject } from '@angular/core'; + +import { AuthService } from '../auth/auth.service'; + +export const refreshInterceptor: HttpInterceptorFn = (req, next) => { + const authService = inject(AuthService); + if (!authService.isRefreshing && authService.user && authService.needsRefreshing()) { + authService.isRefreshing = true; + authService.refreshToken().subscribe({ + next: () => { + authService.isRefreshing = false; + }, + }); + } + return next(req); +}; diff --git a/bookie/src/app/customers/customer-detail/customer-detail.component.html b/bookie/src/app/customers/customer-detail/customer-detail.component.html index daaf637..bf0cfe0 100644 --- a/bookie/src/app/customers/customer-detail/customer-detail.component.html +++ b/bookie/src/app/customers/customer-detail/customer-detail.component.html @@ -30,18 +30,19 @@ formArrayName="discounts" class="flex flex-row flex-wrap justify-around content-start items-start discounts gap-x-5" > -
- - Discount on {{ r.name }} - - % - Max {{ r.limit | percent: '1.2-2' }} - -
+ @for (r of item.discounts; track r; let i = $index) { +
+ + Discount on {{ r.name }} + + % + Max {{ r.limit | percent: '1.2-2' }} + +
+ } diff --git a/bookie/src/app/customers/customer-detail/customer-detail.component.spec.ts b/bookie/src/app/customers/customer-detail/customer-detail.component.spec.ts index 0197f06..7892727 100644 --- a/bookie/src/app/customers/customer-detail/customer-detail.component.spec.ts +++ b/bookie/src/app/customers/customer-detail/customer-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('CustomerDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CustomerDetailComponent], + imports: [CustomerDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/customers/customer-detail/customer-detail.component.ts b/bookie/src/app/customers/customer-detail/customer-detail.component.ts index 03a326a..b24f3be 100644 --- a/bookie/src/app/customers/customer-detail/customer-detail.component.ts +++ b/bookie/src/app/customers/customer-detail/customer-detail.component.ts @@ -1,6 +1,13 @@ +import { PercentPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel, MatSuffix, MatHint } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { round } from 'mathjs'; @@ -13,6 +20,24 @@ import { CustomerService } from '../customer.service'; selector: 'app-customer-detail', templateUrl: './customer-detail.component.html', styleUrls: ['./customer-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatDivider, + MatSuffix, + MatHint, + MatCardActions, + MatButton, + PercentPipe, + ], }) export class CustomerDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -81,27 +106,27 @@ export class CustomerDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/customers'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/customers'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/customers/customer-list-resolver.service.ts b/bookie/src/app/customers/customer-list-resolver.service.ts deleted file mode 100644 index 3c863dc..0000000 --- a/bookie/src/app/customers/customer-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Customer } from '../core/customer'; - -import { CustomerService } from './customer.service'; - -@Injectable({ - providedIn: 'root', -}) -export class CustomerListResolver { - constructor(private ser: CustomerService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/customers/customer-list-resolver.service.spec.ts b/bookie/src/app/customers/customer-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/customers/customer-list-resolver.service.spec.ts rename to bookie/src/app/customers/customer-list.resolver.spec.ts diff --git a/bookie/src/app/customers/customer-list.resolver.ts b/bookie/src/app/customers/customer-list.resolver.ts new file mode 100644 index 0000000..3981266 --- /dev/null +++ b/bookie/src/app/customers/customer-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Customer } from '../core/customer'; + +import { CustomerService } from './customer.service'; + +export const customerListResolver: ResolveFn = () => { + return inject(CustomerService).list(); +}; diff --git a/bookie/src/app/customers/customer-list/customer-list.component.html b/bookie/src/app/customers/customer-list/customer-list.component.html index 81edb1e..83f6011 100644 --- a/bookie/src/app/customers/customer-list/customer-list.component.html +++ b/bookie/src/app/customers/customer-list/customer-list.component.html @@ -41,9 +41,9 @@ Discounts
    -
  • - {{ discount.name }} - {{ discount.discount | percent: '1.2-2' }} -
  • + @for (discount of row.discounts; track discount) { +
  • {{ discount.name }} - {{ discount.discount | percent: '1.2-2' }}
  • + }
diff --git a/bookie/src/app/customers/customer-list/customer-list.component.ts b/bookie/src/app/customers/customer-list/customer-list.component.ts index 56a4913..2f79126 100644 --- a/bookie/src/app/customers/customer-list/customer-list.component.ts +++ b/bookie/src/app/customers/customer-list/customer-list.component.ts @@ -1,5 +1,21 @@ +import { PercentPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Customer } from '../../core/customer'; @@ -9,6 +25,28 @@ import { CustomerListDatasource } from './customer-list-datasource'; selector: 'app-customer-list', templateUrl: './customer-list.component.html', styleUrls: ['./customer-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + PercentPipe, + ], }) export class CustomerListComponent implements OnInit { dataSource: CustomerListDatasource = new CustomerListDatasource([]); diff --git a/bookie/src/app/customers/customer-resolver.service.ts b/bookie/src/app/customers/customer-resolver.service.ts deleted file mode 100644 index aeaeaa7..0000000 --- a/bookie/src/app/customers/customer-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Customer } from '../core/customer'; - -import { CustomerService } from './customer.service'; - -@Injectable({ - providedIn: 'root', -}) -export class CustomerResolver { - constructor(private ser: CustomerService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/customers/customer-routing.module.spec.ts b/bookie/src/app/customers/customer-routing.module.spec.ts deleted file mode 100644 index c487a48..0000000 --- a/bookie/src/app/customers/customer-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CustomerRoutingModule } from './customer-routing.module'; - -describe('CustomersRoutingModule', () => { - let customerRoutingModule: CustomerRoutingModule; - - beforeEach(() => { - customerRoutingModule = new CustomerRoutingModule(); - }); - - it('should create an instance', () => { - expect(customerRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/customers/customer-routing.module.ts b/bookie/src/app/customers/customer-routing.module.ts deleted file mode 100644 index 1f9fb2c..0000000 --- a/bookie/src/app/customers/customer-routing.module.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { CustomerDetailComponent } from './customer-detail/customer-detail.component'; -import { CustomerListComponent } from './customer-list/customer-list.component'; -import { CustomerListResolver } from './customer-list-resolver.service'; -import { CustomerResolver } from './customer-resolver.service'; - -const customersRoutes: Routes = [ - { - path: '', - component: CustomerListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Customers', - }, - resolve: { - list: CustomerListResolver, - }, - }, - { - path: 'new', - component: CustomerDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Customers', - }, - resolve: { - item: CustomerResolver, - }, - }, - { - path: ':id', - component: CustomerDetailComponent, - canActivate: [AuthGuard], - resolve: { - item: CustomerResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(customersRoutes)], - exports: [RouterModule], - providers: [CustomerListResolver, CustomerResolver], -}) -export class CustomerRoutingModule {} diff --git a/bookie/src/app/customers/customer.module.spec.ts b/bookie/src/app/customers/customer.module.spec.ts deleted file mode 100644 index fbe9160..0000000 --- a/bookie/src/app/customers/customer.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CustomerModule } from './customer.module'; - -describe('CustomerModule', () => { - let customerModuleModule: CustomerModule; - - beforeEach(() => { - customerModuleModule = new CustomerModule(); - }); - - it('should create an instance', () => { - expect(customerModuleModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/customers/customer.module.ts b/bookie/src/app/customers/customer.module.ts deleted file mode 100644 index 291b94b..0000000 --- a/bookie/src/app/customers/customer.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { CustomerDetailComponent } from './customer-detail/customer-detail.component'; -import { CustomerListComponent } from './customer-list/customer-list.component'; -import { CustomerRoutingModule } from './customer-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - CustomerRoutingModule, - ], - declarations: [CustomerListComponent, CustomerDetailComponent], -}) -export class CustomerModule {} diff --git a/bookie/src/app/customers/customer-resolver.service.spec.ts b/bookie/src/app/customers/customer.resolver.spec.ts similarity index 100% rename from bookie/src/app/customers/customer-resolver.service.spec.ts rename to bookie/src/app/customers/customer.resolver.spec.ts diff --git a/bookie/src/app/customers/customer.resolver.ts b/bookie/src/app/customers/customer.resolver.ts new file mode 100644 index 0000000..e01dc1f --- /dev/null +++ b/bookie/src/app/customers/customer.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Customer } from '../core/customer'; + +import { CustomerService } from './customer.service'; + +export const customerResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(CustomerService).get(id); +}; diff --git a/bookie/src/app/customers/customer.routes.ts b/bookie/src/app/customers/customer.routes.ts new file mode 100644 index 0000000..cd89c36 --- /dev/null +++ b/bookie/src/app/customers/customer.routes.ts @@ -0,0 +1,41 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { CustomerDetailComponent } from './customer-detail/customer-detail.component'; +import { CustomerListComponent } from './customer-list/customer-list.component'; +import { customerListResolver } from './customer-list.resolver'; +import { customerResolver } from './customer.resolver'; + +export const routes: Routes = [ + { + path: '', + component: CustomerListComponent, + canActivate: [authGuard], + data: { + permission: 'Customers', + }, + resolve: { + list: customerListResolver, + }, + }, + { + path: 'new', + component: CustomerDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Customers', + }, + resolve: { + item: customerResolver, + }, + }, + { + path: ':id', + component: CustomerDetailComponent, + canActivate: [authGuard], + resolve: { + item: customerResolver, + }, + }, +]; diff --git a/bookie/src/app/devices/device-detail/device-detail.component.html b/bookie/src/app/devices/device-detail/device-detail.component.html index b10c466..e8a47d4 100644 --- a/bookie/src/app/devices/device-detail/device-detail.component.html +++ b/bookie/src/app/devices/device-detail/device-detail.component.html @@ -14,9 +14,11 @@ Section - - {{ s.name }} - + @for (s of sections; track s) { + + {{ s.name }} + + } @@ -27,7 +29,9 @@ - + @if (!!item.id) { + + } Created on {{ item.creationDate | localTime }} diff --git a/bookie/src/app/devices/device-detail/device-detail.component.spec.ts b/bookie/src/app/devices/device-detail/device-detail.component.spec.ts index 9d7064a..c91941f 100644 --- a/bookie/src/app/devices/device-detail/device-detail.component.spec.ts +++ b/bookie/src/app/devices/device-detail/device-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('DeviceDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DeviceDetailComponent], + imports: [DeviceDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/devices/device-detail/device-detail.component.ts b/bookie/src/app/devices/device-detail/device-detail.component.ts index 260e7eb..a1cd86d 100644 --- a/bookie/src/app/devices/device-detail/device-detail.component.ts +++ b/bookie/src/app/devices/device-detail/device-detail.component.ts @@ -1,18 +1,51 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatCardActions, + MatCardSubtitle, +} from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { Device } from '../../core/device'; import { Section } from '../../core/section'; import { ToasterService } from '../../core/toaster.service'; import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { DeviceService } from '../device.service'; @Component({ selector: 'app-device-detail', templateUrl: './device-detail.component.html', styleUrls: ['./device-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSelect, + MatOption, + MatCheckbox, + MatCardActions, + MatButton, + MatCardSubtitle, + LocalTimePipe, + ], }) export class DeviceDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -66,27 +99,27 @@ export class DeviceDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/devices'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/devices'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/devices/device-list-resolver.service.ts b/bookie/src/app/devices/device-list-resolver.service.ts deleted file mode 100644 index 7712e1d..0000000 --- a/bookie/src/app/devices/device-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Device } from '../core/device'; - -import { DeviceService } from './device.service'; - -@Injectable({ - providedIn: 'root', -}) -export class DeviceListResolver { - constructor(private ser: DeviceService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/devices/device-list-resolver.service.spec.ts b/bookie/src/app/devices/device-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/devices/device-list-resolver.service.spec.ts rename to bookie/src/app/devices/device-list.resolver.spec.ts diff --git a/bookie/src/app/devices/device-list.resolver.ts b/bookie/src/app/devices/device-list.resolver.ts new file mode 100644 index 0000000..ca862b4 --- /dev/null +++ b/bookie/src/app/devices/device-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Device } from '../core/device'; + +import { DeviceService } from './device.service'; + +export const deviceListResolver: ResolveFn = () => { + return inject(DeviceService).list(); +}; diff --git a/bookie/src/app/devices/device-list/device-list.component.html b/bookie/src/app/devices/device-list/device-list.component.html index 177c729..88b9bc3 100644 --- a/bookie/src/app/devices/device-list/device-list.component.html +++ b/bookie/src/app/devices/device-list/device-list.component.html @@ -40,7 +40,7 @@ Last Login {{ row.lastUser }} @ {{ row.lastDate ? (row.lastDate | localTime) : 'Never' }}{{ row.lastUser }} @ {{ row.lastDate ? (row.lastDate | localTime) : 'Never' }} diff --git a/bookie/src/app/devices/device-list/device-list.component.spec.ts b/bookie/src/app/devices/device-list/device-list.component.spec.ts index 5bef016..f417f0a 100644 --- a/bookie/src/app/devices/device-list/device-list.component.spec.ts +++ b/bookie/src/app/devices/device-list/device-list.component.spec.ts @@ -8,7 +8,7 @@ describe('DeviceListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [DeviceListComponent], + imports: [DeviceListComponent], }).compileComponents(); fixture = TestBed.createComponent(DeviceListComponent); diff --git a/bookie/src/app/devices/device-list/device-list.component.ts b/bookie/src/app/devices/device-list/device-list.component.ts index 2fbfedc..5af001d 100644 --- a/bookie/src/app/devices/device-list/device-list.component.ts +++ b/bookie/src/app/devices/device-list/device-list.component.ts @@ -1,7 +1,23 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Device } from '../../core/device'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { DeviceListDataSource } from './device-list-datasource'; @@ -9,6 +25,28 @@ import { DeviceListDataSource } from './device-list-datasource'; selector: 'app-device-list', templateUrl: './device-list.component.html', styleUrls: ['./device-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + LocalTimePipe, + ], }) export class DeviceListComponent implements OnInit { list: Device[] = []; diff --git a/bookie/src/app/devices/device-resolver.service.ts b/bookie/src/app/devices/device-resolver.service.ts deleted file mode 100644 index 15d8c4f..0000000 --- a/bookie/src/app/devices/device-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Device } from '../core/device'; - -import { DeviceService } from './device.service'; - -@Injectable({ - providedIn: 'root', -}) -export class DeviceResolver { - constructor(private ser: DeviceService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/devices/device-resolver.service.spec.ts b/bookie/src/app/devices/device.resolver.spec.ts similarity index 100% rename from bookie/src/app/devices/device-resolver.service.spec.ts rename to bookie/src/app/devices/device.resolver.spec.ts diff --git a/bookie/src/app/devices/device.resolver.ts b/bookie/src/app/devices/device.resolver.ts new file mode 100644 index 0000000..4f6f2c0 --- /dev/null +++ b/bookie/src/app/devices/device.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Device } from '../core/device'; + +import { DeviceService } from './device.service'; + +export const deviceResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(DeviceService).get(id); +}; diff --git a/bookie/src/app/devices/devices-routing.module.spec.ts b/bookie/src/app/devices/devices-routing.module.spec.ts deleted file mode 100644 index 9668d36..0000000 --- a/bookie/src/app/devices/devices-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DevicesRoutingModule } from './devices-routing.module'; - -describe('DevicesRoutingModule', () => { - let devicesRoutingModule: DevicesRoutingModule; - - beforeEach(() => { - devicesRoutingModule = new DevicesRoutingModule(); - }); - - it('should create an instance', () => { - expect(devicesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/devices/devices-routing.module.ts b/bookie/src/app/devices/devices-routing.module.ts deleted file mode 100644 index e292d95..0000000 --- a/bookie/src/app/devices/devices-routing.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { SectionListResolver } from '../sections/section-list-resolver.service'; - -import { DeviceDetailComponent } from './device-detail/device-detail.component'; -import { DeviceListComponent } from './device-list/device-list.component'; -import { DeviceListResolver } from './device-list-resolver.service'; -import { DeviceResolver } from './device-resolver.service'; - -const devicesRoutes: Routes = [ - { - path: '', - component: DeviceListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Devices', - }, - resolve: { - list: DeviceListResolver, - }, - }, - { - path: 'new', - component: DeviceDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Devices', - }, - resolve: { - item: DeviceResolver, - sections: SectionListResolver, - }, - }, - { - path: ':id', - component: DeviceDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Devices', - }, - resolve: { - item: DeviceResolver, - sections: SectionListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(devicesRoutes)], - exports: [RouterModule], - providers: [DeviceListResolver, DeviceResolver], -}) -export class DevicesRoutingModule {} diff --git a/bookie/src/app/devices/devices.module.spec.ts b/bookie/src/app/devices/devices.module.spec.ts deleted file mode 100644 index fd52f38..0000000 --- a/bookie/src/app/devices/devices.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DevicesModule } from './devices.module'; - -describe('DevicesModule', () => { - let devicesModule: DevicesModule; - - beforeEach(() => { - devicesModule = new DevicesModule(); - }); - - it('should create an instance', () => { - expect(devicesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/devices/devices.module.ts b/bookie/src/app/devices/devices.module.ts deleted file mode 100644 index 7015230..0000000 --- a/bookie/src/app/devices/devices.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { DeviceDetailComponent } from './device-detail/device-detail.component'; -import { DeviceListComponent } from './device-list/device-list.component'; -import { DevicesRoutingModule } from './devices-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatIconModule, - MatInputModule, - MatOptionModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - DevicesRoutingModule, - MatCheckboxModule, - SharedModule, - ], - declarations: [DeviceListComponent, DeviceDetailComponent], -}) -export class DevicesModule {} diff --git a/bookie/src/app/devices/devices.routes.ts b/bookie/src/app/devices/devices.routes.ts new file mode 100644 index 0000000..56af209 --- /dev/null +++ b/bookie/src/app/devices/devices.routes.ts @@ -0,0 +1,47 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { sectionListResolver } from '../sections/section-list.resolver'; + +import { DeviceDetailComponent } from './device-detail/device-detail.component'; +import { DeviceListComponent } from './device-list/device-list.component'; +import { deviceListResolver } from './device-list.resolver'; +import { deviceResolver } from './device.resolver'; + +export const routes: Routes = [ + { + path: '', + component: DeviceListComponent, + canActivate: [authGuard], + data: { + permission: 'Devices', + }, + resolve: { + list: deviceListResolver, + }, + }, + { + path: 'new', + component: DeviceDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Devices', + }, + resolve: { + item: deviceResolver, + sections: sectionListResolver, + }, + }, + { + path: ':id', + component: DeviceDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Devices', + }, + resolve: { + item: deviceResolver, + sections: sectionListResolver, + }, + }, +]; diff --git a/bookie/src/app/discount-report/discount-report-resolver.service.ts b/bookie/src/app/discount-report/discount-report-resolver.service.ts deleted file mode 100644 index 351c69f..0000000 --- a/bookie/src/app/discount-report/discount-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { DiscountReport } from './discount-report'; -import { DiscountReportService } from './discount-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class DiscountReportResolver { - constructor(private ser: DiscountReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/discount-report/discount-report-routing.module.spec.ts b/bookie/src/app/discount-report/discount-report-routing.module.spec.ts deleted file mode 100644 index dc77e2f..0000000 --- a/bookie/src/app/discount-report/discount-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DiscountReportRoutingModule } from './discount-report-routing.module'; - -describe('DiscountReportRoutingModule', () => { - let discountReportRoutingModule: DiscountReportRoutingModule; - - beforeEach(() => { - discountReportRoutingModule = new DiscountReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(discountReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/discount-report/discount-report-routing.module.ts b/bookie/src/app/discount-report/discount-report-routing.module.ts deleted file mode 100644 index beba62c..0000000 --- a/bookie/src/app/discount-report/discount-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { DiscountReportResolver } from './discount-report-resolver.service'; -import { DiscountReportComponent } from './discount-report.component'; - -const discountReportRoutes: Routes = [ - { - path: '', - component: DiscountReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Discount Report', - }, - resolve: { - info: DiscountReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(discountReportRoutes)], - exports: [RouterModule], - providers: [DiscountReportResolver], -}) -export class DiscountReportRoutingModule {} diff --git a/bookie/src/app/discount-report/discount-report.component.spec.ts b/bookie/src/app/discount-report/discount-report.component.spec.ts index aaacddb..dc5b0a6 100644 --- a/bookie/src/app/discount-report/discount-report.component.spec.ts +++ b/bookie/src/app/discount-report/discount-report.component.spec.ts @@ -8,7 +8,7 @@ describe('DiscountReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DiscountReportComponent], + imports: [DiscountReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/discount-report/discount-report.component.ts b/bookie/src/app/discount-report/discount-report.component.ts index 741dd4c..b2ad63a 100644 --- a/bookie/src/app/discount-report/discount-report.component.ts +++ b/bookie/src/app/discount-report/discount-report.component.ts @@ -1,7 +1,26 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToasterService } from '../core/toaster.service'; import { ToCsvService } from '../shared/to-csv.service'; @@ -14,6 +33,36 @@ import { DiscountReportService } from './discount-report.service'; selector: 'app-discount-report', templateUrl: './discount-report.component.html', styleUrls: ['./discount-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class DiscountReportComponent implements OnInit { info: DiscountReport = new DiscountReport(); @@ -72,14 +121,14 @@ export class DiscountReportComponent implements OnInit { } print() { - this.ser.print(this.info.startDate, this.info.finishDate).subscribe( - () => { + this.ser.print(this.info.startDate, this.info.finishDate).subscribe({ + next: () => { this.toaster.show('', 'Successfully Printed'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } exportCsv() { diff --git a/bookie/src/app/discount-report/discount-report.module.spec.ts b/bookie/src/app/discount-report/discount-report.module.spec.ts deleted file mode 100644 index 2d669b1..0000000 --- a/bookie/src/app/discount-report/discount-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DiscountReportModule } from './discount-report.module'; - -describe('DiscountReportModule', () => { - let discountReportModule: DiscountReportModule; - - beforeEach(() => { - discountReportModule = new DiscountReportModule(); - }); - - it('should create an instance', () => { - expect(discountReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/discount-report/discount-report.module.ts b/bookie/src/app/discount-report/discount-report.module.ts deleted file mode 100644 index 053c9ff..0000000 --- a/bookie/src/app/discount-report/discount-report.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { DiscountReportRoutingModule } from './discount-report-routing.module'; -import { DiscountReportComponent } from './discount-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - DiscountReportRoutingModule, - ], - declarations: [DiscountReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class DiscountReportModule {} diff --git a/bookie/src/app/discount-report/discount-report-resolver.service.spec.ts b/bookie/src/app/discount-report/discount-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/discount-report/discount-report-resolver.service.spec.ts rename to bookie/src/app/discount-report/discount-report.resolver.spec.ts diff --git a/bookie/src/app/discount-report/discount-report.resolver.ts b/bookie/src/app/discount-report/discount-report.resolver.ts new file mode 100644 index 0000000..59b0469 --- /dev/null +++ b/bookie/src/app/discount-report/discount-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { DiscountReport } from './discount-report'; +import { DiscountReportService } from './discount-report.service'; + +export const discountReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(DiscountReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/discount-report/discount-report.routes.ts b/bookie/src/app/discount-report/discount-report.routes.ts new file mode 100644 index 0000000..797e5da --- /dev/null +++ b/bookie/src/app/discount-report/discount-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { DiscountReportComponent } from './discount-report.component'; +import { discountReportResolver } from './discount-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: DiscountReportComponent, + canActivate: [authGuard], + data: { + permission: 'Discount Report', + }, + resolve: { + info: discountReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/guest-book/guest-book-detail-resolver.service.ts b/bookie/src/app/guest-book/guest-book-detail-resolver.service.ts deleted file mode 100644 index 6a35f2a..0000000 --- a/bookie/src/app/guest-book/guest-book-detail-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { GuestBook } from './guest-book'; -import { GuestBookService } from './guest-book.service'; - -@Injectable({ - providedIn: 'root', -}) -export class GuestBookDetailResolver { - constructor(private ser: GuestBookService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - const account = route.queryParamMap.get('t') || 'walk_in'; - return this.ser.get(id, account); - } -} diff --git a/bookie/src/app/guest-book/guest-book-detail.resolver.ts b/bookie/src/app/guest-book/guest-book-detail.resolver.ts new file mode 100644 index 0000000..ec58890 --- /dev/null +++ b/bookie/src/app/guest-book/guest-book-detail.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { GuestBook } from './guest-book'; +import { GuestBookService } from './guest-book.service'; + +export const guestBookDetailResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + const account = route.queryParamMap.get('t') || 'walk_in'; + return inject(GuestBookService).get(id, account); +}; diff --git a/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.html b/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.html index 9590868..6eebb8e 100644 --- a/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.html +++ b/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.html @@ -8,7 +8,9 @@ Name - Name is required + @if (form.controls['name'].hasError('required')) { + Name is required + }
@@ -22,9 +24,9 @@ [displayWith]="displayFn" (optionSelected)="selected($event)" > - {{ customer.name }} - {{ customer.phone }} + @for (customer of customers | async; track customer) { + {{ customer.name }} - {{ customer.phone }} + }
@@ -65,6 +67,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts b/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts index d70f159..a713dc1 100644 --- a/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts +++ b/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts @@ -1,9 +1,16 @@ +import { AsyncPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; +import { FormControl, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatError, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; @@ -18,6 +25,28 @@ import { GuestBookService } from '../guest-book.service'; selector: 'app-guest-book-detail', templateUrl: './guest-book-detail.component.html', styleUrls: ['./guest-book-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatError, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatCardActions, + MatButton, + AsyncPipe, + ], }) export class GuestBookDetailComponent implements OnInit, AfterViewInit { @ViewChild('phone', { static: true }) phoneElement?: ElementRef; @@ -104,15 +133,15 @@ export class GuestBookDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/guest-book'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } displayFn(customer?: Customer): string { diff --git a/bookie/src/app/guest-book/guest-book-list-resolver.service.ts b/bookie/src/app/guest-book/guest-book-list-resolver.service.ts deleted file mode 100644 index bfc33cd..0000000 --- a/bookie/src/app/guest-book/guest-book-list-resolver.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { GuestBookList } from './guest-book-list'; -import { GuestBookService } from './guest-book.service'; - -@Injectable({ - providedIn: 'root', -}) -export class GuestBookListResolver { - constructor(private ser: GuestBookService) {} - - resolve(): Observable { - return this.ser.list(null); - } -} diff --git a/bookie/src/app/guest-book/guest-book-list.resolver.ts b/bookie/src/app/guest-book/guest-book-list.resolver.ts new file mode 100644 index 0000000..0445394 --- /dev/null +++ b/bookie/src/app/guest-book/guest-book-list.resolver.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { GuestBookList } from './guest-book-list'; +import { GuestBookService } from './guest-book.service'; + +export const guestBookListResolver: ResolveFn = () => { + return inject(GuestBookService).list(null); +}; diff --git a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.html b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.html index 08ff957..7b9e8ce 100644 --- a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.html +++ b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.html @@ -62,32 +62,30 @@ Action - - + @if (row.status === 'old' || (!row.tableId && !row.voucherId)) { + + } + @if (row.tableId) { + + } + mat-stroked-button + color="primary" + [routerLink]="['/sales', 'bill']" + [queryParams]="{ voucher: row.voucherId }" + *ngIf="!row.tableId && row.voucherId" + > + {{ row.tableName }} + --> diff --git a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.sass b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.sass index c16f1d0..8af4334 100644 --- a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.sass +++ b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.sass @@ -1,7 +1,7 @@ @use '@angular/material' as mat -$my-primary: mat.define-palette(mat.$indigo-palette, 500) -$my-accent: mat.define-palette(mat.$amber-palette, A200, A100, A400) +$my-primary: mat.m2-define-palette(mat.$m2-indigo-palette, 500) +$my-accent: mat.m2-define-palette(mat.$m2-amber-palette, A200, A100, A400) table width: 100% @@ -12,13 +12,13 @@ table .accent /* Read the 200 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-accent, '200-contrast') - background: mat.get-color-from-palette($my-accent, 200) + color: mat.m2-get-color-from-palette($my-accent, '200-contrast') + background: mat.m2-get-color-from-palette($my-accent, 200) .strong-accent /* Read the 700 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-accent, '700-contrast') - background: mat.get-color-from-palette($my-accent, 700) + color: mat.m2-get-color-from-palette($my-accent, '700-contrast') + background: mat.m2-get-color-from-palette($my-accent, 700) .grey300 background-color: #ede7f6 diff --git a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts index 0732a5e..3d8ddd5 100644 --- a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts +++ b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts @@ -1,11 +1,30 @@ import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAnchor, MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; +import moment from 'moment'; import { BehaviorSubject } from 'rxjs'; import { map } from 'rxjs/operators'; import { ToasterService } from '../../core/toaster.service'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { GuestBook } from '../guest-book'; import { GuestBookList } from '../guest-book-list'; import { GuestBookService } from '../guest-book.service'; @@ -16,6 +35,38 @@ import { GuestBookListDataSource } from './guest-book-list-datasource'; selector: 'app-guest-book-list', templateUrl: './guest-book-list.component.html', styleUrls: ['./guest-book-list.component.sass'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatIconButton, + MatButton, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + LocalTimePipe, + ], }) export class GuestBookListComponent implements OnInit { data: BehaviorSubject = new BehaviorSubject([]); diff --git a/bookie/src/app/guest-book/guest-book-routing.module.ts b/bookie/src/app/guest-book/guest-book-routing.module.ts deleted file mode 100644 index 67422c2..0000000 --- a/bookie/src/app/guest-book/guest-book-routing.module.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { GuestBookDetailComponent } from './guest-book-detail/guest-book-detail.component'; -import { GuestBookDetailResolver } from './guest-book-detail-resolver.service'; -import { GuestBookListComponent } from './guest-book-list/guest-book-list.component'; -import { GuestBookListResolver } from './guest-book-list-resolver.service'; - -const routes: Routes = [ - { - path: '', - component: GuestBookListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Customers', - }, - resolve: { - list: GuestBookListResolver, - }, - runGuardsAndResolvers: 'always', - }, - { - path: 'new', - component: GuestBookDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Customers', - }, - resolve: { - item: GuestBookDetailResolver, - }, - }, - { - path: ':id', - component: GuestBookDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Customers', - }, - resolve: { - item: GuestBookDetailResolver, - }, - }, -]; - -@NgModule({ - declarations: [], - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], - providers: [GuestBookListResolver, GuestBookDetailResolver], -}) -export class GuestBookRoutingModule {} diff --git a/bookie/src/app/guest-book/guest-book.module.ts b/bookie/src/app/guest-book/guest-book.module.ts deleted file mode 100644 index 3dcaf84..0000000 --- a/bookie/src/app/guest-book/guest-book.module.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatNativeDateModule, MAT_DATE_FORMATS, MAT_DATE_LOCALE, DateAdapter } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { GuestBookDetailComponent } from './guest-book-detail/guest-book-detail.component'; -import { GuestBookListComponent } from './guest-book-list/guest-book-list.component'; -import { GuestBookRoutingModule } from './guest-book-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - declarations: [GuestBookDetailComponent, GuestBookListComponent], - imports: [ - CommonModule, - MatTableModule, - MatInputModule, - MatButtonModule, - MatSelectModule, - MatRadioModule, - MatCardModule, - MatIconModule, - MatDatepickerModule, - MatNativeDateModule, - ReactiveFormsModule, - GuestBookRoutingModule, - SharedModule, - MatAutocompleteModule, - ], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class GuestBookModule {} diff --git a/bookie/src/app/guest-book/guest-book.routes.ts b/bookie/src/app/guest-book/guest-book.routes.ts new file mode 100644 index 0000000..9d999c5 --- /dev/null +++ b/bookie/src/app/guest-book/guest-book.routes.ts @@ -0,0 +1,45 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { GuestBookDetailComponent } from './guest-book-detail/guest-book-detail.component'; +import { guestBookDetailResolver } from './guest-book-detail.resolver'; +import { GuestBookListComponent } from './guest-book-list/guest-book-list.component'; +import { guestBookListResolver } from './guest-book-list.resolver'; + +export const routes: Routes = [ + { + path: '', + component: GuestBookListComponent, + canActivate: [authGuard], + data: { + permission: 'Customers', + }, + resolve: { + list: guestBookListResolver, + }, + runGuardsAndResolvers: 'always', + }, + { + path: 'new', + component: GuestBookDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Customers', + }, + resolve: { + item: guestBookDetailResolver, + }, + }, + { + path: ':id', + component: GuestBookDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Customers', + }, + resolve: { + item: guestBookDetailResolver, + }, + }, +]; diff --git a/bookie/src/app/header-footer/header-footer-resolver.service.ts b/bookie/src/app/header-footer/header-footer-resolver.service.ts deleted file mode 100644 index 6e13135..0000000 --- a/bookie/src/app/header-footer/header-footer-resolver.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { HeaderFooter } from './header-footer'; -import { HeaderFooterService } from './header-footer.service'; - -@Injectable({ - providedIn: 'root', -}) -export class HeaderFooterResolver { - constructor(private ser: HeaderFooterService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/header-footer/header-footer-routing.module.spec.ts b/bookie/src/app/header-footer/header-footer-routing.module.spec.ts deleted file mode 100644 index 7ed1a28..0000000 --- a/bookie/src/app/header-footer/header-footer-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { HeaderFooterRoutingModule } from './header-footer-routing.module'; - -describe('HeaderFooterRoutingModule', () => { - let headerFooterRoutingModule: HeaderFooterRoutingModule; - - beforeEach(() => { - headerFooterRoutingModule = new HeaderFooterRoutingModule(); - }); - - it('should create an instance', () => { - expect(headerFooterRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/header-footer/header-footer-routing.module.ts b/bookie/src/app/header-footer/header-footer-routing.module.ts deleted file mode 100644 index 9a5d2e9..0000000 --- a/bookie/src/app/header-footer/header-footer-routing.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { HeaderFooterResolver } from './header-footer-resolver.service'; -import { HeaderFooterComponent } from './header-footer.component'; - -const headerRoutes: Routes = [ - { - path: '', - component: HeaderFooterComponent, - canActivate: [AuthGuard], - data: { - permission: 'Owner', - }, - resolve: { - list: HeaderFooterResolver, - }, - }, - { - path: ':id', - component: HeaderFooterComponent, - canActivate: [AuthGuard], - data: { - permission: 'Owner', - }, - resolve: { - list: HeaderFooterResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(headerRoutes)], - exports: [RouterModule], - providers: [HeaderFooterResolver], -}) -export class HeaderFooterRoutingModule {} diff --git a/bookie/src/app/header-footer/header-footer.component.html b/bookie/src/app/header-footer/header-footer.component.html index fc50c32..e1b4864 100644 --- a/bookie/src/app/header-footer/header-footer.component.html +++ b/bookie/src/app/header-footer/header-footer.component.html @@ -8,9 +8,11 @@ Header / Footer - - {{ s.name }} - + @for (s of list; track s) { + + {{ s.name }} + + }
diff --git a/bookie/src/app/header-footer/header-footer.component.spec.ts b/bookie/src/app/header-footer/header-footer.component.spec.ts index 9efacad..0fa0c91 100644 --- a/bookie/src/app/header-footer/header-footer.component.spec.ts +++ b/bookie/src/app/header-footer/header-footer.component.spec.ts @@ -8,7 +8,7 @@ describe('HeaderFooterComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [HeaderFooterComponent], + imports: [HeaderFooterComponent], }).compileComponents(); })); diff --git a/bookie/src/app/header-footer/header-footer.component.ts b/bookie/src/app/header-footer/header-footer.component.ts index 562608e..36d5de1 100644 --- a/bookie/src/app/header-footer/header-footer.component.ts +++ b/bookie/src/app/header-footer/header-footer.component.ts @@ -1,7 +1,13 @@ import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatSelectChange } from '@angular/material/select'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelectChange, MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { map } from 'rxjs/operators'; @@ -14,6 +20,22 @@ import { HeaderFooterService } from './header-footer.service'; selector: 'app-section-printer', templateUrl: './header-footer.component.html', styleUrls: ['./header-footer.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatSelect, + MatOption, + MatInput, + MatDivider, + MatCardActions, + MatButton, + ], }) export class HeaderFooterComponent implements OnInit { @ViewChild('section', { static: true }) sectionElement?: ElementRef; @@ -60,15 +82,15 @@ export class HeaderFooterComponent implements OnInit { } save() { - this.ser.save(this.getItem()).subscribe( - (result: HeaderFooter[]) => { + this.ser.save(this.getItem()).subscribe({ + next: (result: HeaderFooter[]) => { this.toaster.show('Success', ''); this.showItem(result); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } getItem(): HeaderFooter { diff --git a/bookie/src/app/header-footer/header-footer.module.spec.ts b/bookie/src/app/header-footer/header-footer.module.spec.ts deleted file mode 100644 index 4d21492..0000000 --- a/bookie/src/app/header-footer/header-footer.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { HeaderFooterModule } from './header-footer.module'; - -describe('HeaderFooterModule', () => { - let headerFooterModule: HeaderFooterModule; - - beforeEach(() => { - headerFooterModule = new HeaderFooterModule(); - }); - - it('should create an instance', () => { - expect(headerFooterModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/header-footer/header-footer.module.ts b/bookie/src/app/header-footer/header-footer.module.ts deleted file mode 100644 index 30daec7..0000000 --- a/bookie/src/app/header-footer/header-footer.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { HeaderFooterRoutingModule } from './header-footer-routing.module'; -import { HeaderFooterComponent } from './header-footer.component'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - HeaderFooterRoutingModule, - ], - declarations: [HeaderFooterComponent], -}) -export class HeaderFooterModule {} diff --git a/bookie/src/app/header-footer/header-footer-resolver.service.spec.ts b/bookie/src/app/header-footer/header-footer.resolver.spec.ts similarity index 100% rename from bookie/src/app/header-footer/header-footer-resolver.service.spec.ts rename to bookie/src/app/header-footer/header-footer.resolver.spec.ts diff --git a/bookie/src/app/header-footer/header-footer.resolver.ts b/bookie/src/app/header-footer/header-footer.resolver.ts new file mode 100644 index 0000000..6c90f11 --- /dev/null +++ b/bookie/src/app/header-footer/header-footer.resolver.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { HeaderFooter } from './header-footer'; +import { HeaderFooterService } from './header-footer.service'; + +export const headerFooterResolver: ResolveFn = () => { + return inject(HeaderFooterService).list(); +}; diff --git a/bookie/src/app/header-footer/header-footer.routes.ts b/bookie/src/app/header-footer/header-footer.routes.ts new file mode 100644 index 0000000..a5a8656 --- /dev/null +++ b/bookie/src/app/header-footer/header-footer.routes.ts @@ -0,0 +1,31 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { HeaderFooterComponent } from './header-footer.component'; +import { headerFooterResolver } from './header-footer.resolver'; + +export const routes: Routes = [ + { + path: '', + component: HeaderFooterComponent, + canActivate: [authGuard], + data: { + permission: 'Owner', + }, + resolve: { + list: headerFooterResolver, + }, + }, + { + path: ':id', + component: HeaderFooterComponent, + canActivate: [authGuard], + data: { + permission: 'Owner', + }, + resolve: { + list: headerFooterResolver, + }, + }, +]; diff --git a/bookie/src/app/home/home.component.html b/bookie/src/app/home/home.component.html index 83a8a7f..309952c 100644 --- a/bookie/src/app/home/home.component.html +++ b/bookie/src/app/home/home.component.html @@ -1,272 +1,176 @@
- -

Guest Book

-
- -

Sales

-
- -

Customers

-
+ @if (auth.allowed('customers')) { + +

Guest Book

+
+ } + @if (auth.allowed('sales')) { + +

Sales

+
+ } + @if (auth.allowed('customers')) { + +

Customers

+
+ }
- -

Cashier Report

-
- -

Sale Report

-
- -

Tax Report

-
- -

Product Sale Report

-
- -

Bill Settlement Report

-
- -

Beer Sale Report

-
- -

Discount Report

-
- -

Menu Engineering Report

-
+ @if (auth.allowed('cashier-report')) { + +

Cashier Report

+
+ } + @if (auth.allowed('sale-report')) { + +

Sale Report

+
+ } + @if (auth.allowed('tax-report')) { + +

Tax Report

+
+ } + @if (auth.allowed('product-sale-report')) { + +

Product Sale Report

+
+ } + @if (auth.allowed('bill-settlement-report')) { + +

Bill Settlement Report

+
+ } + @if (auth.allowed('beer-sale-report')) { + +

Beer Sale Report

+
+ } + @if (auth.allowed('discount-report')) { + +

Discount Report

+
+ } + @if (auth.allowed('product-sale-report')) { + +

Menu Engineering Report

+
+ }
- -

Products

-
- -

Temporal Products

-
- -

Update Product Prices

-
- -

Product Updates Report

-
- -

Modifiers

-
- -

Modifier Categories

-
+ @if (auth.allowed('products')) { + +

Products

+
+ } + @if (auth.allowed('temporal-products')) { + +

Temporal Products

+
+ } + @if (auth.allowed('products')) { + +

Update Product Prices

+
+ } + @if (auth.allowed('products')) { + +

Product Updates Report

+
+ } + @if (auth.allowed('modifiers')) { + +

Modifiers

+
+ } + @if (auth.allowed('modifiers')) { + +

Modifier Categories

+
+ }
- -

Tables

-
- -

Sections

-
- -

Menu Categories

-
- -

Sale Categories

-
- -

Taxes

-
- -

Regimes

-
- -

Devices

-
- -

Section Printers

-
- -

Printers

-
+ @if (auth.allowed('sections')) { + +

Tables

+
+ } + @if (auth.allowed('sections')) { + +

Sections

+
+ } + @if (auth.allowed('products')) { + +

Menu Categories

+
+ } + @if (auth.allowed('products')) { + +

Sale Categories

+
+ } + @if (auth.allowed('taxes')) { + +

Taxes

+
+ } + @if (auth.allowed('regimes')) { + +

Regimes

+
+ } + @if (auth.allowed('devices')) { + +

Devices

+
+ } + @if (auth.allowed('section-printers')) { + +

Section Printers

+
+ } + @if (auth.allowed('printers')) { + +

Printers

+
+ }
- -

Roles

-
- -

Users

-
- -

Change Password

-
- -

Header / Footer

-
- -

Settle Options

-
- -

Settings

-
+ @if (auth.allowed('users')) { + +

Roles

+
+ } + @if (auth.allowed('users')) { + +

Users

+
+ } + @if (auth.allowed('authenticated')) { + +

Change Password

+
+ } + @if (auth.allowed('owner')) { + +

Header / Footer

+
+ } + @if (auth.allowed('owner')) { + +

Settle Options

+
+ } + @if (auth.allowed('settings')) { + +

Settings

+
+ }

- Backend: v{{ auth.user?.ver }} / Frontend: v{{ version }} on {{ auth.device.name }} @ + Backend: v{{ auth.user?.ver }} / Frontend: v{{ version }} on {{ auth.device.name }} @ {{ auth.device.section.name }}

diff --git a/bookie/src/app/home/home.component.spec.ts b/bookie/src/app/home/home.component.spec.ts index d7c6165..8d7462c 100644 --- a/bookie/src/app/home/home.component.spec.ts +++ b/bookie/src/app/home/home.component.spec.ts @@ -8,7 +8,7 @@ describe('HomeComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [HomeComponent], + imports: [HomeComponent], }).compileComponents(); })); diff --git a/bookie/src/app/home/home.component.ts b/bookie/src/app/home/home.component.ts index 0571be3..b0714da 100644 --- a/bookie/src/app/home/home.component.ts +++ b/bookie/src/app/home/home.component.ts @@ -1,12 +1,16 @@ import { Component } from '@angular/core'; +import { MatCard } from '@angular/material/card'; +import { RouterLink } from '@angular/router'; -import { environment } from '../../environments/environment'; +import { environment } from '../app.environment'; import { AuthService } from '../auth/auth.service'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'], + standalone: true, + imports: [MatCard, RouterLink], }) export class HomeComponent { version: string; diff --git a/bookie/src/app/menu-category/menu-categories-routing.module.spec.ts b/bookie/src/app/menu-category/menu-categories-routing.module.spec.ts deleted file mode 100644 index fd07bb8..0000000 --- a/bookie/src/app/menu-category/menu-categories-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MenuCategoriesRoutingModule } from './menu-categories-routing.module'; - -describe('MenuCategoriesRoutingModule', () => { - let menuCategoriesRoutingModule: MenuCategoriesRoutingModule; - - beforeEach(() => { - menuCategoriesRoutingModule = new MenuCategoriesRoutingModule(); - }); - - it('should create an instance', () => { - expect(menuCategoriesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/menu-category/menu-categories-routing.module.ts b/bookie/src/app/menu-category/menu-categories-routing.module.ts deleted file mode 100644 index 73ca56f..0000000 --- a/bookie/src/app/menu-category/menu-categories-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { MenuCategoryDetailComponent } from './menu-category-detail/menu-category-detail.component'; -import { MenuCategoryListComponent } from './menu-category-list/menu-category-list.component'; -import { MenuCategoryListResolver } from './menu-category-list-resolver.service'; -import { MenuCategoryResolver } from './menu-category-resolver.service'; - -const menuCategoriesRoutes: Routes = [ - { - path: '', - component: MenuCategoryListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - list: MenuCategoryListResolver, - }, - }, - { - path: 'new', - component: MenuCategoryDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - item: MenuCategoryResolver, - }, - }, - { - path: ':id', - component: MenuCategoryDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - item: MenuCategoryResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(menuCategoriesRoutes)], - exports: [RouterModule], - providers: [MenuCategoryListResolver, MenuCategoryResolver], -}) -export class MenuCategoriesRoutingModule {} diff --git a/bookie/src/app/menu-category/menu-categories.module.spec.ts b/bookie/src/app/menu-category/menu-categories.module.spec.ts deleted file mode 100644 index 39154a5..0000000 --- a/bookie/src/app/menu-category/menu-categories.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MenuCategoriesModule } from './menu-categories.module'; - -describe('MenuCategoriesModule', () => { - let menuCategoriesModule: MenuCategoriesModule; - - beforeEach(() => { - menuCategoriesModule = new MenuCategoriesModule(); - }); - - it('should create an instance', () => { - expect(menuCategoriesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/menu-category/menu-categories.module.ts b/bookie/src/app/menu-category/menu-categories.module.ts deleted file mode 100644 index 225df85..0000000 --- a/bookie/src/app/menu-category/menu-categories.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { MenuCategoriesRoutingModule } from './menu-categories-routing.module'; -import { MenuCategoryDetailComponent } from './menu-category-detail/menu-category-detail.component'; -import { MenuCategoryListComponent } from './menu-category-list/menu-category-list.component'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - DragDropModule, - MatTableModule, - MatCardModule, - MatCheckboxModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - ReactiveFormsModule, - MenuCategoriesRoutingModule, - ], - declarations: [MenuCategoryListComponent, MenuCategoryDetailComponent], -}) -export class MenuCategoriesModule {} diff --git a/bookie/src/app/menu-category/menu-categories.routes.ts b/bookie/src/app/menu-category/menu-categories.routes.ts new file mode 100644 index 0000000..370ac95 --- /dev/null +++ b/bookie/src/app/menu-category/menu-categories.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { MenuCategoryDetailComponent } from './menu-category-detail/menu-category-detail.component'; +import { MenuCategoryListComponent } from './menu-category-list/menu-category-list.component'; +import { menuCategoryListResolver } from './menu-category-list.resolver'; +import { menuCategoryResolver } from './menu-category.resolver'; + +export const routes: Routes = [ + { + path: '', + component: MenuCategoryListComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + list: menuCategoryListResolver, + }, + }, + { + path: 'new', + component: MenuCategoryDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + item: menuCategoryResolver, + }, + }, + { + path: ':id', + component: MenuCategoryDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + item: menuCategoryResolver, + }, + }, +]; diff --git a/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.html b/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.html index b798e21..d10d973 100644 --- a/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.html +++ b/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.html @@ -17,8 +17,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.spec.ts b/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.spec.ts index 121b09f..3f1ccd4 100644 --- a/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.spec.ts +++ b/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('MenuCategoryDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MenuCategoryDetailComponent], + imports: [MenuCategoryDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.ts b/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.ts index 4e38dc2..7277189 100644 --- a/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.ts +++ b/bookie/src/app/menu-category/menu-category-detail/menu-category-detail.component.ts @@ -1,6 +1,11 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { MenuCategory } from '../../core/menu-category'; @@ -12,6 +17,20 @@ import { MenuCategoryService } from '../menu-category.service'; selector: 'app-menu-category-detail', templateUrl: './menu-category-detail.component.html', styleUrls: ['./menu-category-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class MenuCategoryDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -60,27 +79,27 @@ export class MenuCategoryDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/menu-categories'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/menu-categories'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/menu-category/menu-category-list-resolver.service.ts b/bookie/src/app/menu-category/menu-category-list-resolver.service.ts deleted file mode 100644 index 4a00fd9..0000000 --- a/bookie/src/app/menu-category/menu-category-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { MenuCategory } from '../core/menu-category'; - -import { MenuCategoryService } from './menu-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class MenuCategoryListResolver { - constructor(private ser: MenuCategoryService) {} - - resolve(): Observable { - return this.ser.list(false); - } -} diff --git a/bookie/src/app/menu-category/menu-category-list-resolver.service.spec.ts b/bookie/src/app/menu-category/menu-category-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/menu-category/menu-category-list-resolver.service.spec.ts rename to bookie/src/app/menu-category/menu-category-list.resolver.spec.ts diff --git a/bookie/src/app/menu-category/menu-category-list.resolver.ts b/bookie/src/app/menu-category/menu-category-list.resolver.ts new file mode 100644 index 0000000..6f19b33 --- /dev/null +++ b/bookie/src/app/menu-category/menu-category-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { MenuCategory } from '../core/menu-category'; + +import { MenuCategoryService } from './menu-category.service'; + +export const menuCategoryListResolver: ResolveFn = () => { + return inject(MenuCategoryService).list(false); +}; diff --git a/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.spec.ts b/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.spec.ts index 9b04010..4249af0 100644 --- a/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.spec.ts +++ b/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.spec.ts @@ -8,7 +8,7 @@ describe('MenuCategoryListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [MenuCategoryListComponent], + imports: [MenuCategoryListComponent], }).compileComponents(); fixture = TestBed.createComponent(MenuCategoryListComponent); diff --git a/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.ts b/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.ts index 34cefde..3926b72 100644 --- a/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.ts +++ b/bookie/src/app/menu-category/menu-category-list/menu-category-list.component.ts @@ -1,7 +1,21 @@ -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CdkDragDrop, moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatTable } from '@angular/material/table'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatButton, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { MenuCategory } from '../../core/menu-category'; @@ -14,6 +28,30 @@ import { MenuCategoryListDatasource } from './menu-category-list-datasource'; selector: 'app-menu-category-list', templateUrl: './menu-category-list.component.html', styleUrls: ['./menu-category-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatButton, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + CdkDropList, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CdkDrag, + ], }) export class MenuCategoryListComponent implements OnInit { @ViewChild('table', { static: true }) table?: MatTable; @@ -43,14 +81,14 @@ export class MenuCategoryListComponent implements OnInit { } updateSortOrder() { - this.ser.updateSortOrder(this.list).subscribe( - () => { + this.ser.updateSortOrder(this.list).subscribe({ + next: () => { this.toaster.show('Success', ''); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } dropTable(event: CdkDragDrop) { diff --git a/bookie/src/app/menu-category/menu-category-resolver.service.ts b/bookie/src/app/menu-category/menu-category-resolver.service.ts deleted file mode 100644 index d9a1a10..0000000 --- a/bookie/src/app/menu-category/menu-category-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { MenuCategory } from '../core/menu-category'; - -import { MenuCategoryService } from './menu-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class MenuCategoryResolver { - constructor(private ser: MenuCategoryService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/menu-category/menu-category-resolver.service.spec.ts b/bookie/src/app/menu-category/menu-category.resolver.spec.ts similarity index 100% rename from bookie/src/app/menu-category/menu-category-resolver.service.spec.ts rename to bookie/src/app/menu-category/menu-category.resolver.spec.ts diff --git a/bookie/src/app/menu-category/menu-category.resolver.ts b/bookie/src/app/menu-category/menu-category.resolver.ts new file mode 100644 index 0000000..8eff911 --- /dev/null +++ b/bookie/src/app/menu-category/menu-category.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { MenuCategory } from '../core/menu-category'; + +import { MenuCategoryService } from './menu-category.service'; + +export const menuCategoryResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(MenuCategoryService).get(id); +}; diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report-datasource.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report-datasource.ts index f6788e1..b8b0cc2 100644 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report-datasource.ts +++ b/bookie/src/app/menu-engineering-report/menu-engineering-report-datasource.ts @@ -65,13 +65,13 @@ export class MenuEngineeringReportDataSource extends DataSource=|<=|>=|<|>)(?\d*)$/); if (result && result.groups) { - return math_it_up(result.groups['sign'])(x.quantity, +result.groups['amount'] ?? ''); + return math_it_up(result.groups['sign'])(x.quantity, +result.groups['amount']); } } if (c.startsWith('s:')) { const result = c.match(/^s:(?=|<=|>=|<|>)(?\d*)$/); if (result && result.groups) { - return math_it_up(result.groups['sign'])(x.sales, +result.groups['amount'] ?? ''); + return math_it_up(result.groups['sign'])(x.sales, +result.groups['amount']); } } const itemString = `${x.name} ${x.saleCategory} ${x.menuCategory}`.toLowerCase(); diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report-resolver.service.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report-resolver.service.ts deleted file mode 100644 index 2d8596c..0000000 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { MenuEngineeringReport } from './menu-engineering-report'; -import { MenuEngineeringReportService } from './menu-engineering-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class MenuEngineeringReportResolver { - constructor(private ser: MenuEngineeringReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report-routing.module.spec.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report-routing.module.spec.ts deleted file mode 100644 index 93b8e28..0000000 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MenuEngineeringReportRoutingModule } from './menu-engineering-report-routing.module'; - -describe('MenuEngineeringReportRoutingModule', () => { - let menuEngineeringReportRoutingModule: MenuEngineeringReportRoutingModule; - - beforeEach(() => { - menuEngineeringReportRoutingModule = new MenuEngineeringReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(menuEngineeringReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report-routing.module.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report-routing.module.ts deleted file mode 100644 index 1a72a81..0000000 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { MenuEngineeringReportResolver } from './menu-engineering-report-resolver.service'; -import { MenuEngineeringReportComponent } from './menu-engineering-report.component'; - -const menuEngineeringReportRoutes: Routes = [ - { - path: '', - component: MenuEngineeringReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Product Sale Report', - }, - resolve: { - info: MenuEngineeringReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(menuEngineeringReportRoutes)], - exports: [RouterModule], - providers: [MenuEngineeringReportResolver], -}) -export class MenuEngineeringReportRoutingModule {} diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.component.spec.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.component.spec.ts index 709d5b3..183c418 100644 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report.component.spec.ts +++ b/bookie/src/app/menu-engineering-report/menu-engineering-report.component.spec.ts @@ -8,7 +8,7 @@ describe('MenuEngineeringReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MenuEngineeringReportComponent], + imports: [MenuEngineeringReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts index eb653d3..51e849c 100644 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts +++ b/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts @@ -1,9 +1,28 @@ +import { DecimalPipe, PercentPipe } from '@angular/common'; import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix, MatHint } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; +import { MatSort, MatSortHeader } from '@angular/material/sort'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; @@ -18,6 +37,41 @@ import { MenuEngineeringReportService } from './menu-engineering-report.service' selector: 'app-menu-engineering-report', templateUrl: './menu-engineering-report.component.html', styleUrls: ['./menu-engineering-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatHint, + MatTable, + MatSort, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatSortHeader, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatPaginator, + DecimalPipe, + PercentPipe, + ], }) export class MenuEngineeringReportComponent implements OnInit { @ViewChild('filterElement', { static: true }) filterElement?: ElementRef; @@ -86,14 +140,14 @@ export class MenuEngineeringReportComponent implements OnInit { } print() { - this.ser.print(this.info.startDate, this.info.finishDate).subscribe( - () => { + this.ser.print(this.info.startDate, this.info.finishDate).subscribe({ + next: () => { this.toaster.show('', 'Successfully Printed'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } exportCsv() { diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.module.spec.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.module.spec.ts deleted file mode 100644 index 9efc1d7..0000000 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MenuEngineeringReportModule } from './menu-engineering-report.module'; - -describe('MenuEngineeringReportModule', () => { - let menuEngineeringReportModule: MenuEngineeringReportModule; - - beforeEach(() => { - menuEngineeringReportModule = new MenuEngineeringReportModule(); - }); - - it('should create an instance', () => { - expect(menuEngineeringReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.module.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.module.ts deleted file mode 100644 index 84896ff..0000000 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report.module.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { MenuEngineeringReportRoutingModule } from './menu-engineering-report-routing.module'; -import { MenuEngineeringReportComponent } from './menu-engineering-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - MenuEngineeringReportRoutingModule, - ], - declarations: [MenuEngineeringReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class MenuEngineeringReportModule {} diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report-resolver.service.spec.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/menu-engineering-report/menu-engineering-report-resolver.service.spec.ts rename to bookie/src/app/menu-engineering-report/menu-engineering-report.resolver.spec.ts diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.resolver.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.resolver.ts new file mode 100644 index 0000000..d479230 --- /dev/null +++ b/bookie/src/app/menu-engineering-report/menu-engineering-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { MenuEngineeringReport } from './menu-engineering-report'; +import { MenuEngineeringReportService } from './menu-engineering-report.service'; + +export const menuEngineeringReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(MenuEngineeringReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.routes.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.routes.ts new file mode 100644 index 0000000..f0e507d --- /dev/null +++ b/bookie/src/app/menu-engineering-report/menu-engineering-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { MenuEngineeringReportComponent } from './menu-engineering-report.component'; +import { menuEngineeringReportResolver } from './menu-engineering-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: MenuEngineeringReportComponent, + canActivate: [authGuard], + data: { + permission: 'Product Sale Report', + }, + resolve: { + info: menuEngineeringReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/modifier-categories/modifier-categories-routing.module.spec.ts b/bookie/src/app/modifier-categories/modifier-categories-routing.module.spec.ts deleted file mode 100644 index 8a9c6c3..0000000 --- a/bookie/src/app/modifier-categories/modifier-categories-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ModifierCategoriesRoutingModule } from './modifier-categories-routing.module'; - -describe('ModifierCategoriesRoutingModule', () => { - let rolesRoutingModule: ModifierCategoriesRoutingModule; - - beforeEach(() => { - rolesRoutingModule = new ModifierCategoriesRoutingModule(); - }); - - it('should create an instance', () => { - expect(rolesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/modifier-categories/modifier-categories-routing.module.ts b/bookie/src/app/modifier-categories/modifier-categories-routing.module.ts deleted file mode 100644 index b72f3c7..0000000 --- a/bookie/src/app/modifier-categories/modifier-categories-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { ModifierCategoryDetailComponent } from './modifier-category-detail/modifier-category-detail.component'; -import { ModifierCategoryListComponent } from './modifier-category-list/modifier-category-list.component'; -import { ModifierCategoryListResolver } from './modifier-category-list-resolver.service'; -import { ModifierCategoryResolver } from './modifier-category-resolver.service'; - -const modifierCategoriesRoutes: Routes = [ - { - path: '', - component: ModifierCategoryListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Modifiers', - }, - resolve: { - list: ModifierCategoryListResolver, - }, - }, - { - path: 'new', - component: ModifierCategoryDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Modifiers', - }, - resolve: { - item: ModifierCategoryResolver, - }, - }, - { - path: ':id', - component: ModifierCategoryDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Modifiers', - }, - resolve: { - item: ModifierCategoryResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(modifierCategoriesRoutes)], - exports: [RouterModule], - providers: [ModifierCategoryListResolver, ModifierCategoryResolver], -}) -export class ModifierCategoriesRoutingModule {} diff --git a/bookie/src/app/modifier-categories/modifier-categories.module.spec.ts b/bookie/src/app/modifier-categories/modifier-categories.module.spec.ts deleted file mode 100644 index 7b34a0b..0000000 --- a/bookie/src/app/modifier-categories/modifier-categories.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ModifierCategoriesModule } from './modifier-categories.module'; - -describe('ModifierCategoriesModule', () => { - let rolesModule: ModifierCategoriesModule; - - beforeEach(() => { - rolesModule = new ModifierCategoriesModule(); - }); - - it('should create an instance', () => { - expect(rolesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/modifier-categories/modifier-categories.module.ts b/bookie/src/app/modifier-categories/modifier-categories.module.ts deleted file mode 100644 index 3fd615c..0000000 --- a/bookie/src/app/modifier-categories/modifier-categories.module.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CdkTreeModule } from '@angular/cdk/tree'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; -import { MatTreeModule } from '@angular/material/tree'; - -import { SharedModule } from '../shared/shared.module'; - -import { ModifierCategoriesRoutingModule } from './modifier-categories-routing.module'; -import { ModifierCategoryDetailComponent } from './modifier-category-detail/modifier-category-detail.component'; -import { ModifierCategoryListComponent } from './modifier-category-list/modifier-category-list.component'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - CdkTreeModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - MatTreeModule, - ReactiveFormsModule, - SharedModule, - ModifierCategoriesRoutingModule, - ], - declarations: [ModifierCategoryListComponent, ModifierCategoryDetailComponent], -}) -export class ModifierCategoriesModule {} diff --git a/bookie/src/app/modifier-categories/modifier-categories.routes.ts b/bookie/src/app/modifier-categories/modifier-categories.routes.ts new file mode 100644 index 0000000..5426f53 --- /dev/null +++ b/bookie/src/app/modifier-categories/modifier-categories.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { ModifierCategoryDetailComponent } from './modifier-category-detail/modifier-category-detail.component'; +import { ModifierCategoryListComponent } from './modifier-category-list/modifier-category-list.component'; +import { modifierCategoryListResolver } from './modifier-category-list.resolver'; +import { modifierCategoryResolver } from './modifier-category.resolver'; + +export const routes: Routes = [ + { + path: '', + component: ModifierCategoryListComponent, + canActivate: [authGuard], + data: { + permission: 'Modifiers', + }, + resolve: { + list: modifierCategoryListResolver, + }, + }, + { + path: 'new', + component: ModifierCategoryDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Modifiers', + }, + resolve: { + item: modifierCategoryResolver, + }, + }, + { + path: ':id', + component: ModifierCategoryDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Modifiers', + }, + resolve: { + item: modifierCategoryResolver, + }, + }, +]; diff --git a/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.spec.ts b/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.spec.ts index 4d54d5e..b21bc47 100644 --- a/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.spec.ts +++ b/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('ModifierCategoryDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ModifierCategoryDetailComponent], + imports: [ModifierCategoryDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.ts b/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.ts index f5599c0..a59cb27 100644 --- a/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.ts +++ b/bookie/src/app/modifier-categories/modifier-category-detail/modifier-category-detail.component.ts @@ -1,8 +1,23 @@ import { NestedTreeControl } from '@angular/cdk/tree'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; -import { MatTreeNestedDataSource } from '@angular/material/tree'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTreeNestedDataSource, + MatTree, + MatTreeNodeDef, + MatTreeNode, + MatTreeNodeToggle, + MatNestedTreeNode, + MatTreeNodeOutlet, +} from '@angular/material/tree'; import { ActivatedRoute, Router } from '@angular/router'; import { map } from 'rxjs/operators'; @@ -18,6 +33,29 @@ import { NodeItem } from '../node-item'; selector: 'app-role-detail', templateUrl: './modifier-category-detail.component.html', styleUrls: ['./modifier-category-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatDivider, + MatTree, + MatTreeNodeDef, + MatTreeNode, + MatTreeNodeToggle, + MatIconButton, + MatNestedTreeNode, + MatIcon, + MatTreeNodeOutlet, + MatCardActions, + MatButton, + ], }) export class ModifierCategoryDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -106,27 +144,27 @@ export class ModifierCategoryDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/modifier-categories'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/modifier-categories'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/modifier-categories/modifier-category-list-resolver.service.ts b/bookie/src/app/modifier-categories/modifier-category-list-resolver.service.ts deleted file mode 100644 index e396098..0000000 --- a/bookie/src/app/modifier-categories/modifier-category-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { ModifierCategory } from '../core/modifier-category'; - -import { ModifierCategoryService } from './modifier-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ModifierCategoryListResolver { - constructor(private ser: ModifierCategoryService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/modifier-categories/modifier-category-list-resolver.service.spec.ts b/bookie/src/app/modifier-categories/modifier-category-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/modifier-categories/modifier-category-list-resolver.service.spec.ts rename to bookie/src/app/modifier-categories/modifier-category-list.resolver.spec.ts diff --git a/bookie/src/app/modifier-categories/modifier-category-list.resolver.ts b/bookie/src/app/modifier-categories/modifier-category-list.resolver.ts new file mode 100644 index 0000000..b4d9b97 --- /dev/null +++ b/bookie/src/app/modifier-categories/modifier-category-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { ModifierCategory } from '../core/modifier-category'; + +import { ModifierCategoryService } from './modifier-category.service'; + +export const modifierCategoryListResolver: ResolveFn = () => { + return inject(ModifierCategoryService).list(); +}; diff --git a/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.html b/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.html index 8d1bc46..dc04949 100644 --- a/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.html +++ b/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.html @@ -46,12 +46,18 @@ Products
    -
  • - {{ mc.name }} -
      -
    • {{ p.name }}
    • -
    -
  • + @for (mc of row.menuCategories; track mc) { +
  • + {{ mc.name }} + @if (!mc.enabled) { +
      + @for (p of mc.products; track p) { +
    • {{ p.name }}
    • + } +
    + } +
  • + }
diff --git a/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.spec.ts b/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.spec.ts index 5868852..90139b8 100644 --- a/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.spec.ts +++ b/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.spec.ts @@ -8,7 +8,7 @@ describe('ModifierCategoryListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [ModifierCategoryListComponent], + imports: [ModifierCategoryListComponent], }).compileComponents(); fixture = TestBed.createComponent(ModifierCategoryListComponent); diff --git a/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.ts b/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.ts index 8983d93..4ca58d1 100644 --- a/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.ts +++ b/bookie/src/app/modifier-categories/modifier-category-list/modifier-category-list.component.ts @@ -1,5 +1,20 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { ModifierCategory } from '../../core/modifier-category'; @@ -9,6 +24,27 @@ import { ModifierCategoryListDatasource } from './modifier-category-list-datasou selector: 'app-modifier-category-list', templateUrl: './modifier-category-list.component.html', styleUrls: ['./modifier-category-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class ModifierCategoryListComponent implements OnInit { list: ModifierCategory[] = []; diff --git a/bookie/src/app/modifier-categories/modifier-category-resolver.service.ts b/bookie/src/app/modifier-categories/modifier-category-resolver.service.ts deleted file mode 100644 index 14ec2ff..0000000 --- a/bookie/src/app/modifier-categories/modifier-category-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { ModifierCategory } from '../core/modifier-category'; - -import { ModifierCategoryService } from './modifier-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ModifierCategoryResolver { - constructor(private ser: ModifierCategoryService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/modifier-categories/modifier-category-resolver.service.spec.ts b/bookie/src/app/modifier-categories/modifier-category.resolver.spec.ts similarity index 100% rename from bookie/src/app/modifier-categories/modifier-category-resolver.service.spec.ts rename to bookie/src/app/modifier-categories/modifier-category.resolver.spec.ts diff --git a/bookie/src/app/modifier-categories/modifier-category.resolver.ts b/bookie/src/app/modifier-categories/modifier-category.resolver.ts new file mode 100644 index 0000000..eaaa523 --- /dev/null +++ b/bookie/src/app/modifier-categories/modifier-category.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { ModifierCategory } from '../core/modifier-category'; + +import { ModifierCategoryService } from './modifier-category.service'; + +export const modifierCategoryResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(ModifierCategoryService).get(id); +}; diff --git a/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.html b/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.html index f782d18..fbcf1fa 100644 --- a/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.html +++ b/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.html @@ -23,9 +23,11 @@ Category - - {{ mc.name }} - + @for (mc of modifierCategories; track mc) { + + {{ mc.name }} + + } @@ -36,6 +38,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.spec.ts b/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.spec.ts index 2fde7b4..a5830c3 100644 --- a/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.spec.ts +++ b/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('ModifierDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ModifierDetailComponent], + imports: [ModifierDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.ts b/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.ts index 08f3aa1..b308892 100644 --- a/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.ts +++ b/bookie/src/app/modifiers/modifier-detail/modifier-detail.component.ts @@ -1,6 +1,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { Modifier } from '../../core/modifier'; @@ -13,6 +20,22 @@ import { ModifierService } from '../modifier.service'; selector: 'app-modifier-detail', templateUrl: './modifier-detail.component.html', styleUrls: ['./modifier-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatSelect, + MatOption, + MatCardActions, + MatButton, + ], }) export class ModifierDetailComponent implements OnInit, AfterViewInit { @ViewChild('name', { static: true }) nameElement?: ElementRef; @@ -72,27 +95,27 @@ export class ModifierDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/modifiers'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/modifiers'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/modifiers/modifier-list-resolver.service.ts b/bookie/src/app/modifiers/modifier-list-resolver.service.ts deleted file mode 100644 index 2928260..0000000 --- a/bookie/src/app/modifiers/modifier-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Modifier } from '../core/modifier'; - -import { ModifierService } from './modifier.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ModifierListResolver { - constructor(private ser: ModifierService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/modifiers/modifier-list-resolver.service.spec.ts b/bookie/src/app/modifiers/modifier-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/modifiers/modifier-list-resolver.service.spec.ts rename to bookie/src/app/modifiers/modifier-list.resolver.spec.ts diff --git a/bookie/src/app/modifiers/modifier-list.resolver.ts b/bookie/src/app/modifiers/modifier-list.resolver.ts new file mode 100644 index 0000000..c7a1cb8 --- /dev/null +++ b/bookie/src/app/modifiers/modifier-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Modifier } from '../core/modifier'; + +import { ModifierService } from './modifier.service'; + +export const modifierListResolver: ResolveFn = () => { + return inject(ModifierService).list(); +}; diff --git a/bookie/src/app/modifiers/modifier-list/modifier-list.component.html b/bookie/src/app/modifiers/modifier-list/modifier-list.component.html index 3bff255..829e2d1 100644 --- a/bookie/src/app/modifiers/modifier-list/modifier-list.component.html +++ b/bookie/src/app/modifiers/modifier-list/modifier-list.component.html @@ -15,9 +15,11 @@ Modifier Category -- All Categories -- - - {{ mc.name }} - + @for (mc of modifierCategories; track mc) { + + {{ mc.name }} + + } diff --git a/bookie/src/app/modifiers/modifier-list/modifier-list.component.spec.ts b/bookie/src/app/modifiers/modifier-list/modifier-list.component.spec.ts index cea6910..a7f7b43 100644 --- a/bookie/src/app/modifiers/modifier-list/modifier-list.component.spec.ts +++ b/bookie/src/app/modifiers/modifier-list/modifier-list.component.spec.ts @@ -8,7 +8,7 @@ describe('ModifierListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [ModifierListComponent], + imports: [ModifierListComponent], }).compileComponents(); fixture = TestBed.createComponent(ModifierListComponent); diff --git a/bookie/src/app/modifiers/modifier-list/modifier-list.component.ts b/bookie/src/app/modifiers/modifier-list/modifier-list.component.ts index c5085e6..fc926d2 100644 --- a/bookie/src/app/modifiers/modifier-list/modifier-list.component.ts +++ b/bookie/src/app/modifiers/modifier-list/modifier-list.component.ts @@ -1,8 +1,25 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; -import { ActivatedRoute, Router } from '@angular/router'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatSelectChange, MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { Modifier } from '../../core/modifier'; @@ -14,6 +31,33 @@ import { ModifierListDataSource } from './modifier-list-datasource'; selector: 'app-modifier-list', templateUrl: './modifier-list.component.html', styleUrls: ['./modifier-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatSelect, + MatOption, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class ModifierListComponent implements OnInit { @ViewChild('table', { static: true }) table?: MatTable; diff --git a/bookie/src/app/modifiers/modifier-resolver.service.ts b/bookie/src/app/modifiers/modifier-resolver.service.ts deleted file mode 100644 index 20456b4..0000000 --- a/bookie/src/app/modifiers/modifier-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Modifier } from '../core/modifier'; - -import { ModifierService } from './modifier.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ModifierResolver { - constructor(private ser: ModifierService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/modifiers/modifier-resolver.service.spec.ts b/bookie/src/app/modifiers/modifier.resolver.spec.ts similarity index 100% rename from bookie/src/app/modifiers/modifier-resolver.service.spec.ts rename to bookie/src/app/modifiers/modifier.resolver.spec.ts diff --git a/bookie/src/app/modifiers/modifier.resolver.ts b/bookie/src/app/modifiers/modifier.resolver.ts new file mode 100644 index 0000000..0663681 --- /dev/null +++ b/bookie/src/app/modifiers/modifier.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Modifier } from '../core/modifier'; + +import { ModifierService } from './modifier.service'; + +export const modifierResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(ModifierService).get(id); +}; diff --git a/bookie/src/app/modifiers/modifiers-routing.module.spec.ts b/bookie/src/app/modifiers/modifiers-routing.module.spec.ts deleted file mode 100644 index 5811810..0000000 --- a/bookie/src/app/modifiers/modifiers-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ModifiersRoutingModule } from './modifiers-routing.module'; - -describe('ModifiersRoutingModule', () => { - let modifiersRoutingModule: ModifiersRoutingModule; - - beforeEach(() => { - modifiersRoutingModule = new ModifiersRoutingModule(); - }); - - it('should create an instance', () => { - expect(modifiersRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/modifiers/modifiers-routing.module.ts b/bookie/src/app/modifiers/modifiers-routing.module.ts deleted file mode 100644 index 7616989..0000000 --- a/bookie/src/app/modifiers/modifiers-routing.module.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { ModifierCategoryListResolver } from '../modifier-categories/modifier-category-list-resolver.service'; - -import { ModifierDetailComponent } from './modifier-detail/modifier-detail.component'; -import { ModifierListComponent } from './modifier-list/modifier-list.component'; -import { ModifierListResolver } from './modifier-list-resolver.service'; -import { ModifierResolver } from './modifier-resolver.service'; - -const modifiersRoutes: Routes = [ - { - path: '', - component: ModifierListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Modifiers', - }, - resolve: { - list: ModifierListResolver, - modifierCategories: ModifierCategoryListResolver, - }, - }, - { - path: 'new', - component: ModifierDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Modifiers', - }, - resolve: { - item: ModifierResolver, - modifierCategories: ModifierCategoryListResolver, - }, - }, - { - path: ':id', - component: ModifierDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Modifiers', - }, - resolve: { - item: ModifierResolver, - modifierCategories: ModifierCategoryListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(modifiersRoutes)], - exports: [RouterModule], - providers: [ModifierListResolver, ModifierResolver], -}) -export class ModifiersRoutingModule {} diff --git a/bookie/src/app/modifiers/modifiers.module.spec.ts b/bookie/src/app/modifiers/modifiers.module.spec.ts deleted file mode 100644 index 8356385..0000000 --- a/bookie/src/app/modifiers/modifiers.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ModifiersModule } from './modifiers.module'; - -describe('ModifiersModule', () => { - let modifiersModule: ModifiersModule; - - beforeEach(() => { - modifiersModule = new ModifiersModule(); - }); - - it('should create an instance', () => { - expect(modifiersModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/modifiers/modifiers.module.ts b/bookie/src/app/modifiers/modifiers.module.ts deleted file mode 100644 index 45a2569..0000000 --- a/bookie/src/app/modifiers/modifiers.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { ModifierDetailComponent } from './modifier-detail/modifier-detail.component'; -import { ModifierListComponent } from './modifier-list/modifier-list.component'; -import { ModifiersRoutingModule } from './modifiers-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - MatTableModule, - MatCardModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - ModifiersRoutingModule, - ], - declarations: [ModifierListComponent, ModifierDetailComponent], -}) -export class ModifiersModule {} diff --git a/bookie/src/app/modifiers/modifiers.routes.ts b/bookie/src/app/modifiers/modifiers.routes.ts new file mode 100644 index 0000000..334716c --- /dev/null +++ b/bookie/src/app/modifiers/modifiers.routes.ts @@ -0,0 +1,48 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { modifierCategoryListResolver } from '../modifier-categories/modifier-category-list.resolver'; + +import { ModifierDetailComponent } from './modifier-detail/modifier-detail.component'; +import { ModifierListComponent } from './modifier-list/modifier-list.component'; +import { modifierListResolver } from './modifier-list.resolver'; +import { modifierResolver } from './modifier.resolver'; + +export const routes: Routes = [ + { + path: '', + component: ModifierListComponent, + canActivate: [authGuard], + data: { + permission: 'Modifiers', + }, + resolve: { + list: modifierListResolver, + modifierCategories: modifierCategoryListResolver, + }, + }, + { + path: 'new', + component: ModifierDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Modifiers', + }, + resolve: { + item: modifierResolver, + modifierCategories: modifierCategoryListResolver, + }, + }, + { + path: ':id', + component: ModifierDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Modifiers', + }, + resolve: { + item: modifierResolver, + modifierCategories: modifierCategoryListResolver, + }, + }, +]; diff --git a/bookie/src/app/nav-bar/nav-bar.component.html b/bookie/src/app/nav-bar/nav-bar.component.html index 046bbf8..cc69d68 100644 --- a/bookie/src/app/nav-bar/nav-bar.component.html +++ b/bookie/src/app/nav-bar/nav-bar.component.html @@ -3,21 +3,29 @@ home Point of Sale - - face - Guest Book - - - receipt - Sales - + @if (auth.allowed('customers')) { + + face + Guest Book + + } + @if (auth.allowed('sales')) { + + receipt + Sales + + } - - + @if ((auth.currentUser | async) === null) { + + } + @if ((auth.currentUser | async)?.name; as name) { + + } diff --git a/bookie/src/app/nav-bar/nav-bar.component.spec.ts b/bookie/src/app/nav-bar/nav-bar.component.spec.ts index dbf3c45..d84dc33 100644 --- a/bookie/src/app/nav-bar/nav-bar.component.spec.ts +++ b/bookie/src/app/nav-bar/nav-bar.component.spec.ts @@ -8,7 +8,7 @@ describe('NavBarComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [NavBarComponent], + imports: [NavBarComponent], }).compileComponents(); })); diff --git a/bookie/src/app/nav-bar/nav-bar.component.ts b/bookie/src/app/nav-bar/nav-bar.component.ts index f28c5f7..d3e29b2 100644 --- a/bookie/src/app/nav-bar/nav-bar.component.ts +++ b/bookie/src/app/nav-bar/nav-bar.component.ts @@ -1,5 +1,9 @@ +import { AsyncPipe } from '@angular/common'; import { Component } from '@angular/core'; -import { Router } from '@angular/router'; +import { MatAnchor, MatButton } from '@angular/material/button'; +import { MatIcon } from '@angular/material/icon'; +import { MatToolbar } from '@angular/material/toolbar'; +import { Router, RouterLink } from '@angular/router'; import { AuthService } from '../auth/auth.service'; @@ -7,6 +11,8 @@ import { AuthService } from '../auth/auth.service'; selector: 'app-nav-bar', templateUrl: './nav-bar.component.html', styleUrls: ['./nav-bar.component.css'], + standalone: true, + imports: [MatToolbar, MatAnchor, RouterLink, MatIcon, MatButton, AsyncPipe], }) export class NavBarComponent { constructor( diff --git a/bookie/src/app/printers/printer-detail/printer-detail.component.html b/bookie/src/app/printers/printer-detail/printer-detail.component.html index 14d6616..f41d771 100644 --- a/bookie/src/app/printers/printer-detail/printer-detail.component.html +++ b/bookie/src/app/printers/printer-detail/printer-detail.component.html @@ -24,6 +24,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/printers/printer-detail/printer-detail.component.spec.ts b/bookie/src/app/printers/printer-detail/printer-detail.component.spec.ts index b9f969e..7f19e8a 100644 --- a/bookie/src/app/printers/printer-detail/printer-detail.component.spec.ts +++ b/bookie/src/app/printers/printer-detail/printer-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('PrinterDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [PrinterDetailComponent], + imports: [PrinterDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/printers/printer-detail/printer-detail.component.ts b/bookie/src/app/printers/printer-detail/printer-detail.component.ts index 63a0b8b..e241c1b 100644 --- a/bookie/src/app/printers/printer-detail/printer-detail.component.ts +++ b/bookie/src/app/printers/printer-detail/printer-detail.component.ts @@ -1,6 +1,10 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { Printer } from '../../core/printer'; @@ -12,6 +16,19 @@ import { PrinterService } from '../printer.service'; selector: 'app-printer-detail', templateUrl: './printer-detail.component.html', styleUrls: ['./printer-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCardActions, + MatButton, + ], }) export class PrinterDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -63,27 +80,27 @@ export class PrinterDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/printers'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/printers'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/printers/printer-list-resolver.service.ts b/bookie/src/app/printers/printer-list-resolver.service.ts deleted file mode 100644 index 6112910..0000000 --- a/bookie/src/app/printers/printer-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Printer } from '../core/printer'; - -import { PrinterService } from './printer.service'; - -@Injectable({ - providedIn: 'root', -}) -export class PrinterListResolver { - constructor(private ser: PrinterService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/printers/printer-list-resolver.service.spec.ts b/bookie/src/app/printers/printer-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/printers/printer-list-resolver.service.spec.ts rename to bookie/src/app/printers/printer-list.resolver.spec.ts diff --git a/bookie/src/app/printers/printer-list.resolver.ts b/bookie/src/app/printers/printer-list.resolver.ts new file mode 100644 index 0000000..1bd0e85 --- /dev/null +++ b/bookie/src/app/printers/printer-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Printer } from '../core/printer'; + +import { PrinterService } from './printer.service'; + +export const printerListResolver: ResolveFn = () => { + return inject(PrinterService).list(); +}; diff --git a/bookie/src/app/printers/printer-list/printer-list.component.spec.ts b/bookie/src/app/printers/printer-list/printer-list.component.spec.ts index df07ce5..d161845 100644 --- a/bookie/src/app/printers/printer-list/printer-list.component.spec.ts +++ b/bookie/src/app/printers/printer-list/printer-list.component.spec.ts @@ -8,7 +8,7 @@ describe('PrinterListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [PrinterListComponent], + imports: [PrinterListComponent], }).compileComponents(); fixture = TestBed.createComponent(PrinterListComponent); diff --git a/bookie/src/app/printers/printer-list/printer-list.component.ts b/bookie/src/app/printers/printer-list/printer-list.component.ts index 9bc64d0..f209950 100644 --- a/bookie/src/app/printers/printer-list/printer-list.component.ts +++ b/bookie/src/app/printers/printer-list/printer-list.component.ts @@ -1,5 +1,20 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Printer } from '../../core/printer'; @@ -9,6 +24,27 @@ import { PrinterListDataSource } from './printer-list-datasource'; selector: 'app-printer-list', templateUrl: './printer-list.component.html', styleUrls: ['./printer-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class PrinterListComponent implements OnInit { list: Printer[] = []; diff --git a/bookie/src/app/printers/printer-resolver.service.ts b/bookie/src/app/printers/printer-resolver.service.ts deleted file mode 100644 index c029173..0000000 --- a/bookie/src/app/printers/printer-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Printer } from '../core/printer'; - -import { PrinterService } from './printer.service'; - -@Injectable({ - providedIn: 'root', -}) -export class PrinterResolver { - constructor(private ser: PrinterService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/printers/printer-resolver.service.spec.ts b/bookie/src/app/printers/printer.resolver.spec.ts similarity index 100% rename from bookie/src/app/printers/printer-resolver.service.spec.ts rename to bookie/src/app/printers/printer.resolver.spec.ts diff --git a/bookie/src/app/printers/printer.resolver.ts b/bookie/src/app/printers/printer.resolver.ts new file mode 100644 index 0000000..2c6df3b --- /dev/null +++ b/bookie/src/app/printers/printer.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Printer } from '../core/printer'; + +import { PrinterService } from './printer.service'; + +export const printerResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(PrinterService).get(id); +}; diff --git a/bookie/src/app/printers/printers-routing.module.spec.ts b/bookie/src/app/printers/printers-routing.module.spec.ts deleted file mode 100644 index 55fab1a..0000000 --- a/bookie/src/app/printers/printers-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PrintersRoutingModule } from './printers-routing.module'; - -describe('PrintersRoutingModule', () => { - let printersRoutingModule: PrintersRoutingModule; - - beforeEach(() => { - printersRoutingModule = new PrintersRoutingModule(); - }); - - it('should create an instance', () => { - expect(printersRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/printers/printers-routing.module.ts b/bookie/src/app/printers/printers-routing.module.ts deleted file mode 100644 index 258d980..0000000 --- a/bookie/src/app/printers/printers-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { PrinterDetailComponent } from './printer-detail/printer-detail.component'; -import { PrinterListComponent } from './printer-list/printer-list.component'; -import { PrinterListResolver } from './printer-list-resolver.service'; -import { PrinterResolver } from './printer-resolver.service'; - -const printersRoutes: Routes = [ - { - path: '', - component: PrinterListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Printers', - }, - resolve: { - list: PrinterListResolver, - }, - }, - { - path: 'new', - component: PrinterDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Printers', - }, - resolve: { - item: PrinterResolver, - }, - }, - { - path: ':id', - component: PrinterDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Printers', - }, - resolve: { - item: PrinterResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(printersRoutes)], - exports: [RouterModule], - providers: [PrinterListResolver, PrinterResolver], -}) -export class PrintersRoutingModule {} diff --git a/bookie/src/app/printers/printers.module.spec.ts b/bookie/src/app/printers/printers.module.spec.ts deleted file mode 100644 index 958327b..0000000 --- a/bookie/src/app/printers/printers.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PrintersModule } from './printers.module'; - -describe('PrintersModule', () => { - let printersModule: PrintersModule; - - beforeEach(() => { - printersModule = new PrintersModule(); - }); - - it('should create an instance', () => { - expect(printersModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/printers/printers.module.ts b/bookie/src/app/printers/printers.module.ts deleted file mode 100644 index bf471be..0000000 --- a/bookie/src/app/printers/printers.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { PrinterDetailComponent } from './printer-detail/printer-detail.component'; -import { PrinterListComponent } from './printer-list/printer-list.component'; -import { PrintersRoutingModule } from './printers-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - ReactiveFormsModule, - PrintersRoutingModule, - ], - declarations: [PrinterListComponent, PrinterDetailComponent], -}) -export class PrintersModule {} diff --git a/bookie/src/app/printers/printers.routes.ts b/bookie/src/app/printers/printers.routes.ts new file mode 100644 index 0000000..c3967c3 --- /dev/null +++ b/bookie/src/app/printers/printers.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { PrinterDetailComponent } from './printer-detail/printer-detail.component'; +import { PrinterListComponent } from './printer-list/printer-list.component'; +import { printerListResolver } from './printer-list.resolver'; +import { printerResolver } from './printer.resolver'; + +export const routes: Routes = [ + { + path: '', + component: PrinterListComponent, + canActivate: [authGuard], + data: { + permission: 'Printers', + }, + resolve: { + list: printerListResolver, + }, + }, + { + path: 'new', + component: PrinterDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Printers', + }, + resolve: { + item: printerResolver, + }, + }, + { + path: ':id', + component: PrinterDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Printers', + }, + resolve: { + item: printerResolver, + }, + }, +]; diff --git a/bookie/src/app/product-sale-report/product-sale-report-resolver.service.ts b/bookie/src/app/product-sale-report/product-sale-report-resolver.service.ts deleted file mode 100644 index d7e9d16..0000000 --- a/bookie/src/app/product-sale-report/product-sale-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { ProductSaleReport } from './product-sale-report'; -import { ProductSaleReportService } from './product-sale-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ProductSaleReportResolver { - constructor(private ser: ProductSaleReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/product-sale-report/product-sale-report-routing.module.spec.ts b/bookie/src/app/product-sale-report/product-sale-report-routing.module.spec.ts deleted file mode 100644 index e66118f..0000000 --- a/bookie/src/app/product-sale-report/product-sale-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductSaleReportRoutingModule } from './product-sale-report-routing.module'; - -describe('ProductSaleReportRoutingModule', () => { - let productSaleReportRoutingModule: ProductSaleReportRoutingModule; - - beforeEach(() => { - productSaleReportRoutingModule = new ProductSaleReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(productSaleReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/product-sale-report/product-sale-report-routing.module.ts b/bookie/src/app/product-sale-report/product-sale-report-routing.module.ts deleted file mode 100644 index 8cf5f68..0000000 --- a/bookie/src/app/product-sale-report/product-sale-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { ProductSaleReportResolver } from './product-sale-report-resolver.service'; -import { ProductSaleReportComponent } from './product-sale-report.component'; - -const productSaleReportRoutes: Routes = [ - { - path: '', - component: ProductSaleReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Product Sale Report', - }, - resolve: { - info: ProductSaleReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(productSaleReportRoutes)], - exports: [RouterModule], - providers: [ProductSaleReportResolver], -}) -export class ProductSaleReportRoutingModule {} diff --git a/bookie/src/app/product-sale-report/product-sale-report.component.spec.ts b/bookie/src/app/product-sale-report/product-sale-report.component.spec.ts index c523ab3..38e2a5a 100644 --- a/bookie/src/app/product-sale-report/product-sale-report.component.spec.ts +++ b/bookie/src/app/product-sale-report/product-sale-report.component.spec.ts @@ -8,7 +8,7 @@ describe('ProductSaleReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ProductSaleReportComponent], + imports: [ProductSaleReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/product-sale-report/product-sale-report.component.ts b/bookie/src/app/product-sale-report/product-sale-report.component.ts index 8d7ac63..ee27a5a 100644 --- a/bookie/src/app/product-sale-report/product-sale-report.component.ts +++ b/bookie/src/app/product-sale-report/product-sale-report.component.ts @@ -1,7 +1,26 @@ +import { DecimalPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToasterService } from '../core/toaster.service'; import { ToCsvService } from '../shared/to-csv.service'; @@ -14,6 +33,36 @@ import { ProductSaleReportService } from './product-sale-report.service'; selector: 'app-product-sale-report', templateUrl: './product-sale-report.component.html', styleUrls: ['./product-sale-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + DecimalPipe, + ], }) export class ProductSaleReportComponent implements OnInit { info: ProductSaleReport = new ProductSaleReport(); @@ -72,14 +121,14 @@ export class ProductSaleReportComponent implements OnInit { } print() { - this.ser.print(this.info.startDate, this.info.finishDate).subscribe( - () => { + this.ser.print(this.info.startDate, this.info.finishDate).subscribe({ + next: () => { this.toaster.show('', 'Successfully Printed'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } exportCsv() { diff --git a/bookie/src/app/product-sale-report/product-sale-report.module.spec.ts b/bookie/src/app/product-sale-report/product-sale-report.module.spec.ts deleted file mode 100644 index c7d7043..0000000 --- a/bookie/src/app/product-sale-report/product-sale-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductSaleReportModule } from './product-sale-report.module'; - -describe('ProductSaleReportModule', () => { - let productSaleReportModule: ProductSaleReportModule; - - beforeEach(() => { - productSaleReportModule = new ProductSaleReportModule(); - }); - - it('should create an instance', () => { - expect(productSaleReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/product-sale-report/product-sale-report.module.ts b/bookie/src/app/product-sale-report/product-sale-report.module.ts deleted file mode 100644 index d03b542..0000000 --- a/bookie/src/app/product-sale-report/product-sale-report.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { ProductSaleReportRoutingModule } from './product-sale-report-routing.module'; -import { ProductSaleReportComponent } from './product-sale-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ProductSaleReportRoutingModule, - ], - declarations: [ProductSaleReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class ProductSaleReportModule {} diff --git a/bookie/src/app/product-sale-report/product-sale-report-resolver.service.spec.ts b/bookie/src/app/product-sale-report/product-sale-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/product-sale-report/product-sale-report-resolver.service.spec.ts rename to bookie/src/app/product-sale-report/product-sale-report.resolver.spec.ts diff --git a/bookie/src/app/product-sale-report/product-sale-report.resolver.ts b/bookie/src/app/product-sale-report/product-sale-report.resolver.ts new file mode 100644 index 0000000..489417b --- /dev/null +++ b/bookie/src/app/product-sale-report/product-sale-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { ProductSaleReport } from './product-sale-report'; +import { ProductSaleReportService } from './product-sale-report.service'; + +export const productSaleReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(ProductSaleReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/product-sale-report/product-sale-report.routes.ts b/bookie/src/app/product-sale-report/product-sale-report.routes.ts new file mode 100644 index 0000000..8d4e4dd --- /dev/null +++ b/bookie/src/app/product-sale-report/product-sale-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { ProductSaleReportComponent } from './product-sale-report.component'; +import { productSaleReportResolver } from './product-sale-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: ProductSaleReportComponent, + canActivate: [authGuard], + data: { + permission: 'Product Sale Report', + }, + resolve: { + info: productSaleReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/product-updates-report/product-updates-report-resolver.service.ts b/bookie/src/app/product-updates-report/product-updates-report-resolver.service.ts deleted file mode 100644 index 9c610b9..0000000 --- a/bookie/src/app/product-updates-report/product-updates-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { ProductUpdatesReport } from './product-updates-report'; -import { ProductUpdatesReportService } from './product-updates-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ProductUpdatesReportResolver { - constructor(private ser: ProductUpdatesReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/product-updates-report/product-updates-report-routing.module.spec.ts b/bookie/src/app/product-updates-report/product-updates-report-routing.module.spec.ts deleted file mode 100644 index de42b5c..0000000 --- a/bookie/src/app/product-updates-report/product-updates-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductUpdatesReportRoutingModule } from './product-updates-report-routing.module'; - -describe('ProductUpdatesReportRoutingModule', () => { - let productUpdatesReportRoutingModule: ProductUpdatesReportRoutingModule; - - beforeEach(() => { - productUpdatesReportRoutingModule = new ProductUpdatesReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(productUpdatesReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/product-updates-report/product-updates-report-routing.module.ts b/bookie/src/app/product-updates-report/product-updates-report-routing.module.ts deleted file mode 100644 index 04ec65d..0000000 --- a/bookie/src/app/product-updates-report/product-updates-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { ProductUpdatesReportResolver } from './product-updates-report-resolver.service'; -import { ProductUpdatesReportComponent } from './product-updates-report.component'; - -const productUpdatesReportRoutes: Routes = [ - { - path: '', - component: ProductUpdatesReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - info: ProductUpdatesReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(productUpdatesReportRoutes)], - exports: [RouterModule], - providers: [ProductUpdatesReportResolver], -}) -export class ProductUpdatesReportRoutingModule {} diff --git a/bookie/src/app/product-updates-report/product-updates-report.component.spec.ts b/bookie/src/app/product-updates-report/product-updates-report.component.spec.ts index ac7589c..afd04a5 100644 --- a/bookie/src/app/product-updates-report/product-updates-report.component.spec.ts +++ b/bookie/src/app/product-updates-report/product-updates-report.component.spec.ts @@ -8,7 +8,7 @@ describe('ProductUpdatesReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ProductUpdatesReportComponent], + imports: [ProductUpdatesReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/product-updates-report/product-updates-report.component.ts b/bookie/src/app/product-updates-report/product-updates-report.component.ts index 9fa0c3e..36e0c5a 100644 --- a/bookie/src/app/product-updates-report/product-updates-report.component.ts +++ b/bookie/src/app/product-updates-report/product-updates-report.component.ts @@ -1,7 +1,25 @@ import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToCsvService } from '../shared/to-csv.service'; @@ -12,6 +30,35 @@ import { ProductUpdatesReportDataSource } from './product-updates-report-datasou selector: 'app-product-updates-report', templateUrl: './product-updates-report.component.html', styleUrls: ['./product-updates-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class ProductUpdatesReportComponent implements OnInit { info: ProductUpdatesReport = new ProductUpdatesReport(); diff --git a/bookie/src/app/product-updates-report/product-updates-report.module.spec.ts b/bookie/src/app/product-updates-report/product-updates-report.module.spec.ts deleted file mode 100644 index 0bc9a5c..0000000 --- a/bookie/src/app/product-updates-report/product-updates-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductUpdatesReportModule } from './product-updates-report.module'; - -describe('ProductUpdatesReportModule', () => { - let productUpdatesReportModule: ProductUpdatesReportModule; - - beforeEach(() => { - productUpdatesReportModule = new ProductUpdatesReportModule(); - }); - - it('should create an instance', () => { - expect(productUpdatesReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/product-updates-report/product-updates-report.module.ts b/bookie/src/app/product-updates-report/product-updates-report.module.ts deleted file mode 100644 index 37950be..0000000 --- a/bookie/src/app/product-updates-report/product-updates-report.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { ProductUpdatesReportRoutingModule } from './product-updates-report-routing.module'; -import { ProductUpdatesReportComponent } from './product-updates-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - ProductUpdatesReportRoutingModule, - ], - declarations: [ProductUpdatesReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class ProductUpdatesReportModule {} diff --git a/bookie/src/app/product-updates-report/product-updates-report-resolver.service.spec.ts b/bookie/src/app/product-updates-report/product-updates-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/product-updates-report/product-updates-report-resolver.service.spec.ts rename to bookie/src/app/product-updates-report/product-updates-report.resolver.spec.ts diff --git a/bookie/src/app/product-updates-report/product-updates-report.resolver.ts b/bookie/src/app/product-updates-report/product-updates-report.resolver.ts new file mode 100644 index 0000000..d502e32 --- /dev/null +++ b/bookie/src/app/product-updates-report/product-updates-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { ProductUpdatesReport } from './product-updates-report'; +import { ProductUpdatesReportService } from './product-updates-report.service'; + +export const productUpdatesReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(ProductUpdatesReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/product-updates-report/product-updates-report.routes.ts b/bookie/src/app/product-updates-report/product-updates-report.routes.ts new file mode 100644 index 0000000..e8a3ccb --- /dev/null +++ b/bookie/src/app/product-updates-report/product-updates-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { ProductUpdatesReportComponent } from './product-updates-report.component'; +import { productUpdatesReportResolver } from './product-updates-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: ProductUpdatesReportComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + info: productUpdatesReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/product/product-detail/product-detail.component.html b/bookie/src/app/product/product-detail/product-detail.component.html index 166735c..9b87cde 100644 --- a/bookie/src/app/product/product-detail/product-detail.component.html +++ b/bookie/src/app/product/product-detail/product-detail.component.html @@ -32,17 +32,21 @@ Menu Category - - {{ mc.name }} - + @for (mc of menuCategories; track mc) { + + {{ mc.name }} + + } Sale Category - - {{ sc.name }} - + @for (sc of saleCategories; track sc) { + + {{ sc.name }} + + } @@ -50,6 +54,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/product/product-detail/product-detail.component.spec.ts b/bookie/src/app/product/product-detail/product-detail.component.spec.ts index 65abc9e..126787c 100644 --- a/bookie/src/app/product/product-detail/product-detail.component.spec.ts +++ b/bookie/src/app/product/product-detail/product-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('ProductDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ProductDetailComponent], + imports: [ProductDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/product/product-detail/product-detail.component.ts b/bookie/src/app/product/product-detail/product-detail.component.ts index 921f6e4..11bfba0 100644 --- a/bookie/src/app/product/product-detail/product-detail.component.ts +++ b/bookie/src/app/product/product-detail/product-detail.component.ts @@ -1,6 +1,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { MenuCategory } from '../../core/menu-category'; @@ -14,6 +21,22 @@ import { ProductService } from '../product.service'; selector: 'app-product-detail', templateUrl: './product-detail.component.html', styleUrls: ['./product-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatSelect, + MatOption, + MatCardActions, + MatButton, + ], }) export class ProductDetailComponent implements OnInit, AfterViewInit { @ViewChild('name', { static: true }) nameElement?: ElementRef; @@ -88,27 +111,27 @@ export class ProductDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/products'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/products'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/product/product-list-resolver.service.ts b/bookie/src/app/product/product-list-resolver.service.ts deleted file mode 100644 index e796522..0000000 --- a/bookie/src/app/product/product-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Product } from '../core/product'; - -import { ProductService } from './product.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ProductListResolver { - constructor(private ser: ProductService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/product/product-list-resolver.service.spec.ts b/bookie/src/app/product/product-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/product/product-list-resolver.service.spec.ts rename to bookie/src/app/product/product-list.resolver.spec.ts diff --git a/bookie/src/app/product/product-list.resolver.ts b/bookie/src/app/product/product-list.resolver.ts new file mode 100644 index 0000000..c50e354 --- /dev/null +++ b/bookie/src/app/product/product-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Product } from '../core/product'; + +import { ProductService } from './product.service'; + +export const productListResolver: ResolveFn = () => { + return inject(ProductService).list(); +}; diff --git a/bookie/src/app/product/product-list/product-list.component.html b/bookie/src/app/product/product-list/product-list.component.html index 4c3c9b1..d862eeb 100644 --- a/bookie/src/app/product/product-list/product-list.component.html +++ b/bookie/src/app/product/product-list/product-list.component.html @@ -30,9 +30,11 @@ Menu Category -- All Products -- - - {{ mc.name }} - + @for (mc of menuCategories; track mc) { + + {{ mc.name }} + + } diff --git a/bookie/src/app/product/product-list/product-list.component.spec.ts b/bookie/src/app/product/product-list/product-list.component.spec.ts index f4e4cda..8ce15d7 100644 --- a/bookie/src/app/product/product-list/product-list.component.spec.ts +++ b/bookie/src/app/product/product-list/product-list.component.spec.ts @@ -8,7 +8,7 @@ describe('ProductListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [ProductListComponent], + imports: [ProductListComponent], }).compileComponents(); fixture = TestBed.createComponent(ProductListComponent); diff --git a/bookie/src/app/product/product-list/product-list.component.ts b/bookie/src/app/product/product-list/product-list.component.ts index 867649a..7f99419 100644 --- a/bookie/src/app/product/product-list/product-list.component.ts +++ b/bookie/src/app/product/product-list/product-list.component.ts @@ -1,7 +1,27 @@ -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CdkDragDrop, moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop'; +import { AsyncPipe, DecimalPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton, MatIconButton, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; @@ -18,6 +38,40 @@ import { ProductListDataSource } from './product-list-datasource'; selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatButton, + MatIconButton, + MatIcon, + MatAnchor, + RouterLink, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSelect, + MatOption, + MatTable, + CdkDropList, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CdkDrag, + AsyncPipe, + DecimalPipe, + CurrencyPipe, + ], }) export class ProductListComponent implements OnInit { searchFilter: Observable = new Observable(); @@ -69,15 +123,15 @@ export class ProductListComponent implements OnInit { } updateSortOrder() { - this.ser.updateSortOrder(this.dataSource.filteredData).subscribe( - (result: Product[]) => { + this.ser.updateSortOrder(this.dataSource.filteredData).subscribe({ + next: (result: Product[]) => { this.toaster.show('Success', ''); this.loadData(result, this.menuCategories); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } dropTable(event: CdkDragDrop) { diff --git a/bookie/src/app/product/product-resolver.service.ts b/bookie/src/app/product/product-resolver.service.ts deleted file mode 100644 index f8df143..0000000 --- a/bookie/src/app/product/product-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Product } from '../core/product'; - -import { ProductService } from './product.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ProductResolver { - constructor(private ser: ProductService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/product/product-resolver.service.spec.ts b/bookie/src/app/product/product.resolver.spec.ts similarity index 100% rename from bookie/src/app/product/product-resolver.service.spec.ts rename to bookie/src/app/product/product.resolver.spec.ts diff --git a/bookie/src/app/product/product.resolver.ts b/bookie/src/app/product/product.resolver.ts new file mode 100644 index 0000000..548a481 --- /dev/null +++ b/bookie/src/app/product/product.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Product } from '../core/product'; + +import { ProductService } from './product.service'; + +export const productResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(ProductService).get(id); +}; diff --git a/bookie/src/app/product/products-routing.module.spec.ts b/bookie/src/app/product/products-routing.module.spec.ts deleted file mode 100644 index c4fc0eb..0000000 --- a/bookie/src/app/product/products-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductsRoutingModule } from './products-routing.module'; - -describe('ProductsRoutingModule', () => { - let productsRoutingModule: ProductsRoutingModule; - - beforeEach(() => { - productsRoutingModule = new ProductsRoutingModule(); - }); - - it('should create an instance', () => { - expect(productsRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/product/products-routing.module.ts b/bookie/src/app/product/products-routing.module.ts deleted file mode 100644 index 58e37bb..0000000 --- a/bookie/src/app/product/products-routing.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { MenuCategoryListResolver } from '../menu-category/menu-category-list-resolver.service'; -import { SaleCategoryListResolver } from '../sale-category/sale-category-list-resolver.service'; - -import { ProductDetailComponent } from './product-detail/product-detail.component'; -import { ProductListComponent } from './product-list/product-list.component'; -import { ProductListResolver } from './product-list-resolver.service'; -import { ProductResolver } from './product-resolver.service'; - -const productsRoutes: Routes = [ - { - path: '', - component: ProductListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - list: ProductListResolver, - menuCategories: MenuCategoryListResolver, - }, - }, - { - path: 'new', - component: ProductDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - item: ProductResolver, - menuCategories: MenuCategoryListResolver, - saleCategories: SaleCategoryListResolver, - }, - }, - { - path: ':id', - component: ProductDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - item: ProductResolver, - menuCategories: MenuCategoryListResolver, - saleCategories: SaleCategoryListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(productsRoutes)], - exports: [RouterModule], - providers: [ProductListResolver, ProductResolver], -}) -export class ProductsRoutingModule {} diff --git a/bookie/src/app/product/products.module.spec.ts b/bookie/src/app/product/products.module.spec.ts deleted file mode 100644 index 76732f5..0000000 --- a/bookie/src/app/product/products.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ProductsModule } from './products.module'; - -describe('ProductsModule', () => { - let productsModule: ProductsModule; - - beforeEach(() => { - productsModule = new ProductsModule(); - }); - - it('should create an instance', () => { - expect(productsModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/product/products.module.ts b/bookie/src/app/product/products.module.ts deleted file mode 100644 index 3f1bc29..0000000 --- a/bookie/src/app/product/products.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { ProductDetailComponent } from './product-detail/product-detail.component'; -import { ProductListComponent } from './product-list/product-list.component'; -import { ProductsRoutingModule } from './products-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - DragDropModule, - MatTableModule, - MatCardModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - ProductsRoutingModule, - ], - declarations: [ProductListComponent, ProductDetailComponent], -}) -export class ProductsModule {} diff --git a/bookie/src/app/product/products.routes.ts b/bookie/src/app/product/products.routes.ts new file mode 100644 index 0000000..2972104 --- /dev/null +++ b/bookie/src/app/product/products.routes.ts @@ -0,0 +1,51 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { menuCategoryListResolver } from '../menu-category/menu-category-list.resolver'; +import { saleCategoryListResolver } from '../sale-category/sale-category-list.resolver'; + +import { ProductDetailComponent } from './product-detail/product-detail.component'; +import { ProductListComponent } from './product-list/product-list.component'; +import { productListResolver } from './product-list.resolver'; +import { productResolver } from './product.resolver'; + +export const routes: Routes = [ + { + path: '', + component: ProductListComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + list: productListResolver, + menuCategories: menuCategoryListResolver, + }, + }, + { + path: 'new', + component: ProductDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + item: productResolver, + menuCategories: menuCategoryListResolver, + saleCategories: saleCategoryListResolver, + }, + }, + { + path: ':id', + component: ProductDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + item: productResolver, + menuCategories: menuCategoryListResolver, + saleCategories: saleCategoryListResolver, + }, + }, +]; diff --git a/bookie/src/app/regimes/regime-detail/regime-detail.component.html b/bookie/src/app/regimes/regime-detail/regime-detail.component.html index 69a7916..e582cec 100644 --- a/bookie/src/app/regimes/regime-detail/regime-detail.component.html +++ b/bookie/src/app/regimes/regime-detail/regime-detail.component.html @@ -26,8 +26,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/regimes/regime-detail/regime-detail.component.spec.ts b/bookie/src/app/regimes/regime-detail/regime-detail.component.spec.ts index b135560..197f73c 100644 --- a/bookie/src/app/regimes/regime-detail/regime-detail.component.spec.ts +++ b/bookie/src/app/regimes/regime-detail/regime-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('RegimeDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RegimeDetailComponent], + imports: [RegimeDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/regimes/regime-detail/regime-detail.component.ts b/bookie/src/app/regimes/regime-detail/regime-detail.component.ts index 9712fd1..29b7972 100644 --- a/bookie/src/app/regimes/regime-detail/regime-detail.component.ts +++ b/bookie/src/app/regimes/regime-detail/regime-detail.component.ts @@ -1,6 +1,10 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { Regime } from '../../core/regime'; @@ -12,6 +16,19 @@ import { RegimeService } from '../regime.service'; selector: 'app-regime-detail', templateUrl: './regime-detail.component.html', styleUrls: ['./regime-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCardActions, + MatButton, + ], }) export class RegimeDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -63,27 +80,27 @@ export class RegimeDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/regimes'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as number).subscribe( - () => { + this.ser.delete(this.item.id as number).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/regimes'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/regimes/regime-list-resolver.service.ts b/bookie/src/app/regimes/regime-list-resolver.service.ts deleted file mode 100644 index 785f0ed..0000000 --- a/bookie/src/app/regimes/regime-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Regime } from '../core/regime'; - -import { RegimeService } from './regime.service'; - -@Injectable({ - providedIn: 'root', -}) -export class RegimeListResolver { - constructor(private ser: RegimeService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/regimes/regime-list-resolver.service.spec.ts b/bookie/src/app/regimes/regime-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/regimes/regime-list-resolver.service.spec.ts rename to bookie/src/app/regimes/regime-list.resolver.spec.ts diff --git a/bookie/src/app/regimes/regime-list.resolver.ts b/bookie/src/app/regimes/regime-list.resolver.ts new file mode 100644 index 0000000..e13ad77 --- /dev/null +++ b/bookie/src/app/regimes/regime-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Regime } from '../core/regime'; + +import { RegimeService } from './regime.service'; + +export const regimeListResolver: ResolveFn = () => { + return inject(RegimeService).list(); +}; diff --git a/bookie/src/app/regimes/regime-list/regime-list.component.spec.ts b/bookie/src/app/regimes/regime-list/regime-list.component.spec.ts index 44a548a..7337fe5 100644 --- a/bookie/src/app/regimes/regime-list/regime-list.component.spec.ts +++ b/bookie/src/app/regimes/regime-list/regime-list.component.spec.ts @@ -8,7 +8,7 @@ describe('RegimeListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [RegimeListComponent], + imports: [RegimeListComponent], }).compileComponents(); fixture = TestBed.createComponent(RegimeListComponent); diff --git a/bookie/src/app/regimes/regime-list/regime-list.component.ts b/bookie/src/app/regimes/regime-list/regime-list.component.ts index e0a356c..95dd529 100644 --- a/bookie/src/app/regimes/regime-list/regime-list.component.ts +++ b/bookie/src/app/regimes/regime-list/regime-list.component.ts @@ -1,5 +1,20 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Regime } from '../../core/regime'; @@ -9,6 +24,27 @@ import { RegimeListDataSource } from './regime-list-datasource'; selector: 'app-regime-list', templateUrl: './regime-list.component.html', styleUrls: ['./regime-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class RegimeListComponent implements OnInit { list: Regime[] = []; diff --git a/bookie/src/app/regimes/regime-resolver.service.ts b/bookie/src/app/regimes/regime-resolver.service.ts deleted file mode 100644 index 11926eb..0000000 --- a/bookie/src/app/regimes/regime-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Regime } from '../core/regime'; - -import { RegimeService } from './regime.service'; - -@Injectable({ - providedIn: 'root', -}) -export class RegimeResolver { - constructor(private ser: RegimeService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id ? +id : null); - } -} diff --git a/bookie/src/app/regimes/regime-resolver.service.spec.ts b/bookie/src/app/regimes/regime.resolver.spec.ts similarity index 100% rename from bookie/src/app/regimes/regime-resolver.service.spec.ts rename to bookie/src/app/regimes/regime.resolver.spec.ts diff --git a/bookie/src/app/regimes/regime.resolver.ts b/bookie/src/app/regimes/regime.resolver.ts new file mode 100644 index 0000000..9e7bfdd --- /dev/null +++ b/bookie/src/app/regimes/regime.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Regime } from '../core/regime'; + +import { RegimeService } from './regime.service'; + +export const regimeResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(RegimeService).get(id ? +id : null); +}; diff --git a/bookie/src/app/regimes/regimes-routing.module.spec.ts b/bookie/src/app/regimes/regimes-routing.module.spec.ts deleted file mode 100644 index ad69d12..0000000 --- a/bookie/src/app/regimes/regimes-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RegimesRoutingModule } from './regimes-routing.module'; - -describe('RegimesRoutingModule', () => { - let regimesRoutingModule: RegimesRoutingModule; - - beforeEach(() => { - regimesRoutingModule = new RegimesRoutingModule(); - }); - - it('should create an instance', () => { - expect(regimesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/regimes/regimes-routing.module.ts b/bookie/src/app/regimes/regimes-routing.module.ts deleted file mode 100644 index a864680..0000000 --- a/bookie/src/app/regimes/regimes-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { RegimeDetailComponent } from './regime-detail/regime-detail.component'; -import { RegimeListComponent } from './regime-list/regime-list.component'; -import { RegimeListResolver } from './regime-list-resolver.service'; -import { RegimeResolver } from './regime-resolver.service'; - -const regimesRoutes: Routes = [ - { - path: '', - component: RegimeListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Regimes', - }, - resolve: { - list: RegimeListResolver, - }, - }, - { - path: 'new', - component: RegimeDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Regimes', - }, - resolve: { - item: RegimeResolver, - }, - }, - { - path: ':id', - component: RegimeDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Regimes', - }, - resolve: { - item: RegimeResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(regimesRoutes)], - exports: [RouterModule], - providers: [RegimeListResolver, RegimeResolver], -}) -export class RegimesRoutingModule {} diff --git a/bookie/src/app/regimes/regimes.module.spec.ts b/bookie/src/app/regimes/regimes.module.spec.ts deleted file mode 100644 index 3fa66e2..0000000 --- a/bookie/src/app/regimes/regimes.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RegimesModule } from './regimes.module'; - -describe('RegimesModule', () => { - let regimesModule: RegimesModule; - - beforeEach(() => { - regimesModule = new RegimesModule(); - }); - - it('should create an instance', () => { - expect(regimesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/regimes/regimes.module.ts b/bookie/src/app/regimes/regimes.module.ts deleted file mode 100644 index d4fe38e..0000000 --- a/bookie/src/app/regimes/regimes.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { RegimeDetailComponent } from './regime-detail/regime-detail.component'; -import { RegimeListComponent } from './regime-list/regime-list.component'; -import { RegimesRoutingModule } from './regimes-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - ReactiveFormsModule, - RegimesRoutingModule, - ], - declarations: [RegimeListComponent, RegimeDetailComponent], -}) -export class RegimesModule {} diff --git a/bookie/src/app/regimes/regimes.routes.ts b/bookie/src/app/regimes/regimes.routes.ts new file mode 100644 index 0000000..1c56b7d --- /dev/null +++ b/bookie/src/app/regimes/regimes.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { RegimeDetailComponent } from './regime-detail/regime-detail.component'; +import { RegimeListComponent } from './regime-list/regime-list.component'; +import { regimeListResolver } from './regime-list.resolver'; +import { regimeResolver } from './regime.resolver'; + +export const routes: Routes = [ + { + path: '', + component: RegimeListComponent, + canActivate: [authGuard], + data: { + permission: 'Regimes', + }, + resolve: { + list: regimeListResolver, + }, + }, + { + path: 'new', + component: RegimeDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Regimes', + }, + resolve: { + item: regimeResolver, + }, + }, + { + path: ':id', + component: RegimeDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Regimes', + }, + resolve: { + item: regimeResolver, + }, + }, +]; diff --git a/bookie/src/app/roles/role-detail/role-detail.component.html b/bookie/src/app/roles/role-detail/role-detail.component.html index e0f53ba..871cd9a 100644 --- a/bookie/src/app/roles/role-detail/role-detail.component.html +++ b/bookie/src/app/roles/role-detail/role-detail.component.html @@ -12,13 +12,11 @@
-
- {{ p.name }} -
+ @for (p of item.permissions; track p; let i = $index) { +
+ {{ p.name }} +
+ }
diff --git a/bookie/src/app/roles/role-detail/role-detail.component.spec.ts b/bookie/src/app/roles/role-detail/role-detail.component.spec.ts index 18b2146..4bdf1c6 100644 --- a/bookie/src/app/roles/role-detail/role-detail.component.spec.ts +++ b/bookie/src/app/roles/role-detail/role-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('RoleDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RoleDetailComponent], + imports: [RoleDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/roles/role-detail/role-detail.component.ts b/bookie/src/app/roles/role-detail/role-detail.component.ts index 3c95f57..c6a40bf 100644 --- a/bookie/src/app/roles/role-detail/role-detail.component.ts +++ b/bookie/src/app/roles/role-detail/role-detail.component.ts @@ -1,6 +1,12 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -12,6 +18,21 @@ import { RoleService } from '../role.service'; selector: 'app-role-detail', templateUrl: './role-detail.component.html', styleUrls: ['./role-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDivider, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class RoleDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -66,27 +87,27 @@ export class RoleDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/roles'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/roles'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/roles/role-list-resolver.service.ts b/bookie/src/app/roles/role-list-resolver.service.ts deleted file mode 100644 index e663afa..0000000 --- a/bookie/src/app/roles/role-list-resolver.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Role } from './role'; -import { RoleService } from './role.service'; - -@Injectable({ - providedIn: 'root', -}) -export class RoleListResolver { - constructor( - private ser: RoleService, - private router: Router, - ) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/roles/role-list-resolver.service.spec.ts b/bookie/src/app/roles/role-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/roles/role-list-resolver.service.spec.ts rename to bookie/src/app/roles/role-list.resolver.spec.ts diff --git a/bookie/src/app/roles/role-list.resolver.ts b/bookie/src/app/roles/role-list.resolver.ts new file mode 100644 index 0000000..3f67066 --- /dev/null +++ b/bookie/src/app/roles/role-list.resolver.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Role } from './role'; +import { RoleService } from './role.service'; + +export const roleListResolver: ResolveFn = () => { + return inject(RoleService).list(); +}; diff --git a/bookie/src/app/roles/role-list/role-list.component.html b/bookie/src/app/roles/role-list/role-list.component.html index a857703..614ea33 100644 --- a/bookie/src/app/roles/role-list/role-list.component.html +++ b/bookie/src/app/roles/role-list/role-list.component.html @@ -23,7 +23,9 @@ Permissions
    -
  • {{ permission }}
  • + @for (permission of row.permissions; track permission) { +
  • {{ permission }}
  • + }
diff --git a/bookie/src/app/roles/role-list/role-list.component.spec.ts b/bookie/src/app/roles/role-list/role-list.component.spec.ts index eeccee9..a2f7c31 100644 --- a/bookie/src/app/roles/role-list/role-list.component.spec.ts +++ b/bookie/src/app/roles/role-list/role-list.component.spec.ts @@ -8,7 +8,7 @@ describe('RoleListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [RoleListComponent], + imports: [RoleListComponent], }).compileComponents(); fixture = TestBed.createComponent(RoleListComponent); diff --git a/bookie/src/app/roles/role-list/role-list.component.ts b/bookie/src/app/roles/role-list/role-list.component.ts index cb3f77d..b4d2c8a 100644 --- a/bookie/src/app/roles/role-list/role-list.component.ts +++ b/bookie/src/app/roles/role-list/role-list.component.ts @@ -1,5 +1,20 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Role } from '../role'; @@ -9,6 +24,27 @@ import { RoleListDataSource } from './role-list-datasource'; selector: 'app-role-list', templateUrl: './role-list.component.html', styleUrls: ['./role-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class RoleListComponent implements OnInit { list: Role[] = []; diff --git a/bookie/src/app/roles/role-resolver.service.ts b/bookie/src/app/roles/role-resolver.service.ts deleted file mode 100644 index a0cbe23..0000000 --- a/bookie/src/app/roles/role-resolver.service.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Role } from './role'; -import { RoleService } from './role.service'; - -@Injectable({ - providedIn: 'root', -}) -export class RoleResolver { - constructor(private ser: RoleService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/roles/role-resolver.service.spec.ts b/bookie/src/app/roles/role.resolver.spec.ts similarity index 100% rename from bookie/src/app/roles/role-resolver.service.spec.ts rename to bookie/src/app/roles/role.resolver.spec.ts diff --git a/bookie/src/app/roles/role.resolver.ts b/bookie/src/app/roles/role.resolver.ts new file mode 100644 index 0000000..fc621d8 --- /dev/null +++ b/bookie/src/app/roles/role.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Role } from './role'; +import { RoleService } from './role.service'; + +export const roleResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(RoleService).get(id); +}; diff --git a/bookie/src/app/roles/roles-routing.module.spec.ts b/bookie/src/app/roles/roles-routing.module.spec.ts deleted file mode 100644 index ce0f799..0000000 --- a/bookie/src/app/roles/roles-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RolesRoutingModule } from './roles-routing.module'; - -describe('RolesRoutingModule', () => { - let rolesRoutingModule: RolesRoutingModule; - - beforeEach(() => { - rolesRoutingModule = new RolesRoutingModule(); - }); - - it('should create an instance', () => { - expect(rolesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/roles/roles-routing.module.ts b/bookie/src/app/roles/roles-routing.module.ts deleted file mode 100644 index c30dc68..0000000 --- a/bookie/src/app/roles/roles-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { RoleDetailComponent } from './role-detail/role-detail.component'; -import { RoleListComponent } from './role-list/role-list.component'; -import { RoleListResolver } from './role-list-resolver.service'; -import { RoleResolver } from './role-resolver.service'; - -const rolesRoutes: Routes = [ - { - path: '', - component: RoleListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Users', - }, - resolve: { - list: RoleListResolver, - }, - }, - { - path: 'new', - component: RoleDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Users', - }, - resolve: { - item: RoleResolver, - }, - }, - { - path: ':id', - component: RoleDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Users', - }, - resolve: { - item: RoleResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(rolesRoutes)], - exports: [RouterModule], - providers: [RoleListResolver, RoleResolver], -}) -export class RolesRoutingModule {} diff --git a/bookie/src/app/roles/roles.module.spec.ts b/bookie/src/app/roles/roles.module.spec.ts deleted file mode 100644 index 4a8bd79..0000000 --- a/bookie/src/app/roles/roles.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RolesModule } from './roles.module'; - -describe('RolesModule', () => { - let rolesModule: RolesModule; - - beforeEach(() => { - rolesModule = new RolesModule(); - }); - - it('should create an instance', () => { - expect(rolesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/roles/roles.module.ts b/bookie/src/app/roles/roles.module.ts deleted file mode 100644 index a252aa4..0000000 --- a/bookie/src/app/roles/roles.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { RoleDetailComponent } from './role-detail/role-detail.component'; -import { RoleListComponent } from './role-list/role-list.component'; -import { RolesRoutingModule } from './roles-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - RolesRoutingModule, - ], - declarations: [RoleListComponent, RoleDetailComponent], -}) -export class RolesModule {} diff --git a/bookie/src/app/roles/roles.routes.ts b/bookie/src/app/roles/roles.routes.ts new file mode 100644 index 0000000..47f6509 --- /dev/null +++ b/bookie/src/app/roles/roles.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { RoleDetailComponent } from './role-detail/role-detail.component'; +import { RoleListComponent } from './role-list/role-list.component'; +import { roleListResolver } from './role-list.resolver'; +import { roleResolver } from './role.resolver'; + +export const routes: Routes = [ + { + path: '', + component: RoleListComponent, + canActivate: [authGuard], + data: { + permission: 'Users', + }, + resolve: { + list: roleListResolver, + }, + }, + { + path: 'new', + component: RoleDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Users', + }, + resolve: { + item: roleResolver, + }, + }, + { + path: ':id', + component: RoleDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Users', + }, + resolve: { + item: roleResolver, + }, + }, +]; diff --git a/bookie/src/app/sale-category/product-list-resolver.service.ts b/bookie/src/app/sale-category/product-list-resolver.service.ts deleted file mode 100644 index df91d29..0000000 --- a/bookie/src/app/sale-category/product-list-resolver.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable, of as observableOf } from 'rxjs'; - -import { Product } from '../core/product'; -import { ProductService } from '../product/product.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ProductListResolver { - constructor(private ser: ProductService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - if (id === null) { - return observableOf([]); - } - return this.ser.listOfSaleCategory(id); - } -} diff --git a/bookie/src/app/sale-category/product-list.resolver.ts b/bookie/src/app/sale-category/product-list.resolver.ts new file mode 100644 index 0000000..9ec4417 --- /dev/null +++ b/bookie/src/app/sale-category/product-list.resolver.ts @@ -0,0 +1,14 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; +import { of as observableOf } from 'rxjs'; + +import { Product } from '../core/product'; +import { ProductService } from '../product/product.service'; + +export const productListResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + if (id === null) { + return observableOf([]); + } + return inject(ProductService).listOfSaleCategory(id); +}; diff --git a/bookie/src/app/sale-category/sale-categories-routing.module.spec.ts b/bookie/src/app/sale-category/sale-categories-routing.module.spec.ts deleted file mode 100644 index 3bbd27e..0000000 --- a/bookie/src/app/sale-category/sale-categories-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SaleCategoriesRoutingModule } from './sale-categories-routing.module'; - -describe('SaleCategoriesRoutingModule', () => { - let saleCategoriesRoutingModule: SaleCategoriesRoutingModule; - - beforeEach(() => { - saleCategoriesRoutingModule = new SaleCategoriesRoutingModule(); - }); - - it('should create an instance', () => { - expect(saleCategoriesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sale-category/sale-categories-routing.module.ts b/bookie/src/app/sale-category/sale-categories-routing.module.ts deleted file mode 100644 index cd10bc3..0000000 --- a/bookie/src/app/sale-category/sale-categories-routing.module.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { TaxListResolver } from '../taxes/tax-list-resolver.service'; - -import { ProductListResolver } from './product-list-resolver.service'; -import { SaleCategoryDetailComponent } from './sale-category-detail/sale-category-detail.component'; -import { SaleCategoryListComponent } from './sale-category-list/sale-category-list.component'; -import { SaleCategoryListResolver } from './sale-category-list-resolver.service'; -import { SaleCategoryResolver } from './sale-category-resolver.service'; - -const saleCategoriesRoutes: Routes = [ - { - path: '', - component: SaleCategoryListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - list: SaleCategoryListResolver, - }, - }, - { - path: 'new', - component: SaleCategoryDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - item: SaleCategoryResolver, - taxes: TaxListResolver, - products: ProductListResolver, - }, - }, - { - path: ':id', - component: SaleCategoryDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - item: SaleCategoryResolver, - taxes: TaxListResolver, - products: ProductListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(saleCategoriesRoutes)], - exports: [RouterModule], - providers: [SaleCategoryListResolver, SaleCategoryResolver], -}) -export class SaleCategoriesRoutingModule {} diff --git a/bookie/src/app/sale-category/sale-categories.module.spec.ts b/bookie/src/app/sale-category/sale-categories.module.spec.ts deleted file mode 100644 index 348d96b..0000000 --- a/bookie/src/app/sale-category/sale-categories.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SaleCategoriesModule } from './sale-categories.module'; - -describe('SaleCategoriesModule', () => { - let saleCategoriesModule: SaleCategoriesModule; - - beforeEach(() => { - saleCategoriesModule = new SaleCategoriesModule(); - }); - - it('should create an instance', () => { - expect(saleCategoriesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sale-category/sale-categories.module.ts b/bookie/src/app/sale-category/sale-categories.module.ts deleted file mode 100644 index 4dae813..0000000 --- a/bookie/src/app/sale-category/sale-categories.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { SaleCategoriesRoutingModule } from './sale-categories-routing.module'; -import { SaleCategoryDetailComponent } from './sale-category-detail/sale-category-detail.component'; -import { SaleCategoryListComponent } from './sale-category-list/sale-category-list.component'; - -@NgModule({ - imports: [ - CommonModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatOptionModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - SaleCategoriesRoutingModule, - ], - declarations: [SaleCategoryListComponent, SaleCategoryDetailComponent], -}) -export class SaleCategoriesModule {} diff --git a/bookie/src/app/sale-category/sale-categories.routes.ts b/bookie/src/app/sale-category/sale-categories.routes.ts new file mode 100644 index 0000000..6b65c0c --- /dev/null +++ b/bookie/src/app/sale-category/sale-categories.routes.ts @@ -0,0 +1,50 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { taxListResolver } from '../taxes/tax-list.resolver'; + +import { productListResolver } from './product-list.resolver'; +import { SaleCategoryDetailComponent } from './sale-category-detail/sale-category-detail.component'; +import { SaleCategoryListComponent } from './sale-category-list/sale-category-list.component'; +import { saleCategoryListResolver } from './sale-category-list.resolver'; +import { saleCategoryResolver } from './sale-category.resolver'; + +export const routes: Routes = [ + { + path: '', + component: SaleCategoryListComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + list: saleCategoryListResolver, + }, + }, + { + path: 'new', + component: SaleCategoryDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + item: saleCategoryResolver, + taxes: taxListResolver, + products: productListResolver, + }, + }, + { + path: ':id', + component: SaleCategoryDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + item: saleCategoryResolver, + taxes: taxListResolver, + products: productListResolver, + }, + }, +]; diff --git a/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.html b/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.html index 1ea416a..2483909 100644 --- a/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.html +++ b/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.html @@ -21,9 +21,11 @@ Tax - - {{ t.name }} - + @for (t of taxes; track t) { + + {{ t.name }} + + } @@ -31,7 +33,9 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.spec.ts b/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.spec.ts index aec6ea5..ccb3883 100644 --- a/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.spec.ts +++ b/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('SaleCategoryDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SaleCategoryDetailComponent], + imports: [SaleCategoryDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.ts b/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.ts index 1307b41..8efc7f4 100644 --- a/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.ts +++ b/bookie/src/app/sale-category/sale-category-detail/sale-category-detail.component.ts @@ -1,7 +1,26 @@ +import { CurrencyPipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { round } from 'mathjs'; import { BehaviorSubject } from 'rxjs'; @@ -18,6 +37,34 @@ import { SaleCategoryDetailDatasource } from './sale-category-detail-datasource' selector: 'app-sale-category-detail', templateUrl: './sale-category-detail.component.html', styleUrls: ['./sale-category-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSuffix, + MatSelect, + MatOption, + MatCardActions, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + RouterLink, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class SaleCategoryDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -75,27 +122,27 @@ export class SaleCategoryDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/sale-categories'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/sale-categories'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/sale-category/sale-category-list-resolver.service.ts b/bookie/src/app/sale-category/sale-category-list-resolver.service.ts deleted file mode 100644 index e5f0e42..0000000 --- a/bookie/src/app/sale-category/sale-category-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { SaleCategory } from '../core/sale-category'; - -import { SaleCategoryService } from './sale-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SaleCategoryListResolver { - constructor(private ser: SaleCategoryService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/sale-category/sale-category-list-resolver.service.spec.ts b/bookie/src/app/sale-category/sale-category-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/sale-category/sale-category-list-resolver.service.spec.ts rename to bookie/src/app/sale-category/sale-category-list.resolver.spec.ts diff --git a/bookie/src/app/sale-category/sale-category-list.resolver.ts b/bookie/src/app/sale-category/sale-category-list.resolver.ts new file mode 100644 index 0000000..abdae03 --- /dev/null +++ b/bookie/src/app/sale-category/sale-category-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SaleCategory } from '../core/sale-category'; + +import { SaleCategoryService } from './sale-category.service'; + +export const saleCategoryListResolver: ResolveFn = () => { + return inject(SaleCategoryService).list(); +}; diff --git a/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.spec.ts b/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.spec.ts index da6b682..b3b0c25 100644 --- a/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.spec.ts +++ b/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.spec.ts @@ -8,7 +8,7 @@ describe('SaleCategoryListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [SaleCategoryListComponent], + imports: [SaleCategoryListComponent], }).compileComponents(); fixture = TestBed.createComponent(SaleCategoryListComponent); diff --git a/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.ts b/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.ts index 4d43874..0896192 100644 --- a/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.ts +++ b/bookie/src/app/sale-category/sale-category-list/sale-category-list.component.ts @@ -1,6 +1,21 @@ +import { PercentPipe } from '@angular/common'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatTable } from '@angular/material/table'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { SaleCategory } from '../../core/sale-category'; @@ -13,6 +28,28 @@ import { SaleCategoryListDatasource } from './sale-category-list-datasource'; selector: 'app-sale-category-list', templateUrl: './sale-category-list.component.html', styleUrls: ['./sale-category-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + PercentPipe, + ], }) export class SaleCategoryListComponent implements OnInit { @ViewChild('table', { static: true }) table?: MatTable; diff --git a/bookie/src/app/sale-category/sale-category-resolver.service.ts b/bookie/src/app/sale-category/sale-category-resolver.service.ts deleted file mode 100644 index aefdd23..0000000 --- a/bookie/src/app/sale-category/sale-category-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { SaleCategory } from '../core/sale-category'; - -import { SaleCategoryService } from './sale-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SaleCategoryResolver { - constructor(private ser: SaleCategoryService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/sale-category/sale-category-resolver.service.spec.ts b/bookie/src/app/sale-category/sale-category.resolver.spec.ts similarity index 100% rename from bookie/src/app/sale-category/sale-category-resolver.service.spec.ts rename to bookie/src/app/sale-category/sale-category.resolver.spec.ts diff --git a/bookie/src/app/sale-category/sale-category.resolver.ts b/bookie/src/app/sale-category/sale-category.resolver.ts new file mode 100644 index 0000000..1daa40e --- /dev/null +++ b/bookie/src/app/sale-category/sale-category.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SaleCategory } from '../core/sale-category'; + +import { SaleCategoryService } from './sale-category.service'; + +export const saleCategoryResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(SaleCategoryService).get(id); +}; diff --git a/bookie/src/app/sale-report/sale-report-resolver.service.ts b/bookie/src/app/sale-report/sale-report-resolver.service.ts deleted file mode 100644 index 59dc250..0000000 --- a/bookie/src/app/sale-report/sale-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { SaleReport } from './sale-report'; -import { SaleReportService } from './sale-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SaleReportResolver { - constructor(private ser: SaleReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/sale-report/sale-report-routing.module.spec.ts b/bookie/src/app/sale-report/sale-report-routing.module.spec.ts deleted file mode 100644 index d2e7492..0000000 --- a/bookie/src/app/sale-report/sale-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SaleReportRoutingModule } from './sale-report-routing.module'; - -describe('SaleReportRoutingModule', () => { - let saleReportRoutingModule: SaleReportRoutingModule; - - beforeEach(() => { - saleReportRoutingModule = new SaleReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(saleReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sale-report/sale-report-routing.module.ts b/bookie/src/app/sale-report/sale-report-routing.module.ts deleted file mode 100644 index a58a1db..0000000 --- a/bookie/src/app/sale-report/sale-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { SaleReportResolver } from './sale-report-resolver.service'; -import { SaleReportComponent } from './sale-report.component'; - -const saleReportRoutes: Routes = [ - { - path: '', - component: SaleReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sale Report', - }, - resolve: { - info: SaleReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(saleReportRoutes)], - exports: [RouterModule], - providers: [SaleReportResolver], -}) -export class SaleReportRoutingModule {} diff --git a/bookie/src/app/sale-report/sale-report.component.spec.ts b/bookie/src/app/sale-report/sale-report.component.spec.ts index 070d5e1..84ac5b6 100644 --- a/bookie/src/app/sale-report/sale-report.component.spec.ts +++ b/bookie/src/app/sale-report/sale-report.component.spec.ts @@ -8,7 +8,7 @@ describe('SaleReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SaleReportComponent], + imports: [SaleReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sale-report/sale-report.component.ts b/bookie/src/app/sale-report/sale-report.component.ts index f04ce05..f79bbc3 100644 --- a/bookie/src/app/sale-report/sale-report.component.ts +++ b/bookie/src/app/sale-report/sale-report.component.ts @@ -1,7 +1,26 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToasterService } from '../core/toaster.service'; import { ToCsvService } from '../shared/to-csv.service'; @@ -14,6 +33,36 @@ import { SaleReportService } from './sale-report.service'; selector: 'app-sale-report', templateUrl: './sale-report.component.html', styleUrls: ['./sale-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CurrencyPipe, + ], }) export class SaleReportComponent implements OnInit { info: SaleReport = new SaleReport(); @@ -72,14 +121,14 @@ export class SaleReportComponent implements OnInit { } print() { - this.ser.print(this.info.startDate, this.info.finishDate).subscribe( - () => { + this.ser.print(this.info.startDate, this.info.finishDate).subscribe({ + next: () => { this.toaster.show('', 'Successfully Printed'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } exportCsv() { diff --git a/bookie/src/app/sale-report/sale-report.module.spec.ts b/bookie/src/app/sale-report/sale-report.module.spec.ts deleted file mode 100644 index 45e32f4..0000000 --- a/bookie/src/app/sale-report/sale-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SaleReportModule } from './sale-report.module'; - -describe('SaleReportModule', () => { - let saleReportModule: SaleReportModule; - - beforeEach(() => { - saleReportModule = new SaleReportModule(); - }); - - it('should create an instance', () => { - expect(saleReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sale-report/sale-report.module.ts b/bookie/src/app/sale-report/sale-report.module.ts deleted file mode 100644 index 79e9d7b..0000000 --- a/bookie/src/app/sale-report/sale-report.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { SaleReportRoutingModule } from './sale-report-routing.module'; -import { SaleReportComponent } from './sale-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - SaleReportRoutingModule, - ], - declarations: [SaleReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class SaleReportModule {} diff --git a/bookie/src/app/sale-report/sale-report-resolver.service.spec.ts b/bookie/src/app/sale-report/sale-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/sale-report/sale-report-resolver.service.spec.ts rename to bookie/src/app/sale-report/sale-report.resolver.spec.ts diff --git a/bookie/src/app/sale-report/sale-report.resolver.ts b/bookie/src/app/sale-report/sale-report.resolver.ts new file mode 100644 index 0000000..8ca5ddd --- /dev/null +++ b/bookie/src/app/sale-report/sale-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SaleReport } from './sale-report'; +import { SaleReportService } from './sale-report.service'; + +export const saleReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(SaleReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/sale-report/sale-report.routes.ts b/bookie/src/app/sale-report/sale-report.routes.ts new file mode 100644 index 0000000..c0129b1 --- /dev/null +++ b/bookie/src/app/sale-report/sale-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { SaleReportComponent } from './sale-report.component'; +import { saleReportResolver } from './sale-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: SaleReportComponent, + canActivate: [authGuard], + data: { + permission: 'Sale Report', + }, + resolve: { + info: saleReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/sales/bill-number/bill-number.component.html b/bookie/src/app/sales/bill-number/bill-number.component.html index d7ccae8..529749b 100644 --- a/bookie/src/app/sales/bill-number/bill-number.component.html +++ b/bookie/src/app/sales/bill-number/bill-number.component.html @@ -4,9 +4,11 @@ Regime - - {{ r.name }} - + @for (r of regimes; track r) { + + {{ r.name }} + + } diff --git a/bookie/src/app/sales/bill-number/bill-number.component.spec.ts b/bookie/src/app/sales/bill-number/bill-number.component.spec.ts index 3fe926c..30344c1 100644 --- a/bookie/src/app/sales/bill-number/bill-number.component.spec.ts +++ b/bookie/src/app/sales/bill-number/bill-number.component.spec.ts @@ -8,7 +8,7 @@ describe('QuantityComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BillNumberComponent], + imports: [BillNumberComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/bill-number/bill-number.component.ts b/bookie/src/app/sales/bill-number/bill-number.component.ts index 9d1b6f6..9444ff3 100644 --- a/bookie/src/app/sales/bill-number/bill-number.component.ts +++ b/bookie/src/app/sales/bill-number/bill-number.component.ts @@ -1,12 +1,38 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatOption } from '@angular/material/core'; +import { + MatDialogRef, + MAT_DIALOG_DATA, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { Regime } from 'src/app/core/regime'; @Component({ selector: 'app-bill-number', templateUrl: './bill-number.component.html', styleUrls: ['./bill-number.component.css'], + standalone: true, + imports: [ + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatSelect, + MatOption, + MatInput, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class BillNumberComponent implements OnInit { form: FormGroup<{ diff --git a/bookie/src/app/sales/bill-type/bill-type.component.spec.ts b/bookie/src/app/sales/bill-type/bill-type.component.spec.ts index 8d4bcd0..faa8a43 100644 --- a/bookie/src/app/sales/bill-type/bill-type.component.spec.ts +++ b/bookie/src/app/sales/bill-type/bill-type.component.spec.ts @@ -8,7 +8,7 @@ describe('BillTypeComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BillTypeComponent], + imports: [BillTypeComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/bill-type/bill-type.component.ts b/bookie/src/app/sales/bill-type/bill-type.component.ts index b786e31..e3c8aea 100644 --- a/bookie/src/app/sales/bill-type/bill-type.component.ts +++ b/bookie/src/app/sales/bill-type/bill-type.component.ts @@ -1,5 +1,15 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatButton } from '@angular/material/button'; +import { MatCard } from '@angular/material/card'; +import { MatRipple } from '@angular/material/core'; +import { + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; import { VoucherType } from '../bills/voucher-type'; @@ -7,6 +17,17 @@ import { VoucherType } from '../bills/voucher-type'; selector: 'app-bill-type', templateUrl: './bill-type.component.html', styleUrls: ['./bill-type.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + MatCard, + MatRipple, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class BillTypeComponent { selected?: string; diff --git a/bookie/src/app/sales/bill.service.spec.ts b/bookie/src/app/sales/bill.service.spec.ts index c0a8b37..6b71c4d 100644 --- a/bookie/src/app/sales/bill.service.spec.ts +++ b/bookie/src/app/sales/bill.service.spec.ts @@ -1,12 +1,17 @@ -import { TestBed } from '@angular/core/testing'; +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { inject, TestBed } from '@angular/core/testing'; import { BillService } from './bill.service'; describe('BillService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: BillService = TestBed.get(BillService); - expect(service).toBeTruthy(); + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + providers: [BillService, provideHttpClient(withInterceptorsFromDi())], + }); }); + + it('should be created', inject([BillService], (service: BillService) => { + expect(service).toBeTruthy(); + })); }); diff --git a/bookie/src/app/sales/bill.service.ts b/bookie/src/app/sales/bill.service.ts index a3f3494..766c3d9 100644 --- a/bookie/src/app/sales/bill.service.ts +++ b/bookie/src/app/sales/bill.service.ts @@ -22,7 +22,9 @@ import { VoucherType } from './bills/voucher-type'; import { VoucherService } from './bills/voucher.service'; import { ModifiersComponent } from './modifiers/modifiers.component'; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class BillService { public dataObs: BehaviorSubject; public bill: Bill = new Bill(); diff --git a/bookie/src/app/sales/bills/bill-resolver.service.ts b/bookie/src/app/sales/bills/bill-resolver.service.ts deleted file mode 100644 index 387a3f7..0000000 --- a/bookie/src/app/sales/bills/bill-resolver.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Bill } from './bill'; -import { VoucherService } from './voucher.service'; - -@Injectable({ - providedIn: 'root', -}) -export class BillResolver { - constructor(private ser: VoucherService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const tableId = route.queryParamMap.get('table'); - const guestId = route.queryParamMap.get('guest'); - const voucherId = route.queryParamMap.get('voucher'); - const billId = route.queryParamMap.get('bill'); - if (billId !== null) { - return this.ser.getFromBill(billId); - } - if (tableId !== null) { - return this.ser.getFromTable(tableId as string, voucherId, guestId); - } - if (voucherId !== null) { - return this.ser.getFromId(voucherId); - } - throw new Error('Unable to get bill'); - } -} diff --git a/bookie/src/app/sales/bills/bill.resolver.ts b/bookie/src/app/sales/bills/bill.resolver.ts new file mode 100644 index 0000000..9d04c08 --- /dev/null +++ b/bookie/src/app/sales/bills/bill.resolver.ts @@ -0,0 +1,22 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Bill } from './bill'; +import { VoucherService } from './voucher.service'; + +export const billResolver: ResolveFn = (route) => { + const tableId = route.queryParamMap.get('table'); + const guestId = route.queryParamMap.get('guest'); + const voucherId = route.queryParamMap.get('voucher'); + const billId = route.queryParamMap.get('bill'); + if (billId !== null) { + return inject(VoucherService).getFromBill(billId); + } + if (tableId !== null) { + return inject(VoucherService).getFromTable(tableId as string, voucherId, guestId); + } + if (voucherId !== null) { + return inject(VoucherService).getFromId(voucherId); + } + throw new Error('Unable to get bill'); +}; diff --git a/bookie/src/app/sales/bills/bills.component.html b/bookie/src/app/sales/bills/bills.component.html index c7655f9..1a18a22 100644 --- a/bookie/src/app/sales/bills/bills.component.html +++ b/bookie/src/app/sales/bills/bills.component.html @@ -40,21 +40,23 @@ - - - - + @if (row.isOldKot) { + + + } + @if (!row.isKot) { + + + } @@ -64,7 +66,9 @@ {{ row.info }}
    -
  • {{ m.name }}
  • + @for (m of row.modifiers; track m) { +
  • {{ m.name }}
  • + }
@@ -72,45 +76,36 @@ Quantity - - - - - + @if (!row.isKot) { + + } + @if (!row.isKot) { + + } + @if (!row.isKot) { + + } + @if (!row.isKot) { + + } + @if (row.isKot) { + + } diff --git a/bookie/src/app/sales/bills/bills.component.sass b/bookie/src/app/sales/bills/bills.component.sass index 869bf32..1cf8c3f 100644 --- a/bookie/src/app/sales/bills/bills.component.sass +++ b/bookie/src/app/sales/bills/bills.component.sass @@ -1,7 +1,7 @@ @use '@angular/material' as mat -$my-grey: mat.define-palette(mat.$grey-palette) -$my-green: mat.define-palette(mat.$green-palette) +$my-grey: mat.m2-define-palette(mat.$m2-grey-palette) +$my-green: mat.m2-define-palette(mat.$m2-green-palette) .right-align display: flex @@ -17,72 +17,72 @@ table background-color: #1b5e20 color: #ffffff font-size: 1.2em - // color: mat.get-color-from-palette($my-grey, '900-contrast') - // background: mat.get-color-from-palette($my-grey, 900) + // color: mat.m2-get-color-from-palette($my-grey, '900-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 900) .grey700, .mat-column-tax-title, .mat-column-tax-amount background-color: #388e3c color: #ffffff - // color: mat.get-color-from-palette($my-grey, '900-contrast') - // background: mat.get-color-from-palette($my-grey, 900) + // color: mat.m2-get-color-from-palette($my-grey, '900-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 900) .grey500, .mat-column-discount-title, .mat-column-discount-amount background-color: #4caf50 color: #000000 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .grey300, .mat-column-hh-title, .mat-column-hh-amount, .mat-column-gross-title, .mat-column-gross-amount background-color: #81c784 color: #000000 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .blue400, .old-kot background-color: #42a5f5 color: #ffffff - // color: mat.get-color-from-palette($my-green, 700) - // background-color: mat.get-color-from-palette($my-green, 500) + // color: mat.m2-get-color-from-palette($my-green, 700) + // background-color: mat.m2-get-color-from-palette($my-green, 500) .blue800, .new-kot background-color: #1565c0 color: #ffffff - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .red100, .is-printed // background-color: #ffcdd2 // color: #000000 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .deep-purple-50 background-color: #ede7f6 color: #000000 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .deep-purple-100 background-color: #d1c4e9 color: #000000 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .deep-purple-200 background-color: #b39ddb color: #000000 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .yellow300, .hh-new background-color: #fff176 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) .hh-printed background-color: #f7ca18 - // color: mat.get-color-from-palette($my-grey, '300-contrast') - // background: mat.get-color-from-palette($my-grey, 300) + // color: mat.m2-get-color-from-palette($my-grey, '300-contrast') + // background: mat.m2-get-color-from-palette($my-grey, 300) // https://github.com/btxtiger/mat-icon-button-sizes $button-size: 32px diff --git a/bookie/src/app/sales/bills/bills.component.spec.ts b/bookie/src/app/sales/bills/bills.component.spec.ts index bb46fbb..b69bcf1 100644 --- a/bookie/src/app/sales/bills/bills.component.spec.ts +++ b/bookie/src/app/sales/bills/bills.component.spec.ts @@ -8,7 +8,7 @@ describe('BillsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BillsComponent], + imports: [BillsComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/bills/bills.component.ts b/bookie/src/app/sales/bills/bills.component.ts index 9073683..1253e71 100644 --- a/bookie/src/app/sales/bills/bills.component.ts +++ b/bookie/src/app/sales/bills/bills.component.ts @@ -1,6 +1,28 @@ +import { AsyncPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatFooterCellDef, + MatFooterCell, +} from '@angular/material/table'; +import { MatTooltip } from '@angular/material/tooltip'; +import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; import { Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; @@ -28,6 +50,35 @@ import { VoucherType } from './voucher-type'; selector: 'app-bills', templateUrl: './bills.component.html', styleUrls: ['./bills.component.sass'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatTooltip, + MatButton, + MatCellDef, + MatCell, + MatCheckbox, + MatIconButton, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatFooterCellDef, + MatFooterCell, + RouterOutlet, + AsyncPipe, + CurrencyPipe, + ], }) export class BillsComponent implements OnInit { dataSource: BillsDataSource = new BillsDataSource(this.bs.dataObs); @@ -256,15 +307,15 @@ export class BillsComponent implements OnInit { return this.bs.moveKot(kot.kotId as string, table); }), ) - .subscribe( - () => { + .subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (x) => { + error: (x) => { this.toaster.show('Error', x); }, - ); + }); } rowQuantityDisabled(row: BillViewItem) { diff --git a/bookie/src/app/sales/bills/update-table-resolver.service.ts b/bookie/src/app/sales/bills/update-table-resolver.service.ts deleted file mode 100644 index b167f8e..0000000 --- a/bookie/src/app/sales/bills/update-table-resolver.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable, of as observableOf } from 'rxjs'; - -@Injectable({ - providedIn: 'root', -}) -export class UpdateTableResolver { - constructor() {} - - resolve(route: ActivatedRouteSnapshot): Observable { - return route.queryParamMap.get('bill') !== null ? observableOf(false) : observableOf(true); - } -} diff --git a/bookie/src/app/sales/bills/update-table.resolver.ts b/bookie/src/app/sales/bills/update-table.resolver.ts new file mode 100644 index 0000000..b81a6d7 --- /dev/null +++ b/bookie/src/app/sales/bills/update-table.resolver.ts @@ -0,0 +1,6 @@ +import { ResolveFn } from '@angular/router'; +import { of as observableOf } from 'rxjs'; + +export const updateTableResolver: ResolveFn = (route) => { + return route.queryParamMap.get('bill') !== null ? observableOf(false) : observableOf(true); +}; diff --git a/bookie/src/app/sales/choose-customer/choose-customer.component.html b/bookie/src/app/sales/choose-customer/choose-customer.component.html index 4696505..a7d1427 100644 --- a/bookie/src/app/sales/choose-customer/choose-customer.component.html +++ b/bookie/src/app/sales/choose-customer/choose-customer.component.html @@ -19,9 +19,9 @@ [displayWith]="displayFn" (optionSelected)="selected($event)" > - {{ customer.name }} - {{ customer.phone }} + @for (customer of customers | async; track customer) { + {{ customer.name }} - {{ customer.phone }} + }
@@ -41,17 +41,15 @@

-
- - Discount on {{ r.name }} - - % - -
+ @for (r of item.discounts; track r; let i = $index) { +
+ + Discount on {{ r.name }} + + % + +
+ }
diff --git a/bookie/src/app/sales/choose-customer/choose-customer.component.spec.ts b/bookie/src/app/sales/choose-customer/choose-customer.component.spec.ts index 7422025..a2af41f 100644 --- a/bookie/src/app/sales/choose-customer/choose-customer.component.spec.ts +++ b/bookie/src/app/sales/choose-customer/choose-customer.component.spec.ts @@ -8,7 +8,7 @@ describe('ChooseCustomerComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ChooseCustomerComponent], + imports: [ChooseCustomerComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/choose-customer/choose-customer.component.ts b/bookie/src/app/sales/choose-customer/choose-customer.component.ts index 415c74e..705f92e 100644 --- a/bookie/src/app/sales/choose-customer/choose-customer.component.ts +++ b/bookie/src/app/sales/choose-customer/choose-customer.component.ts @@ -1,7 +1,21 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { AsyncPipe } from '@angular/common'; import { Component, Inject } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; -import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { round } from 'mathjs'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; @@ -13,6 +27,25 @@ import { CustomerService } from '../../customers/customer.service'; selector: 'app-choose-customer', templateUrl: './choose-customer.component.html', styleUrls: ['./choose-customer.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatAutocompleteTrigger, + MatAutocomplete, + MatOption, + MatCheckbox, + MatSuffix, + MatDialogActions, + MatButton, + MatDialogClose, + AsyncPipe, + ], }) export class ChooseCustomerComponent { form: FormGroup<{ diff --git a/bookie/src/app/sales/discount/discount.component.spec.ts b/bookie/src/app/sales/discount/discount.component.spec.ts index 0ce91a2..2fd9d83 100644 --- a/bookie/src/app/sales/discount/discount.component.spec.ts +++ b/bookie/src/app/sales/discount/discount.component.spec.ts @@ -8,7 +8,7 @@ describe('DiscountComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DiscountComponent], + imports: [DiscountComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/discount/discount.component.ts b/bookie/src/app/sales/discount/discount.component.ts index b4c3f34..6b62524 100644 --- a/bookie/src/app/sales/discount/discount.component.ts +++ b/bookie/src/app/sales/discount/discount.component.ts @@ -1,6 +1,30 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { PercentPipe } from '@angular/common'; import { Component, Inject } from '@angular/core'; -import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormArray, FormControl, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatSuffix, MatHint } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { round } from 'mathjs'; import { Observable } from 'rxjs'; @@ -11,6 +35,31 @@ import { DiscountItem } from './discount-item'; selector: 'app-modifiers', templateUrl: './discount.component.html', styleUrls: ['./discount.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFormField, + MatInput, + MatSuffix, + MatHint, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatDialogActions, + MatButton, + MatDialogClose, + PercentPipe, + ], }) export class DiscountComponent { list: DiscountItem[] = []; diff --git a/bookie/src/app/sales/home/sales-home.component.spec.ts b/bookie/src/app/sales/home/sales-home.component.spec.ts index 8c3e4ba..88abc85 100644 --- a/bookie/src/app/sales/home/sales-home.component.spec.ts +++ b/bookie/src/app/sales/home/sales-home.component.spec.ts @@ -8,7 +8,7 @@ describe('SalesHomeComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SalesHomeComponent], + imports: [SalesHomeComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/home/sales-home.component.ts b/bookie/src/app/sales/home/sales-home.component.ts index 0eb1043..9de9e63 100644 --- a/bookie/src/app/sales/home/sales-home.component.ts +++ b/bookie/src/app/sales/home/sales-home.component.ts @@ -1,6 +1,8 @@ import { Component } from '@angular/core'; +import { MatCard } from '@angular/material/card'; +import { MatRipple } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { Observable, of as observableOf } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; @@ -26,6 +28,8 @@ import { TablesDialogComponent } from '../tables-dialog/tables-dialog.component' selector: 'app-sales-home', templateUrl: './sales-home.component.html', styleUrls: ['./sales-home.component.css'], + standalone: true, + imports: [MatCard, MatRipple, RouterLink], }) export class SalesHomeComponent { constructor( @@ -61,15 +65,15 @@ export class SalesHomeComponent { if (this.route.snapshot.queryParamMap.has('guest')) { guestBookId = this.route.snapshot.queryParamMap.get('guest'); } - this.bs.printKot(guestBookId).subscribe( - () => { + this.bs.printKot(guestBookId).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (result) => { + error: (result) => { this.toaster.show('Error', result); }, - ); + }); } discountAllowed(): boolean { @@ -164,15 +168,15 @@ export class SalesHomeComponent { }), switchMap((x: VoucherType) => this.bs.printBill(guestBookId, x as VoucherType)), ) - .subscribe( - () => { + .subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (result) => { + error: (result) => { this.toaster.show('Error', result); }, - ); + }); } receivePaymentAllowed(): boolean { @@ -213,15 +217,15 @@ export class SalesHomeComponent { return this.bs.receivePayment(value); }), ) - .subscribe( - () => { + .subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (value) => { + error: (value) => { this.toaster.show('Error', value); }, - ); + }); } moveTableAllowed(): boolean { @@ -256,15 +260,15 @@ export class SalesHomeComponent { map((x) => x as Table), switchMap((x: Table) => (x.status ? this.bs.mergeTable(x) : this.bs.moveTable(x))), ) - .subscribe( - () => { + .subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (x) => { + error: (x) => { this.toaster.show('Error', x); }, - ); + }); } cancelBillAllowed(): boolean { @@ -312,15 +316,15 @@ export class SalesHomeComponent { throw new Error('You chose not to cancel the bill'); }), ) - .subscribe( - () => { + .subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (x) => { + error: (x) => { this.toaster.show('Error', x); }, - ); + }); } splitBillAllowed(): boolean { @@ -379,15 +383,15 @@ export class SalesHomeComponent { map((x) => x as Table), switchMap((x: Table) => this.bs.splitBill(inventories, x)), ) - .subscribe( - () => { + .subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigate(['/sales']); }, - (x) => { + error: (x) => { this.toaster.show('Error', x); }, - ); + }); } splitBillWithChoice() { diff --git a/bookie/src/app/sales/menu-categories/menu-categories-resolver.service.spec.ts b/bookie/src/app/sales/menu-categories/menu-categories-resolver.service.spec.ts deleted file mode 100644 index 1c4e7f1..0000000 --- a/bookie/src/app/sales/menu-categories/menu-categories-resolver.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { MenuCategoriesResolver } from './menu-categories-resolver.service'; - -describe('MenuCategoriesResolver', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: MenuCategoriesResolver = TestBed.get(MenuCategoriesResolver); - expect(service).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sales/menu-categories/menu-categories-resolver.service.ts b/bookie/src/app/sales/menu-categories/menu-categories-resolver.service.ts deleted file mode 100644 index fa02397..0000000 --- a/bookie/src/app/sales/menu-categories/menu-categories-resolver.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { MenuCategory } from '../../core/menu-category'; -import { MenuCategoryService } from '../../menu-category/menu-category.service'; - -@Injectable({ - providedIn: 'root', -}) -export class MenuCategoriesResolver { - constructor(private ser: MenuCategoryService) {} - - resolve(): Observable { - return this.ser.list(true); - } -} diff --git a/bookie/src/app/sales/menu-categories/menu-categories.component.html b/bookie/src/app/sales/menu-categories/menu-categories.component.html index 7d3c7c7..06aa8f0 100644 --- a/bookie/src/app/sales/menu-categories/menu-categories.component.html +++ b/bookie/src/app/sales/menu-categories/menu-categories.component.html @@ -9,15 +9,16 @@ >

Back

- -

{{ item.name }}

-
+ @for (item of list; track item) { + +

{{ item.name }}

+
+ } diff --git a/bookie/src/app/sales/menu-categories/menu-categories.component.spec.ts b/bookie/src/app/sales/menu-categories/menu-categories.component.spec.ts index 83ffff2..a0a0238 100644 --- a/bookie/src/app/sales/menu-categories/menu-categories.component.spec.ts +++ b/bookie/src/app/sales/menu-categories/menu-categories.component.spec.ts @@ -8,7 +8,7 @@ describe('MenuCategoriesComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MenuCategoriesComponent], + imports: [MenuCategoriesComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/menu-categories/menu-categories.component.ts b/bookie/src/app/sales/menu-categories/menu-categories.component.ts index 52de69c..2a08396 100644 --- a/bookie/src/app/sales/menu-categories/menu-categories.component.ts +++ b/bookie/src/app/sales/menu-categories/menu-categories.component.ts @@ -1,5 +1,7 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatCard, MatCardContent } from '@angular/material/card'; +import { MatRipple } from '@angular/material/core'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { MenuCategory } from '../../core/menu-category'; @@ -7,6 +9,8 @@ import { MenuCategory } from '../../core/menu-category'; selector: 'app-menu-category', templateUrl: './menu-categories.component.html', styleUrls: ['./menu-categories.component.sass'], + standalone: true, + imports: [MatCard, MatCardContent, MatRipple, RouterLink], }) export class MenuCategoriesComponent implements OnInit { list: MenuCategory[] = []; diff --git a/bookie/src/app/sales/menu-categories/menu-categories.resolver.spec.ts b/bookie/src/app/sales/menu-categories/menu-categories.resolver.spec.ts new file mode 100644 index 0000000..f3c3619 --- /dev/null +++ b/bookie/src/app/sales/menu-categories/menu-categories.resolver.spec.ts @@ -0,0 +1,17 @@ +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { inject, TestBed } from '@angular/core/testing'; + +import { MenuCategoriesResolver } from './menu-categories-resolver.service'; + +describe('MenuCategoriesResolver', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + providers: [MenuCategoriesResolver, provideHttpClient(withInterceptorsFromDi())], + }); + }); + + it('should be created', inject([MenuCategoriesResolver], (service: MenuCategoriesResolver) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/bookie/src/app/sales/menu-categories/menu-categories.resolver.ts b/bookie/src/app/sales/menu-categories/menu-categories.resolver.ts new file mode 100644 index 0000000..d6e65a5 --- /dev/null +++ b/bookie/src/app/sales/menu-categories/menu-categories.resolver.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { MenuCategory } from '../../core/menu-category'; +import { MenuCategoryService } from '../../menu-category/menu-category.service'; + +export const menuCategoriesResolver: ResolveFn = () => { + return inject(MenuCategoryService).list(true); +}; diff --git a/bookie/src/app/sales/modifiers/modifiers.component.html b/bookie/src/app/sales/modifiers/modifiers.component.html index 1f9e28d..87f85ad 100644 --- a/bookie/src/app/sales/modifiers/modifiers.component.html +++ b/bookie/src/app/sales/modifiers/modifiers.component.html @@ -1,26 +1,33 @@ - - - {{ item.name }} - - {{ item.minimum }} - ∞ - {{ item.minimum }} - {{ item.maximum }} - - -
- -

{{ m.name }}

-
-
-
+ @for (item of list; track item) { + + + {{ item.name }} + + @if (!item.maximum) { + {{ item.minimum }} - ∞ + } + @if (!!item.maximum) { + {{ item.minimum }} - {{ item.maximum }} + } + + +
+ @for (m of item.modifiers; track m) { + +

{{ m.name }}

+
+ } +
+
+ }
diff --git a/bookie/src/app/sales/modifiers/modifiers.component.spec.ts b/bookie/src/app/sales/modifiers/modifiers.component.spec.ts index addbace..83adcc4 100644 --- a/bookie/src/app/sales/modifiers/modifiers.component.spec.ts +++ b/bookie/src/app/sales/modifiers/modifiers.component.spec.ts @@ -8,7 +8,7 @@ describe('ModifiersComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ModifiersComponent], + imports: [ModifiersComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/modifiers/modifiers.component.ts b/bookie/src/app/sales/modifiers/modifiers.component.ts index 73ee8b1..43f05c3 100644 --- a/bookie/src/app/sales/modifiers/modifiers.component.ts +++ b/bookie/src/app/sales/modifiers/modifiers.component.ts @@ -1,5 +1,12 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatBadge } from '@angular/material/badge'; +import { MatButton } from '@angular/material/button'; +import { MatCard } from '@angular/material/card'; +import { MatChipListbox, MatChipOption } from '@angular/material/chips'; +import { MatRipple } from '@angular/material/core'; +import { MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog'; +import { MatTabGroup, MatTab, MatTabLabel } from '@angular/material/tabs'; import { Observable } from 'rxjs'; import { Modifier } from '../../core/modifier'; @@ -9,6 +16,22 @@ import { ModifierCategory } from '../../core/modifier-category'; selector: 'app-modifiers', templateUrl: './modifiers.component.html', styleUrls: ['./modifiers.component.css'], + standalone: true, + imports: [ + CdkScrollable, + MatDialogContent, + MatTabGroup, + MatTab, + MatTabLabel, + MatChipListbox, + MatBadge, + MatChipOption, + MatCard, + MatRipple, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class ModifiersComponent { list: ModifierCategory[] = []; diff --git a/bookie/src/app/sales/pax/pax.component.spec.ts b/bookie/src/app/sales/pax/pax.component.spec.ts index 4084c23..a678275 100644 --- a/bookie/src/app/sales/pax/pax.component.spec.ts +++ b/bookie/src/app/sales/pax/pax.component.spec.ts @@ -8,7 +8,7 @@ describe('PaxComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [PaxComponent], + imports: [PaxComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/pax/pax.component.ts b/bookie/src/app/sales/pax/pax.component.ts index 5b28591..0612f0d 100644 --- a/bookie/src/app/sales/pax/pax.component.ts +++ b/bookie/src/app/sales/pax/pax.component.ts @@ -1,11 +1,35 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; @Component({ selector: 'app-pax', templateUrl: './pax.component.html', styleUrls: ['./pax.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class PaxComponent implements OnInit { form: FormGroup<{ diff --git a/bookie/src/app/sales/products/products-resolver.service.spec.ts b/bookie/src/app/sales/products/products-resolver.service.spec.ts deleted file mode 100644 index bd10195..0000000 --- a/bookie/src/app/sales/products/products-resolver.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ProductsResolver } from './products-resolver.service'; - -describe('ProductsResolver', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: ProductsResolver = TestBed.get(ProductsResolver); - expect(service).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sales/products/products-resolver.service.ts b/bookie/src/app/sales/products/products-resolver.service.ts deleted file mode 100644 index f3f22b1..0000000 --- a/bookie/src/app/sales/products/products-resolver.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Router } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Product } from '../../core/product'; -import { ProductService } from '../../product/product.service'; - -@Injectable({ - providedIn: 'root', -}) -export class ProductsResolver { - constructor( - private ser: ProductService, - private router: Router, - ) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id') as string; - return this.ser.listIsActiveOfCategory(id); - } -} diff --git a/bookie/src/app/sales/products/products.component.html b/bookie/src/app/sales/products/products.component.html index 2af9dfa..e655903 100644 --- a/bookie/src/app/sales/products/products.component.html +++ b/bookie/src/app/sales/products/products.component.html @@ -9,18 +9,19 @@ >

Back

- -

{{ item.name }}

- {{ item.price | currency: 'INR' }} -
+ @for (item of list; track item) { + +

{{ item.name }}

+ {{ item.price | currency: 'INR' }} +
+ } diff --git a/bookie/src/app/sales/products/products.component.spec.ts b/bookie/src/app/sales/products/products.component.spec.ts index 22389ba..6e25826 100644 --- a/bookie/src/app/sales/products/products.component.spec.ts +++ b/bookie/src/app/sales/products/products.component.spec.ts @@ -8,7 +8,7 @@ describe('ProductsComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ProductsComponent], + imports: [ProductsComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/products/products.component.ts b/bookie/src/app/sales/products/products.component.ts index 7e8594b..d4455b8 100644 --- a/bookie/src/app/sales/products/products.component.ts +++ b/bookie/src/app/sales/products/products.component.ts @@ -1,5 +1,8 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatCard, MatCardContent } from '@angular/material/card'; +import { MatRipple } from '@angular/material/core'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Product } from '../../core/product'; import { BillService } from '../bill.service'; @@ -8,6 +11,8 @@ import { BillService } from '../bill.service'; selector: 'app-products', templateUrl: './products.component.html', styleUrls: ['./products.component.css'], + standalone: true, + imports: [MatCard, MatCardContent, MatRipple, RouterLink, CurrencyPipe], }) export class ProductsComponent implements OnInit { list: Product[] = []; diff --git a/bookie/src/app/sales/products/products.resolver.spec.ts b/bookie/src/app/sales/products/products.resolver.spec.ts new file mode 100644 index 0000000..51efc55 --- /dev/null +++ b/bookie/src/app/sales/products/products.resolver.spec.ts @@ -0,0 +1,17 @@ +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { inject, TestBed } from '@angular/core/testing'; + +import { ProductsResolver } from './products-resolver.service'; + +describe('ProductsResolver', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + providers: [ProductsResolver, provideHttpClient(withInterceptorsFromDi())], + }); + }); + + it('should be created', inject([ProductsResolver], (service: ProductsResolver) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/bookie/src/app/sales/products/products.resolver.ts b/bookie/src/app/sales/products/products.resolver.ts new file mode 100644 index 0000000..213338e --- /dev/null +++ b/bookie/src/app/sales/products/products.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Product } from '../../core/product'; +import { ProductService } from '../../product/product.service'; + +export const productsResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id') as string; + return inject(ProductService).listIsActiveOfCategory(id); +}; diff --git a/bookie/src/app/sales/quantity/quantity.component.spec.ts b/bookie/src/app/sales/quantity/quantity.component.spec.ts index fc5ecef..797abdd 100644 --- a/bookie/src/app/sales/quantity/quantity.component.spec.ts +++ b/bookie/src/app/sales/quantity/quantity.component.spec.ts @@ -8,7 +8,7 @@ describe('QuantityComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [QuantityComponent], + imports: [QuantityComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/quantity/quantity.component.ts b/bookie/src/app/sales/quantity/quantity.component.ts index 13271d9..89e0a66 100644 --- a/bookie/src/app/sales/quantity/quantity.component.ts +++ b/bookie/src/app/sales/quantity/quantity.component.ts @@ -1,6 +1,16 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { MathService } from '../../shared/math.service'; @@ -8,6 +18,18 @@ import { MathService } from '../../shared/math.service'; selector: 'app-quantity', templateUrl: './quantity.component.html', styleUrls: ['./quantity.component.css'], + standalone: true, + imports: [ + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class QuantityComponent implements OnInit { form: FormGroup<{ diff --git a/bookie/src/app/sales/reason/reason.component.spec.ts b/bookie/src/app/sales/reason/reason.component.spec.ts index 56cf788..b50c6c4 100644 --- a/bookie/src/app/sales/reason/reason.component.spec.ts +++ b/bookie/src/app/sales/reason/reason.component.spec.ts @@ -8,7 +8,7 @@ describe('VoidReasonComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ReasonComponent], + imports: [ReasonComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/reason/reason.component.ts b/bookie/src/app/sales/reason/reason.component.ts index 10dee27..db3dcc2 100644 --- a/bookie/src/app/sales/reason/reason.component.ts +++ b/bookie/src/app/sales/reason/reason.component.ts @@ -1,6 +1,29 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, ElementRef, Inject, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; import { ReasonDatasource } from './reason-datasource'; @@ -8,6 +31,29 @@ import { ReasonDatasource } from './reason-datasource'; selector: 'app-reason', templateUrl: './reason.component.html', styleUrls: ['./reason.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatTable, + MatColumnDef, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatFormField, + MatLabel, + MatInput, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class ReasonComponent { @ViewChild('son', { static: true }) son?: ElementRef; diff --git a/bookie/src/app/sales/receive-payment/receive-payment.component.html b/bookie/src/app/sales/receive-payment/receive-payment.component.html index 80dc400..fe69215 100644 --- a/bookie/src/app/sales/receive-payment/receive-payment.component.html +++ b/bookie/src/app/sales/receive-payment/receive-payment.component.html @@ -1,43 +1,45 @@

Receive Payment

- - - - Amount - {{ row.name }} - Balance - - - - - {{ - amount | currency: 'INR' - }} - - - - - - {{ balance | currency: 'INR' }} - - - - - - - - Reason - - + @if (this.displayTable) { + + + + Amount + {{ row.name }} + Balance + + + + {{ + amount | currency: 'INR' + }} + + + + + + {{ balance | currency: 'INR' }} + + + + + + } + @if (this.displayReason) { + + Reason + + + }
diff --git a/bookie/src/app/sales/receive-payment/receive-payment.component.spec.ts b/bookie/src/app/sales/receive-payment/receive-payment.component.spec.ts index a83e74b..3b92843 100644 --- a/bookie/src/app/sales/receive-payment/receive-payment.component.spec.ts +++ b/bookie/src/app/sales/receive-payment/receive-payment.component.spec.ts @@ -8,7 +8,7 @@ describe('ReceivePaymentComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ReceivePaymentComponent], + imports: [ReceivePaymentComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/receive-payment/receive-payment.component.ts b/bookie/src/app/sales/receive-payment/receive-payment.component.ts index 10cf95e..43ac7dc 100644 --- a/bookie/src/app/sales/receive-payment/receive-payment.component.ts +++ b/bookie/src/app/sales/receive-payment/receive-payment.component.ts @@ -1,6 +1,34 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { CurrencyPipe } from '@angular/common'; import { Component, ElementRef, Inject, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, +} from '@angular/material/table'; import { distinctUntilChanged, map, tap } from 'rxjs/operators'; import { ReceivePaymentItem } from '../../core/receive-payment-item'; @@ -14,6 +42,34 @@ import { ReceivePaymentDatasource } from './receive-payment-datasource'; selector: 'app-receive-payment', templateUrl: './receive-payment.component.html', styleUrls: ['./receive-payment.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatFooterCellDef, + MatFooterCell, + MatFormField, + MatInput, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatFooterRowDef, + MatFooterRow, + MatLabel, + MatDialogActions, + MatButton, + MatDialogClose, + CurrencyPipe, + ], }) export class ReceivePaymentComponent { @ViewChild('son', { static: true }) son?: ElementRef; diff --git a/bookie/src/app/sales/running-tables/running-tables-resolver.service.ts b/bookie/src/app/sales/running-tables/running-tables-resolver.service.ts deleted file mode 100644 index c4467d8..0000000 --- a/bookie/src/app/sales/running-tables/running-tables-resolver.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Table } from '../../core/table'; -import { TableService } from '../../tables/table.service'; - -@Injectable({ - providedIn: 'root', -}) -export class RunningTablesResolver { - constructor(private ser: TableService) {} - - resolve(): Observable { - return this.ser.running(); - } -} diff --git a/bookie/src/app/sales/running-tables/running-tables.component.html b/bookie/src/app/sales/running-tables/running-tables.component.html index 84e2b4f..71b41b8 100644 --- a/bookie/src/app/sales/running-tables/running-tables.component.html +++ b/bookie/src/app/sales/running-tables/running-tables.component.html @@ -4,21 +4,26 @@
- -

{{ table.name }}

- {{ table.guest }} - {{ table.pax ?? '-' }} / {{ table.seats }} / {{ table.section?.name }} - {{ table.date }} - {{ table.amount | currency: 'INR' }} -
+ @for (table of list; track table) { + +

{{ table.name }}

+ {{ table.guest }} + {{ table.pax ?? '-' }} / {{ table.seats }} / {{ table.section?.name }} + @if (table.date) { + {{ table.date }} + } + @if (table.amount) { + {{ table.amount | currency: 'INR' }} + } +
+ }

Open Bill

diff --git a/bookie/src/app/sales/running-tables/running-tables.component.spec.ts b/bookie/src/app/sales/running-tables/running-tables.component.spec.ts index cb55249..8df04ac 100644 --- a/bookie/src/app/sales/running-tables/running-tables.component.spec.ts +++ b/bookie/src/app/sales/running-tables/running-tables.component.spec.ts @@ -8,7 +8,7 @@ describe('RunningTablesComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RunningTablesComponent], + imports: [RunningTablesComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/running-tables/running-tables.component.ts b/bookie/src/app/sales/running-tables/running-tables.component.ts index 98b2796..0bba45f 100644 --- a/bookie/src/app/sales/running-tables/running-tables.component.ts +++ b/bookie/src/app/sales/running-tables/running-tables.component.ts @@ -1,4 +1,7 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatRipple } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, NavigationExtras, Router } from '@angular/router'; import { map } from 'rxjs/operators'; @@ -12,6 +15,8 @@ import { BillNumberComponent } from '../bill-number/bill-number.component'; selector: 'app-running-tables', templateUrl: './running-tables.component.html', styleUrls: ['./running-tables.component.sass'], + standalone: true, + imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatRipple, CurrencyPipe], }) export class RunningTablesComponent implements OnInit { regimes: Regime[] = []; @@ -57,9 +62,9 @@ export class RunningTablesComponent implements OnInit { return x; }), ) - .subscribe( - (x) => this.router.navigate(['/sales', 'bill'], { queryParams: { bill: x } }), - (x) => this.toaster.show('Error', x), - ); + .subscribe({ + next: (x) => this.router.navigate(['/sales', 'bill'], { queryParams: { bill: x } }), + error: (x) => this.toaster.show('Error', x), + }); } } diff --git a/bookie/src/app/sales/running-tables/running-tables.resolver.ts b/bookie/src/app/sales/running-tables/running-tables.resolver.ts new file mode 100644 index 0000000..6d66fa5 --- /dev/null +++ b/bookie/src/app/sales/running-tables/running-tables.resolver.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Table } from '../../core/table'; +import { TableService } from '../../tables/table.service'; + +export const runningTablesResolver: ResolveFn = () => { + return inject(TableService).running(); +}; diff --git a/bookie/src/app/sales/sales.module.ts b/bookie/src/app/sales/sales.module.ts deleted file mode 100644 index 251098b..0000000 --- a/bookie/src/app/sales/sales.module.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatButtonModule } from '@angular/material/button'; -import { MatButtonToggleModule } from '@angular/material/button-toggle'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatRippleModule } from '@angular/material/core'; -import { MatOptionModule } from '@angular/material/core'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MatTooltipModule } from '@angular/material/tooltip'; - -import { SharedModule } from '../shared/shared.module'; - -import { BillNumberComponent } from './bill-number/bill-number.component'; -import { BillTypeComponent } from './bill-type/bill-type.component'; -import { BillService } from './bill.service'; -import { BillsComponent } from './bills/bills.component'; -import { CanDeactivateBillGuard } from './can-deactivate-bill.guard'; -import { ChooseCustomerComponent } from './choose-customer/choose-customer.component'; -import { DiscountComponent } from './discount/discount.component'; -import { SalesHomeComponent } from './home/sales-home.component'; -import { MenuCategoriesComponent } from './menu-categories/menu-categories.component'; -import { ModifiersComponent } from './modifiers/modifiers.component'; -import { PaxComponent } from './pax/pax.component'; -import { ProductsComponent } from './products/products.component'; -import { QuantityComponent } from './quantity/quantity.component'; -import { ReasonComponent } from './reason/reason.component'; -import { ReceivePaymentComponent } from './receive-payment/receive-payment.component'; -import { RunningTablesComponent } from './running-tables/running-tables.component'; -import { SalesRoutingModule } from './sales-routing.module'; -import { SplitBillComponent } from './split-bill/split-bill.component'; -import { TablesDialogComponent } from './tables-dialog/tables-dialog.component'; - -@NgModule({ - providers: [BillService, CanDeactivateBillGuard], - declarations: [ - BillsComponent, - BillNumberComponent, - BillTypeComponent, - DiscountComponent, - MenuCategoriesComponent, - ModifiersComponent, - PaxComponent, - ChooseCustomerComponent, - ProductsComponent, - QuantityComponent, - ReceivePaymentComponent, - RunningTablesComponent, - SplitBillComponent, - SalesHomeComponent, - TablesDialogComponent, - ReasonComponent, - ], - imports: [ - CommonModule, - ReactiveFormsModule, - MatBadgeModule, - MatButtonModule, - MatButtonToggleModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDialogModule, - MatDividerModule, - MatOptionModule, - MatIconModule, - MatInputModule, - MatRippleModule, - MatTableModule, - MatTabsModule, - MatTooltipModule, - SharedModule, - SalesRoutingModule, - MatSelectModule, - MatAutocompleteModule, - ], -}) -export class SalesModule {} diff --git a/bookie/src/app/sales/sales-routing.module.ts b/bookie/src/app/sales/sales.routes.ts similarity index 52% rename from bookie/src/app/sales/sales-routing.module.ts rename to bookie/src/app/sales/sales.routes.ts index e5425a4..c5c5ef1 100644 --- a/bookie/src/app/sales/sales-routing.module.ts +++ b/bookie/src/app/sales/sales.routes.ts @@ -1,100 +1,92 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; +import { Routes } from '@angular/router'; -import { AuthGuard } from '../auth/auth-guard.service'; -import { RegimeListResolver } from '../regimes/regime-list-resolver.service'; +import { authGuard } from '../auth/auth-guard.service'; +import { regimeListResolver } from '../regimes/regime-list.resolver'; -import { BillResolver } from './bills/bill-resolver.service'; +import { billResolver } from './bills/bill.resolver'; import { BillsComponent } from './bills/bills.component'; -import { UpdateTableResolver } from './bills/update-table-resolver.service'; +import { updateTableResolver } from './bills/update-table.resolver'; import { CanDeactivateBillGuard } from './can-deactivate-bill.guard'; import { SalesHomeComponent } from './home/sales-home.component'; -import { MenuCategoriesResolver } from './menu-categories/menu-categories-resolver.service'; import { MenuCategoriesComponent } from './menu-categories/menu-categories.component'; -import { ProductsResolver } from './products/products-resolver.service'; +import { menuCategoriesResolver } from './menu-categories/menu-categories.resolver'; import { ProductsComponent } from './products/products.component'; -import { RunningTablesResolver } from './running-tables/running-tables-resolver.service'; +import { productsResolver } from './products/products.resolver'; import { RunningTablesComponent } from './running-tables/running-tables.component'; +import { runningTablesResolver } from './running-tables/running-tables.resolver'; -const routes: Routes = [ +export const routes: Routes = [ { path: 'tables', component: RunningTablesComponent, - canActivate: [AuthGuard], + canActivate: [authGuard], data: { permission: 'Sales', }, resolve: { - list: RunningTablesResolver, - regimes: RegimeListResolver, + list: runningTablesResolver, + regimes: regimeListResolver, }, }, { path: 'tables/:id', component: RunningTablesComponent, - canActivate: [AuthGuard], + canActivate: [authGuard], data: { permission: 'Sales', }, resolve: { - item: RunningTablesResolver, - regimes: RegimeListResolver, + item: runningTablesResolver, + regimes: regimeListResolver, }, }, { path: 'bill', component: BillsComponent, - canActivate: [AuthGuard], + canActivate: [authGuard], canDeactivate: [CanDeactivateBillGuard], data: { permission: 'Sales', }, resolve: { - item: BillResolver, - updateTable: UpdateTableResolver, + item: billResolver, + updateTable: updateTableResolver, }, children: [ { path: '', component: SalesHomeComponent, - canActivate: [AuthGuard], + canActivate: [authGuard], data: { permission: 'Sales', }, resolve: { - list: MenuCategoriesResolver, + list: menuCategoriesResolver, }, }, { path: 'menu-categories', component: MenuCategoriesComponent, - canActivate: [AuthGuard], + canActivate: [authGuard], data: { permission: 'Sales', }, resolve: { - list: MenuCategoriesResolver, + list: menuCategoriesResolver, }, }, { path: 'products/:id', component: ProductsComponent, - canActivate: [AuthGuard], + canActivate: [authGuard], data: { permission: 'Sales', }, resolve: { - list: ProductsResolver, + list: productsResolver, }, }, ], }, { path: '', redirectTo: 'tables', pathMatch: 'full' }, ]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], - providers: [RunningTablesResolver, MenuCategoriesResolver, ProductsResolver], -}) -export class SalesRoutingModule {} diff --git a/bookie/src/app/sales/split-bill/split-bill.component.html b/bookie/src/app/sales/split-bill/split-bill.component.html index 0d673cb..69ed809 100644 --- a/bookie/src/app/sales/split-bill/split-bill.component.html +++ b/bookie/src/app/sales/split-bill/split-bill.component.html @@ -2,13 +2,11 @@
-
- {{ sc.name }} -
+ @for (sc of list; track sc; let i = $index) { +
+ {{ sc.name }} +
+ }
diff --git a/bookie/src/app/sales/split-bill/split-bill.component.spec.ts b/bookie/src/app/sales/split-bill/split-bill.component.spec.ts index 9ce2b15..8fa9dde 100644 --- a/bookie/src/app/sales/split-bill/split-bill.component.spec.ts +++ b/bookie/src/app/sales/split-bill/split-bill.component.spec.ts @@ -8,7 +8,7 @@ describe('SplitBillComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SplitBillComponent], + imports: [SplitBillComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/split-bill/split-bill.component.ts b/bookie/src/app/sales/split-bill/split-bill.component.ts index 31ae044..1dff95e 100644 --- a/bookie/src/app/sales/split-bill/split-bill.component.ts +++ b/bookie/src/app/sales/split-bill/split-bill.component.ts @@ -1,12 +1,33 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; import { Observable } from 'rxjs'; @Component({ selector: 'app-split-bill', templateUrl: './split-bill.component.html', styleUrls: ['./split-bill.component.css'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + ReactiveFormsModule, + MatCheckbox, + MatDialogActions, + MatButton, + MatDialogClose, + ], }) export class SplitBillComponent { list: { id: string; name: string; selected: boolean }[] = []; diff --git a/bookie/src/app/sales/tables-dialog/tables-dialog.component.html b/bookie/src/app/sales/tables-dialog/tables-dialog.component.html index dcabeb1..f5cabf7 100644 --- a/bookie/src/app/sales/tables-dialog/tables-dialog.component.html +++ b/bookie/src/app/sales/tables-dialog/tables-dialog.component.html @@ -1,21 +1,26 @@

Tables

- -

{{ table.name }}

- {{ table.guest }} - {{ table.pax ?? 0 }} / {{ table.seats }} Seats - {{ table.date }} - {{ table.amount | currency: 'INR' }} -
+ @for (table of list; track table) { + +

{{ table.name }}

+ {{ table.guest }} + {{ table.pax ?? 0 }} / {{ table.seats }} Seats + @if (table.date) { + {{ table.date }} + } + @if (table.amount) { + {{ table.amount | currency: 'INR' }} + } +
+ }
diff --git a/bookie/src/app/sales/tables-dialog/tables-dialog.component.spec.ts b/bookie/src/app/sales/tables-dialog/tables-dialog.component.spec.ts index 4d74836..4427f50 100644 --- a/bookie/src/app/sales/tables-dialog/tables-dialog.component.spec.ts +++ b/bookie/src/app/sales/tables-dialog/tables-dialog.component.spec.ts @@ -8,7 +8,7 @@ describe('TablesDialogComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TablesDialogComponent], + imports: [TablesDialogComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sales/tables-dialog/tables-dialog.component.ts b/bookie/src/app/sales/tables-dialog/tables-dialog.component.ts index 2b660fa..3f3058c 100644 --- a/bookie/src/app/sales/tables-dialog/tables-dialog.component.ts +++ b/bookie/src/app/sales/tables-dialog/tables-dialog.component.ts @@ -1,5 +1,17 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; +import { CurrencyPipe } from '@angular/common'; import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatButton } from '@angular/material/button'; +import { MatCard } from '@angular/material/card'; +import { MatRipple } from '@angular/material/core'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; import { Observable } from 'rxjs'; import { Table } from '../../core/table'; @@ -8,6 +20,18 @@ import { Table } from '../../core/table'; selector: 'app-tables-dialog', templateUrl: './tables-dialog.component.html', styleUrls: ['./tables-dialog.component.sass'], + standalone: true, + imports: [ + MatDialogTitle, + CdkScrollable, + MatDialogContent, + MatCard, + MatRipple, + MatDialogActions, + MatButton, + MatDialogClose, + CurrencyPipe, + ], }) export class TablesDialogComponent { list: Table[] = []; diff --git a/bookie/src/app/section-printers/section-printer-resolver.service.ts b/bookie/src/app/section-printers/section-printer-resolver.service.ts deleted file mode 100644 index 41f84f1..0000000 --- a/bookie/src/app/section-printers/section-printer-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { SectionPrinter } from '../core/section-printer'; - -import { SectionPrinterService } from './section-printer.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SectionPrinterResolver { - constructor(private ser: SectionPrinterService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/section-printers/section-printer.component.html b/bookie/src/app/section-printers/section-printer.component.html index 32f02f0..b9c379b 100644 --- a/bookie/src/app/section-printers/section-printer.component.html +++ b/bookie/src/app/section-printers/section-printer.component.html @@ -8,9 +8,11 @@ Section - - {{ s.name }} - + @for (s of sections; track s) { + + {{ s.name }} + + }
@@ -30,9 +32,11 @@ Printer -- Default -- - - {{ p.name }} - + @for (p of printers; track p) { + + {{ p.name }} + + } @@ -42,10 +46,12 @@ Copies - - Copies - - + @if (!!$any(form.get('saleCategories')).at(i).value.printer) { + + Copies + + + } @@ -56,6 +62,8 @@
- + @if (sectionId) { + + } diff --git a/bookie/src/app/section-printers/section-printer.component.spec.ts b/bookie/src/app/section-printers/section-printer.component.spec.ts index 64cb46f..ccb1751 100644 --- a/bookie/src/app/section-printers/section-printer.component.spec.ts +++ b/bookie/src/app/section-printers/section-printer.component.spec.ts @@ -8,7 +8,7 @@ describe('SectionPrinterComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SectionPrinterComponent], + imports: [SectionPrinterComponent], }).compileComponents(); })); diff --git a/bookie/src/app/section-printers/section-printer.component.ts b/bookie/src/app/section-printers/section-printer.component.ts index 416a980..7101698 100644 --- a/bookie/src/app/section-printers/section-printer.component.ts +++ b/bookie/src/app/section-printers/section-printer.component.ts @@ -1,7 +1,25 @@ import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatSelectChange } from '@angular/material/select'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelectChange, MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -19,6 +37,32 @@ import { SectionPrinterService } from './section-printer.service'; selector: 'app-section-printer', templateUrl: './section-printer.component.html', styleUrls: ['./section-printer.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatSelect, + MatOption, + MatDivider, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatInput, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + MatButton, + ], }) export class SectionPrinterComponent implements OnInit { @ViewChild('section', { static: true }) sectionElement?: ElementRef; @@ -93,26 +137,26 @@ export class SectionPrinterComponent implements OnInit { } save() { - this.ser.save(this.sectionId, this.getItem()).subscribe( - (result: SectionPrinter[]) => { + this.ser.save(this.sectionId, this.getItem()).subscribe({ + next: (result: SectionPrinter[]) => { this.toaster.show('Success', ''); this.showItem(result); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.sectionId).subscribe( - () => { + this.ser.delete(this.sectionId).subscribe({ + next: () => { this.toaster.show('Success', ''); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/section-printers/section-printer-resolver.service.spec.ts b/bookie/src/app/section-printers/section-printer.resolver.spec.ts similarity index 100% rename from bookie/src/app/section-printers/section-printer-resolver.service.spec.ts rename to bookie/src/app/section-printers/section-printer.resolver.spec.ts diff --git a/bookie/src/app/section-printers/section-printer.resolver.ts b/bookie/src/app/section-printers/section-printer.resolver.ts new file mode 100644 index 0000000..eebc3b8 --- /dev/null +++ b/bookie/src/app/section-printers/section-printer.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SectionPrinter } from '../core/section-printer'; + +import { SectionPrinterService } from './section-printer.service'; + +export const sectionPrinterResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(SectionPrinterService).get(id); +}; diff --git a/bookie/src/app/section-printers/section-printers-routing.module.spec.ts b/bookie/src/app/section-printers/section-printers-routing.module.spec.ts deleted file mode 100644 index 62b75d2..0000000 --- a/bookie/src/app/section-printers/section-printers-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SectionPrintersRoutingModule } from './section-printers-routing.module'; - -describe('SectionPrintersRoutingModule', () => { - let sectionPrintersRoutingModule: SectionPrintersRoutingModule; - - beforeEach(() => { - sectionPrintersRoutingModule = new SectionPrintersRoutingModule(); - }); - - it('should create an instance', () => { - expect(sectionPrintersRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/section-printers/section-printers-routing.module.ts b/bookie/src/app/section-printers/section-printers-routing.module.ts deleted file mode 100644 index 97f9594..0000000 --- a/bookie/src/app/section-printers/section-printers-routing.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { PrinterListResolver } from '../printers/printer-list-resolver.service'; -import { SectionListResolver } from '../sections/section-list-resolver.service'; - -import { SectionPrinterResolver } from './section-printer-resolver.service'; -import { SectionPrinterComponent } from './section-printer.component'; - -const sectionPrinterRoutes: Routes = [ - { - path: '', - component: SectionPrinterComponent, - canActivate: [AuthGuard], - data: { - permission: 'Section Printers', - }, - resolve: { - list: SectionPrinterResolver, - sections: SectionListResolver, - printers: PrinterListResolver, - }, - }, - { - path: ':id', - component: SectionPrinterComponent, - canActivate: [AuthGuard], - data: { - permission: 'Section Printers', - }, - resolve: { - list: SectionPrinterResolver, - sections: SectionListResolver, - printers: PrinterListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(sectionPrinterRoutes)], - exports: [RouterModule], - providers: [SectionPrinterResolver], -}) -export class SectionPrintersRoutingModule {} diff --git a/bookie/src/app/section-printers/section-printers.module.spec.ts b/bookie/src/app/section-printers/section-printers.module.spec.ts deleted file mode 100644 index 11df69b..0000000 --- a/bookie/src/app/section-printers/section-printers.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SectionPrintersModule } from './section-printers.module'; - -describe('SectionPrintersModule', () => { - let sectionPrintersModule: SectionPrintersModule; - - beforeEach(() => { - sectionPrintersModule = new SectionPrintersModule(); - }); - - it('should create an instance', () => { - expect(sectionPrintersModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/section-printers/section-printers.module.ts b/bookie/src/app/section-printers/section-printers.module.ts deleted file mode 100644 index 4681de8..0000000 --- a/bookie/src/app/section-printers/section-printers.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { SectionPrinterComponent } from './section-printer.component'; -import { SectionPrintersRoutingModule } from './section-printers-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - SectionPrintersRoutingModule, - ], - declarations: [SectionPrinterComponent], -}) -export class SectionPrintersModule {} diff --git a/bookie/src/app/section-printers/section-printers.routes.ts b/bookie/src/app/section-printers/section-printers.routes.ts new file mode 100644 index 0000000..e95458a --- /dev/null +++ b/bookie/src/app/section-printers/section-printers.routes.ts @@ -0,0 +1,37 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { printerListResolver } from '../printers/printer-list.resolver'; +import { sectionListResolver } from '../sections/section-list.resolver'; + +import { SectionPrinterComponent } from './section-printer.component'; +import { sectionPrinterResolver } from './section-printer.resolver'; + +export const routes: Routes = [ + { + path: '', + component: SectionPrinterComponent, + canActivate: [authGuard], + data: { + permission: 'Section Printers', + }, + resolve: { + list: sectionPrinterResolver, + sections: sectionListResolver, + printers: printerListResolver, + }, + }, + { + path: ':id', + component: SectionPrinterComponent, + canActivate: [authGuard], + data: { + permission: 'Section Printers', + }, + resolve: { + list: sectionPrinterResolver, + sections: sectionListResolver, + printers: printerListResolver, + }, + }, +]; diff --git a/bookie/src/app/sections/section-detail/section-detail.component.html b/bookie/src/app/sections/section-detail/section-detail.component.html index 66ba825..6a2dd7c 100644 --- a/bookie/src/app/sections/section-detail/section-detail.component.html +++ b/bookie/src/app/sections/section-detail/section-detail.component.html @@ -14,6 +14,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/sections/section-detail/section-detail.component.spec.ts b/bookie/src/app/sections/section-detail/section-detail.component.spec.ts index f8bb0f7..eabbd88 100644 --- a/bookie/src/app/sections/section-detail/section-detail.component.spec.ts +++ b/bookie/src/app/sections/section-detail/section-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('SectionDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SectionDetailComponent], + imports: [SectionDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/sections/section-detail/section-detail.component.ts b/bookie/src/app/sections/section-detail/section-detail.component.ts index bbbcd0b..0f2bc40 100644 --- a/bookie/src/app/sections/section-detail/section-detail.component.ts +++ b/bookie/src/app/sections/section-detail/section-detail.component.ts @@ -1,6 +1,10 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { Section } from '../../core/section'; @@ -12,6 +16,19 @@ import { SectionService } from '../section.service'; selector: 'app-section-detail', templateUrl: './section-detail.component.html', styleUrls: ['./section-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCardActions, + MatButton, + ], }) export class SectionDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -57,27 +74,27 @@ export class SectionDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/sections'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/sections'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/sections/section-list-resolver.service.ts b/bookie/src/app/sections/section-list-resolver.service.ts deleted file mode 100644 index 8296b60..0000000 --- a/bookie/src/app/sections/section-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Section } from '../core/section'; - -import { SectionService } from './section.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SectionListResolver { - constructor(private ser: SectionService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/sections/section-list-resolver.service.spec.ts b/bookie/src/app/sections/section-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/sections/section-list-resolver.service.spec.ts rename to bookie/src/app/sections/section-list.resolver.spec.ts diff --git a/bookie/src/app/sections/section-list.resolver.ts b/bookie/src/app/sections/section-list.resolver.ts new file mode 100644 index 0000000..445b619 --- /dev/null +++ b/bookie/src/app/sections/section-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Section } from '../core/section'; + +import { SectionService } from './section.service'; + +export const sectionListResolver: ResolveFn = () => { + return inject(SectionService).list(); +}; diff --git a/bookie/src/app/sections/section-list/section-list.component.spec.ts b/bookie/src/app/sections/section-list/section-list.component.spec.ts index 644ee90..f133288 100644 --- a/bookie/src/app/sections/section-list/section-list.component.spec.ts +++ b/bookie/src/app/sections/section-list/section-list.component.spec.ts @@ -8,7 +8,7 @@ describe('SectionListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [SectionListComponent], + imports: [SectionListComponent], }).compileComponents(); fixture = TestBed.createComponent(SectionListComponent); diff --git a/bookie/src/app/sections/section-list/section-list.component.ts b/bookie/src/app/sections/section-list/section-list.component.ts index 01b22ed..f6378aa 100644 --- a/bookie/src/app/sections/section-list/section-list.component.ts +++ b/bookie/src/app/sections/section-list/section-list.component.ts @@ -1,5 +1,20 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Section } from '../../core/section'; @@ -9,6 +24,27 @@ import { SectionListDataSource } from './section-list-datasource'; selector: 'app-section-list', templateUrl: './section-list.component.html', styleUrls: ['./section-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class SectionListComponent implements OnInit { list: Section[] = []; diff --git a/bookie/src/app/sections/section-resolver.service.ts b/bookie/src/app/sections/section-resolver.service.ts deleted file mode 100644 index 68be5bd..0000000 --- a/bookie/src/app/sections/section-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Section } from '../core/section'; - -import { SectionService } from './section.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SectionResolver { - constructor(private ser: SectionService) {} - - resolve(route: ActivatedRouteSnapshot): Observable
{ - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/sections/section-resolver.service.spec.ts b/bookie/src/app/sections/section.resolver.spec.ts similarity index 100% rename from bookie/src/app/sections/section-resolver.service.spec.ts rename to bookie/src/app/sections/section.resolver.spec.ts diff --git a/bookie/src/app/sections/section.resolver.ts b/bookie/src/app/sections/section.resolver.ts new file mode 100644 index 0000000..3471979 --- /dev/null +++ b/bookie/src/app/sections/section.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Section } from '../core/section'; + +import { SectionService } from './section.service'; + +export const sectionResolver: ResolveFn
= (route) => { + const id = route.paramMap.get('id'); + return inject(SectionService).get(id); +}; diff --git a/bookie/src/app/sections/sections-routing.module.spec.ts b/bookie/src/app/sections/sections-routing.module.spec.ts deleted file mode 100644 index 05a450e..0000000 --- a/bookie/src/app/sections/sections-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SectionsRoutingModule } from './sections-routing.module'; - -describe('SectionsRoutingModule', () => { - let sectionsRoutingModule: SectionsRoutingModule; - - beforeEach(() => { - sectionsRoutingModule = new SectionsRoutingModule(); - }); - - it('should create an instance', () => { - expect(sectionsRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sections/sections-routing.module.ts b/bookie/src/app/sections/sections-routing.module.ts deleted file mode 100644 index 7040c16..0000000 --- a/bookie/src/app/sections/sections-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { SectionDetailComponent } from './section-detail/section-detail.component'; -import { SectionListComponent } from './section-list/section-list.component'; -import { SectionListResolver } from './section-list-resolver.service'; -import { SectionResolver } from './section-resolver.service'; - -const sectionsRoutes: Routes = [ - { - path: '', - component: SectionListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sections', - }, - resolve: { - list: SectionListResolver, - }, - }, - { - path: 'new', - component: SectionDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sections', - }, - resolve: { - item: SectionResolver, - }, - }, - { - path: ':id', - component: SectionDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sections', - }, - resolve: { - item: SectionResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(sectionsRoutes)], - exports: [RouterModule], - providers: [SectionListResolver, SectionResolver], -}) -export class SectionsRoutingModule {} diff --git a/bookie/src/app/sections/sections.module.spec.ts b/bookie/src/app/sections/sections.module.spec.ts deleted file mode 100644 index 831006a..0000000 --- a/bookie/src/app/sections/sections.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SectionsModule } from './sections.module'; - -describe('SectionsModule', () => { - let sectionsModule: SectionsModule; - - beforeEach(() => { - sectionsModule = new SectionsModule(); - }); - - it('should create an instance', () => { - expect(sectionsModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/sections/sections.module.ts b/bookie/src/app/sections/sections.module.ts deleted file mode 100644 index 5778c2f..0000000 --- a/bookie/src/app/sections/sections.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { SectionDetailComponent } from './section-detail/section-detail.component'; -import { SectionListComponent } from './section-list/section-list.component'; -import { SectionsRoutingModule } from './sections-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - ReactiveFormsModule, - SectionsRoutingModule, - ], - declarations: [SectionListComponent, SectionDetailComponent], -}) -export class SectionsModule {} diff --git a/bookie/src/app/sections/sections.routes.ts b/bookie/src/app/sections/sections.routes.ts new file mode 100644 index 0000000..abe0bca --- /dev/null +++ b/bookie/src/app/sections/sections.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { SectionDetailComponent } from './section-detail/section-detail.component'; +import { SectionListComponent } from './section-list/section-list.component'; +import { sectionListResolver } from './section-list.resolver'; +import { sectionResolver } from './section.resolver'; + +export const routes: Routes = [ + { + path: '', + component: SectionListComponent, + canActivate: [authGuard], + data: { + permission: 'Sections', + }, + resolve: { + list: sectionListResolver, + }, + }, + { + path: 'new', + component: SectionDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Sections', + }, + resolve: { + item: sectionResolver, + }, + }, + { + path: ':id', + component: SectionDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Sections', + }, + resolve: { + item: sectionResolver, + }, + }, +]; diff --git a/bookie/src/app/settings/prefill-customer-discount-resolver.service.ts b/bookie/src/app/settings/prefill-customer-discount-resolver.service.ts deleted file mode 100644 index 0c852ce..0000000 --- a/bookie/src/app/settings/prefill-customer-discount-resolver.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { SettingsService } from './settings.service'; - -@Injectable({ - providedIn: 'root', -}) -export class PrefillCustomerDiscountResolver { - constructor(private ser: SettingsService) {} - - resolve(): Observable { - return this.ser.getPrefillCustomerDiscount(); - } -} diff --git a/bookie/src/app/settings/prefill-customer-discount.resolver.ts b/bookie/src/app/settings/prefill-customer-discount.resolver.ts new file mode 100644 index 0000000..04ed80c --- /dev/null +++ b/bookie/src/app/settings/prefill-customer-discount.resolver.ts @@ -0,0 +1,8 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SettingsService } from './settings.service'; + +export const prefillCustomerDiscountResolver: ResolveFn = () => { + return inject(SettingsService).getPrefillCustomerDiscount(); +}; diff --git a/bookie/src/app/settings/settings-routing.module.ts b/bookie/src/app/settings/settings-routing.module.ts deleted file mode 100644 index 7d5f1f8..0000000 --- a/bookie/src/app/settings/settings-routing.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { PrefillCustomerDiscountResolver } from './prefill-customer-discount-resolver.service'; -import { SettingsComponent } from './settings.component'; - -const settingsRoutes: Routes = [ - { - path: '', - component: SettingsComponent, - canActivate: [AuthGuard], - data: { - permission: 'Settings', - }, - resolve: { - prefillCustomerDiscount: PrefillCustomerDiscountResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(settingsRoutes)], - exports: [RouterModule], -}) -export class SettingsRoutingModule {} diff --git a/bookie/src/app/settings/settings.component.ts b/bookie/src/app/settings/settings.component.ts index 5fd6fa5..0d3db9e 100644 --- a/bookie/src/app/settings/settings.component.ts +++ b/bookie/src/app/settings/settings.component.ts @@ -1,10 +1,17 @@ import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSlideToggle } from '@angular/material/slide-toggle'; +import { MatTabGroup, MatTab } from '@angular/material/tabs'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; -import { environment } from '../../environments/environment'; +import { environment } from '../app.environment'; import { AuthService } from '../auth/auth.service'; import { ToasterService } from '../core/toaster.service'; @@ -14,6 +21,23 @@ import { SettingsService } from './settings.service'; selector: 'app-settings', templateUrl: './settings.component.html', styleUrls: ['./settings.component.css'], + standalone: true, + imports: [ + MatTabGroup, + MatTab, + MatCard, + MatCardContent, + MatSlideToggle, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + ], }) export class SettingsComponent implements OnInit { prefillCustomerDiscount = true; @@ -74,13 +98,13 @@ export class SettingsComponent implements OnInit { this.toaster.show('Danger', 'Please choose both files first!'); return; } - this.ser.runMaintenance(startDate, finishDate, this.beerFile, this.saleFile).subscribe( - () => { + this.ser.runMaintenance(startDate, finishDate, this.beerFile, this.saleFile).subscribe({ + next: () => { this.toaster.show('Success', 'Maintenance done'); }, - (error) => { + error: (error) => { this.toaster.show('Danger', error); }, - ); + }); } } diff --git a/bookie/src/app/settings/settings.module.ts b/bookie/src/app/settings/settings.module.ts deleted file mode 100644 index 5bbfe89..0000000 --- a/bookie/src/app/settings/settings.module.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { SettingsRoutingModule } from './settings-routing.module'; -import { SettingsComponent } from './settings.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDatepickerModule, - MatDialogModule, - MatSlideToggleModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressSpinnerModule, - MatSelectModule, - MatSortModule, - MatTableModule, - MatTabsModule, - ReactiveFormsModule, - SharedModule, - SettingsRoutingModule, - ], - declarations: [SettingsComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class SettingsModule {} diff --git a/bookie/src/app/settings/settings.routes.ts b/bookie/src/app/settings/settings.routes.ts new file mode 100644 index 0000000..d16b727 --- /dev/null +++ b/bookie/src/app/settings/settings.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { prefillCustomerDiscountResolver } from './prefill-customer-discount.resolver'; +import { SettingsComponent } from './settings.component'; + +export const routes: Routes = [ + { + path: '', + component: SettingsComponent, + canActivate: [authGuard], + data: { + permission: 'Settings', + }, + resolve: { + prefillCustomerDiscount: prefillCustomerDiscountResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.html b/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.html index 43b94a5..9c9bdff 100644 --- a/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.html +++ b/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.html @@ -14,17 +14,21 @@ Voucher Type - - {{ vt.name }} - + @for (vt of voucherTypes; track vt) { + + {{ vt.name }} + + } Reporting Level - - {{ rl.name }} - + @for (rl of reportingLevel; track rl) { + + {{ rl.name }} + + } Has Reason? @@ -33,6 +37,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.spec.ts b/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.spec.ts index e18de8a..932a056 100644 --- a/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.spec.ts +++ b/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('SettleOptionDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SettleOptionDetailComponent], + imports: [SettleOptionDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.ts b/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.ts index 186dbb9..62a0220 100644 --- a/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.ts +++ b/bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.ts @@ -1,6 +1,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { ReportingLevel } from '../../core/reporting-level'; @@ -14,6 +21,22 @@ import { SettleOptionService } from '../settle-option.service'; selector: 'app-settle-option-detail', templateUrl: './settle-option-detail.component.html', styleUrls: ['./settle-option-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSelect, + MatOption, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class SettleOptionDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -76,27 +99,27 @@ export class SettleOptionDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/settle-options'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id).subscribe( - () => { + this.ser.delete(this.item.id).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/settle-options'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/settle-option/settle-option-list-resolver.service.ts b/bookie/src/app/settle-option/settle-option-list-resolver.service.ts deleted file mode 100644 index b1a495e..0000000 --- a/bookie/src/app/settle-option/settle-option-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { SettleOption } from '../core/settle-option'; - -import { SettleOptionService } from './settle-option.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SettleOptionListResolver { - constructor(private ser: SettleOptionService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/settle-option/settle-option-list-resolver.service.spec.ts b/bookie/src/app/settle-option/settle-option-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/settle-option/settle-option-list-resolver.service.spec.ts rename to bookie/src/app/settle-option/settle-option-list.resolver.spec.ts diff --git a/bookie/src/app/settle-option/settle-option-list.resolver.ts b/bookie/src/app/settle-option/settle-option-list.resolver.ts new file mode 100644 index 0000000..0daf5e3 --- /dev/null +++ b/bookie/src/app/settle-option/settle-option-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SettleOption } from '../core/settle-option'; + +import { SettleOptionService } from './settle-option.service'; + +export const settleOptionListResolver: ResolveFn = () => { + return inject(SettleOptionService).list(); +}; diff --git a/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.spec.ts b/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.spec.ts index 3b909ff..3f2915d 100644 --- a/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.spec.ts +++ b/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.spec.ts @@ -8,7 +8,7 @@ describe('SettleOptionListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [SettleOptionListComponent], + imports: [SettleOptionListComponent], }).compileComponents(); fixture = TestBed.createComponent(SettleOptionListComponent); diff --git a/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.ts b/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.ts index 6c3b698..7848624 100644 --- a/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.ts +++ b/bookie/src/app/settle-option/settle-option-list/settle-option-list.component.ts @@ -1,6 +1,20 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatTable } from '@angular/material/table'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -16,6 +30,27 @@ import { SettleOptionListDatasource } from './settle-option-list-datasource'; selector: 'app-settle-option-list', templateUrl: './settle-option-list.component.html', styleUrls: ['./settle-option-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + ], }) export class SettleOptionListComponent implements OnInit { @ViewChild('table', { static: true }) table?: MatTable; diff --git a/bookie/src/app/settle-option/settle-option-resolver.service.ts b/bookie/src/app/settle-option/settle-option-resolver.service.ts deleted file mode 100644 index f941ab3..0000000 --- a/bookie/src/app/settle-option/settle-option-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { SettleOption } from '../core/settle-option'; - -import { SettleOptionService } from './settle-option.service'; - -@Injectable({ - providedIn: 'root', -}) -export class SettleOptionResolver { - constructor(private ser: SettleOptionService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/settle-option/settle-option-resolver.service.spec.ts b/bookie/src/app/settle-option/settle-option.resolver.spec.ts similarity index 100% rename from bookie/src/app/settle-option/settle-option-resolver.service.spec.ts rename to bookie/src/app/settle-option/settle-option.resolver.spec.ts diff --git a/bookie/src/app/settle-option/settle-option.resolver.ts b/bookie/src/app/settle-option/settle-option.resolver.ts new file mode 100644 index 0000000..e55da5a --- /dev/null +++ b/bookie/src/app/settle-option/settle-option.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { SettleOption } from '../core/settle-option'; + +import { SettleOptionService } from './settle-option.service'; + +export const settleOptionResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(SettleOptionService).get(id); +}; diff --git a/bookie/src/app/settle-option/settle-options-routing.module.spec.ts b/bookie/src/app/settle-option/settle-options-routing.module.spec.ts deleted file mode 100644 index 2f8f56a..0000000 --- a/bookie/src/app/settle-option/settle-options-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SettleOptionsRoutingModule } from './settle-options-routing.module'; - -describe('SettleOptionsRoutingModule', () => { - let settleOptionsRoutingModule: SettleOptionsRoutingModule; - - beforeEach(() => { - settleOptionsRoutingModule = new SettleOptionsRoutingModule(); - }); - - it('should create an instance', () => { - expect(settleOptionsRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/settle-option/settle-options-routing.module.ts b/bookie/src/app/settle-option/settle-options-routing.module.ts deleted file mode 100644 index e834630..0000000 --- a/bookie/src/app/settle-option/settle-options-routing.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { SettleOptionDetailComponent } from './settle-option-detail/settle-option-detail.component'; -import { SettleOptionListComponent } from './settle-option-list/settle-option-list.component'; -import { SettleOptionListResolver } from './settle-option-list-resolver.service'; -import { SettleOptionResolver } from './settle-option-resolver.service'; - -const settleOptionsRoutes: Routes = [ - { - path: '', - component: SettleOptionListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Owner', - }, - resolve: { - list: SettleOptionListResolver, - }, - }, - { - path: 'new', - component: SettleOptionDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Owner', - }, - resolve: { - item: SettleOptionResolver, - }, - }, - { - path: ':id', - component: SettleOptionDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Owner', - }, - resolve: { - item: SettleOptionResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(settleOptionsRoutes)], - exports: [RouterModule], - providers: [SettleOptionListResolver, SettleOptionResolver], -}) -export class SettleOptionsRoutingModule {} diff --git a/bookie/src/app/settle-option/settle-options.module.spec.ts b/bookie/src/app/settle-option/settle-options.module.spec.ts deleted file mode 100644 index 42d0241..0000000 --- a/bookie/src/app/settle-option/settle-options.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { SettleOptionsModule } from './settle-options.module'; - -describe('SettleOptionsModule', () => { - let settleOptionsModule: SettleOptionsModule; - - beforeEach(() => { - settleOptionsModule = new SettleOptionsModule(); - }); - - it('should create an instance', () => { - expect(settleOptionsModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/settle-option/settle-options.module.ts b/bookie/src/app/settle-option/settle-options.module.ts deleted file mode 100644 index cd213be..0000000 --- a/bookie/src/app/settle-option/settle-options.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { SettleOptionDetailComponent } from './settle-option-detail/settle-option-detail.component'; -import { SettleOptionListComponent } from './settle-option-list/settle-option-list.component'; -import { SettleOptionsRoutingModule } from './settle-options-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatOptionModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - SettleOptionsRoutingModule, - ], - declarations: [SettleOptionListComponent, SettleOptionDetailComponent], -}) -export class SettleOptionsModule {} diff --git a/bookie/src/app/settle-option/settle-options.routes.ts b/bookie/src/app/settle-option/settle-options.routes.ts new file mode 100644 index 0000000..74ae0e7 --- /dev/null +++ b/bookie/src/app/settle-option/settle-options.routes.ts @@ -0,0 +1,44 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { SettleOptionDetailComponent } from './settle-option-detail/settle-option-detail.component'; +import { SettleOptionListComponent } from './settle-option-list/settle-option-list.component'; +import { settleOptionListResolver } from './settle-option-list.resolver'; +import { settleOptionResolver } from './settle-option.resolver'; + +export const routes: Routes = [ + { + path: '', + component: SettleOptionListComponent, + canActivate: [authGuard], + data: { + permission: 'Owner', + }, + resolve: { + list: settleOptionListResolver, + }, + }, + { + path: 'new', + component: SettleOptionDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Owner', + }, + resolve: { + item: settleOptionResolver, + }, + }, + { + path: ':id', + component: SettleOptionDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Owner', + }, + resolve: { + item: settleOptionResolver, + }, + }, +]; diff --git a/bookie/src/app/shared/accounting.pipe.ts b/bookie/src/app/shared/accounting.pipe.ts deleted file mode 100644 index 03b7385..0000000 --- a/bookie/src/app/shared/accounting.pipe.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'accounting', -}) -export class AccountingPipe implements PipeTransform { - transform(value: string): string { - if (value === null) { - return ''; - } - const amount = +value.replace(new RegExp('(₹[s]*)|(,)', 'g'), ''); - return value.replace('-', '') + (amount < 0 ? '\u00A0Cr' : '\u00A0Dr'); - } -} diff --git a/bookie/src/app/shared/clear.pipe.ts b/bookie/src/app/shared/clear.pipe.ts deleted file mode 100644 index ce5855a..0000000 --- a/bookie/src/app/shared/clear.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'clear', -}) -export class ClearPipe implements PipeTransform { - transform(value: string | null): string { - if (value === null) { - return ''; - } - return value === '₹ 0.00' || value === '0.00' ? '' : value; - } -} diff --git a/bookie/src/app/shared/confirm-dialog/confirm-dialog.component.ts b/bookie/src/app/shared/confirm-dialog/confirm-dialog.component.ts index a22e1b9..4b42227 100644 --- a/bookie/src/app/shared/confirm-dialog/confirm-dialog.component.ts +++ b/bookie/src/app/shared/confirm-dialog/confirm-dialog.component.ts @@ -1,10 +1,21 @@ +import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatButton } from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogRef, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatDialogClose, +} from '@angular/material/dialog'; @Component({ selector: 'app-confirm-dialog', templateUrl: './confirm-dialog.component.html', styleUrls: ['./confirm-dialog.component.css'], + standalone: true, + imports: [MatDialogTitle, CdkScrollable, MatDialogContent, MatDialogActions, MatButton, MatDialogClose], }) export class ConfirmDialogComponent { constructor( diff --git a/bookie/src/app/shared/image-dialog/image-dialog.component.css b/bookie/src/app/shared/image-dialog/image-dialog.component.css deleted file mode 100644 index e2718ba..0000000 --- a/bookie/src/app/shared/image-dialog/image-dialog.component.css +++ /dev/null @@ -1,3 +0,0 @@ -img { - max-width: 100%; -} diff --git a/bookie/src/app/shared/image-dialog/image-dialog.component.html b/bookie/src/app/shared/image-dialog/image-dialog.component.html deleted file mode 100644 index 283a3d9..0000000 --- a/bookie/src/app/shared/image-dialog/image-dialog.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/bookie/src/app/shared/image-dialog/image-dialog.component.ts b/bookie/src/app/shared/image-dialog/image-dialog.component.ts deleted file mode 100644 index 3878fc2..0000000 --- a/bookie/src/app/shared/image-dialog/image-dialog.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; - -@Component({ - selector: 'app-image-dialog', - templateUrl: './image-dialog.component.html', - styleUrls: ['./image-dialog.component.css'], -}) -export class ImageDialogComponent { - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: string, - ) {} - - close(): void { - this.dialogRef.close(); - } -} diff --git a/bookie/src/app/shared/local-time.pipe.ts b/bookie/src/app/shared/local-time.pipe.ts index bc364a1..567e559 100644 --- a/bookie/src/app/shared/local-time.pipe.ts +++ b/bookie/src/app/shared/local-time.pipe.ts @@ -1,8 +1,9 @@ import { Pipe, PipeTransform } from '@angular/core'; -import * as moment from 'moment'; +import moment from 'moment'; @Pipe({ name: 'localTime', + standalone: true, }) export class LocalTimePipe implements PipeTransform { transform(value: string): string { diff --git a/bookie/src/app/shared/shared.module.ts b/bookie/src/app/shared/shared.module.ts deleted file mode 100644 index 645ef3d..0000000 --- a/bookie/src/app/shared/shared.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; - -import { AccountingPipe } from './accounting.pipe'; -import { ClearPipe } from './clear.pipe'; -import { ConfirmDialogComponent } from './confirm-dialog/confirm-dialog.component'; -import { ImageDialogComponent } from './image-dialog/image-dialog.component'; -import { LocalTimePipe } from './local-time.pipe'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, MatDialogModule], - declarations: [ConfirmDialogComponent, ImageDialogComponent, AccountingPipe, ClearPipe, LocalTimePipe], - exports: [AccountingPipe, ClearPipe, LocalTimePipe], -}) -export class SharedModule {} diff --git a/bookie/src/app/tables/table-detail/table-detail.component.html b/bookie/src/app/tables/table-detail/table-detail.component.html index afd7d5e..df9710a 100644 --- a/bookie/src/app/tables/table-detail/table-detail.component.html +++ b/bookie/src/app/tables/table-detail/table-detail.component.html @@ -20,9 +20,11 @@ Section - - {{ s.name }} - + @for (s of sections; track s) { + + {{ s.name }} + + } @@ -33,6 +35,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/tables/table-detail/table-detail.component.spec.ts b/bookie/src/app/tables/table-detail/table-detail.component.spec.ts index 148a4c3..ac974c6 100644 --- a/bookie/src/app/tables/table-detail/table-detail.component.spec.ts +++ b/bookie/src/app/tables/table-detail/table-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('TableDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TableDetailComponent], + imports: [TableDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/tables/table-detail/table-detail.component.ts b/bookie/src/app/tables/table-detail/table-detail.component.ts index cb9ff91..f098842 100644 --- a/bookie/src/app/tables/table-detail/table-detail.component.ts +++ b/bookie/src/app/tables/table-detail/table-detail.component.ts @@ -1,6 +1,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { Section } from '../../core/section'; @@ -13,6 +20,22 @@ import { TableService } from '../table.service'; selector: 'app-table-detail', templateUrl: './table-detail.component.html', styleUrls: ['./table-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSelect, + MatOption, + MatCheckbox, + MatCardActions, + MatButton, + ], }) export class TableDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -69,27 +92,27 @@ export class TableDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/tables'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/tables'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/tables/table-list-resolver.service.ts b/bookie/src/app/tables/table-list-resolver.service.ts deleted file mode 100644 index dbed451..0000000 --- a/bookie/src/app/tables/table-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Table } from '../core/table'; - -import { TableService } from './table.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TableListResolver { - constructor(private ser: TableService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/tables/table-list-resolver.service.spec.ts b/bookie/src/app/tables/table-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/tables/table-list-resolver.service.spec.ts rename to bookie/src/app/tables/table-list.resolver.spec.ts diff --git a/bookie/src/app/tables/table-list.resolver.ts b/bookie/src/app/tables/table-list.resolver.ts new file mode 100644 index 0000000..d358e86 --- /dev/null +++ b/bookie/src/app/tables/table-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Table } from '../core/table'; + +import { TableService } from './table.service'; + +export const tableListResolver: ResolveFn = () => { + return inject(TableService).list(); +}; diff --git a/bookie/src/app/tables/table-list/table-list.component.spec.ts b/bookie/src/app/tables/table-list/table-list.component.spec.ts index 629ec9c..a0bd59b 100644 --- a/bookie/src/app/tables/table-list/table-list.component.spec.ts +++ b/bookie/src/app/tables/table-list/table-list.component.spec.ts @@ -8,7 +8,7 @@ describe('TableListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [TableListComponent], + imports: [TableListComponent], }).compileComponents(); fixture = TestBed.createComponent(TableListComponent); diff --git a/bookie/src/app/tables/table-list/table-list.component.ts b/bookie/src/app/tables/table-list/table-list.component.ts index c043f83..34ae38d 100644 --- a/bookie/src/app/tables/table-list/table-list.component.ts +++ b/bookie/src/app/tables/table-list/table-list.component.ts @@ -1,7 +1,21 @@ -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { CdkDragDrop, moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatTable } from '@angular/material/table'; -import { ActivatedRoute, Router } from '@angular/router'; +import { MatButton, MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { MenuCategory } from '../../core/menu-category'; @@ -15,6 +29,30 @@ import { TableListDataSource } from './table-list-datasource'; selector: 'app-table-list', templateUrl: './table-list.component.html', styleUrls: ['./table-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatButton, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + CdkDropList, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + CdkDrag, + ], }) export class TableListComponent implements OnInit { @ViewChild('table', { static: true }) table?: MatTable; @@ -44,14 +82,14 @@ export class TableListComponent implements OnInit { } updateSortOrder() { - this.ser.updateSortOrder(this.list).subscribe( - () => { + this.ser.updateSortOrder(this.list).subscribe({ + next: () => { this.toaster.show('Success', ''); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } dropTable(event: CdkDragDrop) { diff --git a/bookie/src/app/tables/table-resolver.service.ts b/bookie/src/app/tables/table-resolver.service.ts deleted file mode 100644 index c1d7950..0000000 --- a/bookie/src/app/tables/table-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Table } from '../core/table'; - -import { TableService } from './table.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TableResolver { - constructor(private ser: TableService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/tables/table-resolver.service.spec.ts b/bookie/src/app/tables/table.resolver.spec.ts similarity index 100% rename from bookie/src/app/tables/table-resolver.service.spec.ts rename to bookie/src/app/tables/table.resolver.spec.ts diff --git a/bookie/src/app/tables/table.resolver.ts b/bookie/src/app/tables/table.resolver.ts new file mode 100644 index 0000000..6a48a10 --- /dev/null +++ b/bookie/src/app/tables/table.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Table } from '../core/table'; + +import { TableService } from './table.service'; + +export const tableResolver: ResolveFn
= (route) => { + const id = route.paramMap.get('id'); + return inject(TableService).get(id); +}; diff --git a/bookie/src/app/tables/tables-routing.module.spec.ts b/bookie/src/app/tables/tables-routing.module.spec.ts deleted file mode 100644 index fee1691..0000000 --- a/bookie/src/app/tables/tables-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TableRoutingModule } from './tables-routing.module'; - -describe('TableRoutingModule', () => { - let tablesRoutingModule: TableRoutingModule; - - beforeEach(() => { - tablesRoutingModule = new TableRoutingModule(); - }); - - it('should create an instance', () => { - expect(tablesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/tables/tables-routing.module.ts b/bookie/src/app/tables/tables-routing.module.ts deleted file mode 100644 index bc71354..0000000 --- a/bookie/src/app/tables/tables-routing.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { SectionListResolver } from '../sections/section-list-resolver.service'; - -import { TableDetailComponent } from './table-detail/table-detail.component'; -import { TableListComponent } from './table-list/table-list.component'; -import { TableListResolver } from './table-list-resolver.service'; -import { TableResolver } from './table-resolver.service'; - -const tablesRoutes: Routes = [ - { - path: '', - component: TableListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sections', - }, - resolve: { - list: TableListResolver, - }, - }, - { - path: 'new', - component: TableDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sections', - }, - resolve: { - item: TableResolver, - sections: SectionListResolver, - }, - }, - { - path: ':id', - component: TableDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Sections', - }, - resolve: { - item: TableResolver, - sections: SectionListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(tablesRoutes)], - exports: [RouterModule], - providers: [TableListResolver, TableResolver], -}) -export class TableRoutingModule {} diff --git a/bookie/src/app/tables/tables.module.spec.ts b/bookie/src/app/tables/tables.module.spec.ts deleted file mode 100644 index cba1d1e..0000000 --- a/bookie/src/app/tables/tables.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TableModule } from './tables.module'; - -describe('TableModule', () => { - let tablesModule: TableModule; - - beforeEach(() => { - tablesModule = new TableModule(); - }); - - it('should create an instance', () => { - expect(tablesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/tables/tables.module.ts b/bookie/src/app/tables/tables.module.ts deleted file mode 100644 index 0aca271..0000000 --- a/bookie/src/app/tables/tables.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatOptionModule } from '@angular/material/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { TableDetailComponent } from './table-detail/table-detail.component'; -import { TableListComponent } from './table-list/table-list.component'; -import { TableRoutingModule } from './tables-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - DragDropModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatOptionModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - TableRoutingModule, - ], - declarations: [TableListComponent, TableDetailComponent], -}) -export class TableModule {} diff --git a/bookie/src/app/tables/tables.routes.ts b/bookie/src/app/tables/tables.routes.ts new file mode 100644 index 0000000..59f944f --- /dev/null +++ b/bookie/src/app/tables/tables.routes.ts @@ -0,0 +1,47 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { sectionListResolver } from '../sections/section-list.resolver'; + +import { TableDetailComponent } from './table-detail/table-detail.component'; +import { TableListComponent } from './table-list/table-list.component'; +import { tableListResolver } from './table-list.resolver'; +import { tableResolver } from './table.resolver'; + +export const routes: Routes = [ + { + path: '', + component: TableListComponent, + canActivate: [authGuard], + data: { + permission: 'Sections', + }, + resolve: { + list: tableListResolver, + }, + }, + { + path: 'new', + component: TableDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Sections', + }, + resolve: { + item: tableResolver, + sections: sectionListResolver, + }, + }, + { + path: ':id', + component: TableDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Sections', + }, + resolve: { + item: tableResolver, + sections: sectionListResolver, + }, + }, +]; diff --git a/bookie/src/app/tax-report/tax-report-resolver.service.ts b/bookie/src/app/tax-report/tax-report-resolver.service.ts deleted file mode 100644 index 7bc297b..0000000 --- a/bookie/src/app/tax-report/tax-report-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { TaxReport } from './tax-report'; -import { TaxReportService } from './tax-report.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TaxReportResolver { - constructor(private ser: TaxReportService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const startDate = route.queryParamMap.get('startDate') ?? null; - const finishDate = route.queryParamMap.get('finishDate') ?? null; - return this.ser.get(startDate, finishDate); - } -} diff --git a/bookie/src/app/tax-report/tax-report-routing.module.spec.ts b/bookie/src/app/tax-report/tax-report-routing.module.spec.ts deleted file mode 100644 index cb7c574..0000000 --- a/bookie/src/app/tax-report/tax-report-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TaxReportRoutingModule } from './tax-report-routing.module'; - -describe('TaxReportRoutingModule', () => { - let taxReportRoutingModule: TaxReportRoutingModule; - - beforeEach(() => { - taxReportRoutingModule = new TaxReportRoutingModule(); - }); - - it('should create an instance', () => { - expect(taxReportRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/tax-report/tax-report-routing.module.ts b/bookie/src/app/tax-report/tax-report-routing.module.ts deleted file mode 100644 index ef17f31..0000000 --- a/bookie/src/app/tax-report/tax-report-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { TaxReportResolver } from './tax-report-resolver.service'; -import { TaxReportComponent } from './tax-report.component'; - -const taxReportRoutes: Routes = [ - { - path: '', - component: TaxReportComponent, - canActivate: [AuthGuard], - data: { - permission: 'Tax Report', - }, - resolve: { - info: TaxReportResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(taxReportRoutes)], - exports: [RouterModule], - providers: [TaxReportResolver], -}) -export class TaxReportRoutingModule {} diff --git a/bookie/src/app/tax-report/tax-report.component.spec.ts b/bookie/src/app/tax-report/tax-report.component.spec.ts index af87973..bb00544 100644 --- a/bookie/src/app/tax-report/tax-report.component.spec.ts +++ b/bookie/src/app/tax-report/tax-report.component.spec.ts @@ -8,7 +8,7 @@ describe('TaxReportComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TaxReportComponent], + imports: [TaxReportComponent], }).compileComponents(); })); diff --git a/bookie/src/app/tax-report/tax-report.component.ts b/bookie/src/app/tax-report/tax-report.component.ts index ee3df6c..5e59eef 100644 --- a/bookie/src/app/tax-report/tax-report.component.ts +++ b/bookie/src/app/tax-report/tax-report.component.ts @@ -1,7 +1,26 @@ +import { PercentPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { ToCsvService } from '../shared/to-csv.service'; @@ -12,6 +31,37 @@ import { TaxReportDatasource } from './tax-report-datasource'; selector: 'app-tax-report', templateUrl: './tax-report.component.html', styleUrls: ['./tax-report.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + PercentPipe, + CurrencyPipe, + ], }) export class TaxReportComponent implements OnInit { info: TaxReport = new TaxReport(); diff --git a/bookie/src/app/tax-report/tax-report.module.spec.ts b/bookie/src/app/tax-report/tax-report.module.spec.ts deleted file mode 100644 index 75d402c..0000000 --- a/bookie/src/app/tax-report/tax-report.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TaxReportModule } from './tax-report.module'; - -describe('TaxReportModule', () => { - let taxReportModule: TaxReportModule; - - beforeEach(() => { - taxReportModule = new TaxReportModule(); - }); - - it('should create an instance', () => { - expect(taxReportModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/tax-report/tax-report.module.ts b/bookie/src/app/tax-report/tax-report.module.ts deleted file mode 100644 index 850f132..0000000 --- a/bookie/src/app/tax-report/tax-report.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { TaxReportRoutingModule } from './tax-report-routing.module'; -import { TaxReportComponent } from './tax-report.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - TaxReportRoutingModule, - ], - declarations: [TaxReportComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class TaxReportModule {} diff --git a/bookie/src/app/tax-report/tax-report-resolver.service.spec.ts b/bookie/src/app/tax-report/tax-report.resolver.spec.ts similarity index 100% rename from bookie/src/app/tax-report/tax-report-resolver.service.spec.ts rename to bookie/src/app/tax-report/tax-report.resolver.spec.ts diff --git a/bookie/src/app/tax-report/tax-report.resolver.ts b/bookie/src/app/tax-report/tax-report.resolver.ts new file mode 100644 index 0000000..0ba357b --- /dev/null +++ b/bookie/src/app/tax-report/tax-report.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { TaxReport } from './tax-report'; +import { TaxReportService } from './tax-report.service'; + +export const taxReportResolver: ResolveFn = (route) => { + const startDate = route.queryParamMap.get('startDate') ?? null; + const finishDate = route.queryParamMap.get('finishDate') ?? null; + return inject(TaxReportService).get(startDate, finishDate); +}; diff --git a/bookie/src/app/tax-report/tax-report.routes.ts b/bookie/src/app/tax-report/tax-report.routes.ts new file mode 100644 index 0000000..c8ee92f --- /dev/null +++ b/bookie/src/app/tax-report/tax-report.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { TaxReportComponent } from './tax-report.component'; +import { taxReportResolver } from './tax-report.resolver'; + +export const routes: Routes = [ + { + path: '', + component: TaxReportComponent, + canActivate: [authGuard], + data: { + permission: 'Tax Report', + }, + resolve: { + info: taxReportResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/taxes/tax-detail/tax-detail.component.html b/bookie/src/app/taxes/tax-detail/tax-detail.component.html index e11e8d2..17fc901 100644 --- a/bookie/src/app/taxes/tax-detail/tax-detail.component.html +++ b/bookie/src/app/taxes/tax-detail/tax-detail.component.html @@ -8,7 +8,7 @@ Name - Format for GST: ST GST @ x% (1/2) ; CGST @ x% (1/2) + Format for GST: ST GST @ x% (1/2) ; CGST @ x% (1/2)
@@ -22,9 +22,11 @@ Regime - - {{ reg.name }} - + @for (reg of regimes; track reg) { + + {{ reg.name }} + + }
@@ -32,8 +34,8 @@ - + @if (!!item.id) { + + } diff --git a/bookie/src/app/taxes/tax-detail/tax-detail.component.spec.ts b/bookie/src/app/taxes/tax-detail/tax-detail.component.spec.ts index f455fac..e54b217 100644 --- a/bookie/src/app/taxes/tax-detail/tax-detail.component.spec.ts +++ b/bookie/src/app/taxes/tax-detail/tax-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('TaxDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TaxDetailComponent], + imports: [TaxDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/taxes/tax-detail/tax-detail.component.ts b/bookie/src/app/taxes/tax-detail/tax-detail.component.ts index 7a3c661..3aeca0a 100644 --- a/bookie/src/app/taxes/tax-detail/tax-detail.component.ts +++ b/bookie/src/app/taxes/tax-detail/tax-detail.component.ts @@ -1,6 +1,12 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatHint, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; import { round } from 'mathjs'; import { Regime } from 'src/app/core/regime'; @@ -14,6 +20,23 @@ import { TaxService } from '../tax.service'; selector: 'app-tax-detail', templateUrl: './tax-detail.component.html', styleUrls: ['./tax-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatHint, + MatSuffix, + MatSelect, + MatOption, + MatCardActions, + MatButton, + ], }) export class TaxDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -67,27 +90,27 @@ export class TaxDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/taxes'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/taxes'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/taxes/tax-list-resolver.service.ts b/bookie/src/app/taxes/tax-list-resolver.service.ts deleted file mode 100644 index 84c0ef4..0000000 --- a/bookie/src/app/taxes/tax-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Tax } from '../core/tax'; - -import { TaxService } from './tax.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TaxListResolver { - constructor(private ser: TaxService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/taxes/tax-list-resolver.service.spec.ts b/bookie/src/app/taxes/tax-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/taxes/tax-list-resolver.service.spec.ts rename to bookie/src/app/taxes/tax-list.resolver.spec.ts diff --git a/bookie/src/app/taxes/tax-list.resolver.ts b/bookie/src/app/taxes/tax-list.resolver.ts new file mode 100644 index 0000000..e28c1e0 --- /dev/null +++ b/bookie/src/app/taxes/tax-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Tax } from '../core/tax'; + +import { TaxService } from './tax.service'; + +export const taxListResolver: ResolveFn = () => { + return inject(TaxService).list(); +}; diff --git a/bookie/src/app/taxes/tax-list/tax-list.component.spec.ts b/bookie/src/app/taxes/tax-list/tax-list.component.spec.ts index 6970b03..8158fec 100644 --- a/bookie/src/app/taxes/tax-list/tax-list.component.spec.ts +++ b/bookie/src/app/taxes/tax-list/tax-list.component.spec.ts @@ -8,7 +8,7 @@ describe('TaxListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [TaxListComponent], + imports: [TaxListComponent], }).compileComponents(); fixture = TestBed.createComponent(TaxListComponent); diff --git a/bookie/src/app/taxes/tax-list/tax-list.component.ts b/bookie/src/app/taxes/tax-list/tax-list.component.ts index fe1a94b..4aacc41 100644 --- a/bookie/src/app/taxes/tax-list/tax-list.component.ts +++ b/bookie/src/app/taxes/tax-list/tax-list.component.ts @@ -1,5 +1,21 @@ +import { PercentPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { Tax } from '../../core/tax'; @@ -9,6 +25,28 @@ import { TaxListDataSource } from './tax-list-datasource'; selector: 'app-tax-list', templateUrl: './tax-list.component.html', styleUrls: ['./tax-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + PercentPipe, + ], }) export class TaxListComponent implements OnInit { list: Tax[] = []; diff --git a/bookie/src/app/taxes/tax-resolver.service.ts b/bookie/src/app/taxes/tax-resolver.service.ts deleted file mode 100644 index 4e52ddf..0000000 --- a/bookie/src/app/taxes/tax-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Tax } from '../core/tax'; - -import { TaxService } from './tax.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TaxResolver { - constructor(private ser: TaxService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/taxes/tax-resolver.service.spec.ts b/bookie/src/app/taxes/tax.resolver.spec.ts similarity index 100% rename from bookie/src/app/taxes/tax-resolver.service.spec.ts rename to bookie/src/app/taxes/tax.resolver.spec.ts diff --git a/bookie/src/app/taxes/tax.resolver.ts b/bookie/src/app/taxes/tax.resolver.ts new file mode 100644 index 0000000..4b45ae7 --- /dev/null +++ b/bookie/src/app/taxes/tax.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Tax } from '../core/tax'; + +import { TaxService } from './tax.service'; + +export const taxResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(TaxService).get(id); +}; diff --git a/bookie/src/app/taxes/taxes-routing.module.spec.ts b/bookie/src/app/taxes/taxes-routing.module.spec.ts deleted file mode 100644 index f2cff44..0000000 --- a/bookie/src/app/taxes/taxes-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TaxesRoutingModule } from './taxes-routing.module'; - -describe('TaxesRoutingModule', () => { - let taxesRoutingModule: TaxesRoutingModule; - - beforeEach(() => { - taxesRoutingModule = new TaxesRoutingModule(); - }); - - it('should create an instance', () => { - expect(taxesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/taxes/taxes-routing.module.ts b/bookie/src/app/taxes/taxes-routing.module.ts deleted file mode 100644 index a4395b4..0000000 --- a/bookie/src/app/taxes/taxes-routing.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { RegimeListResolver } from '../regimes/regime-list-resolver.service'; - -import { TaxDetailComponent } from './tax-detail/tax-detail.component'; -import { TaxListComponent } from './tax-list/tax-list.component'; -import { TaxListResolver } from './tax-list-resolver.service'; -import { TaxResolver } from './tax-resolver.service'; - -const taxesRoutes: Routes = [ - { - path: '', - component: TaxListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Taxes', - }, - resolve: { - list: TaxListResolver, - }, - }, - { - path: 'new', - component: TaxDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Taxes', - }, - resolve: { - item: TaxResolver, - regimes: RegimeListResolver, - }, - }, - { - path: ':id', - component: TaxDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Taxes', - }, - resolve: { - item: TaxResolver, - regimes: RegimeListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(taxesRoutes)], - exports: [RouterModule], - providers: [TaxListResolver, TaxResolver], -}) -export class TaxesRoutingModule {} diff --git a/bookie/src/app/taxes/taxes.module.spec.ts b/bookie/src/app/taxes/taxes.module.spec.ts deleted file mode 100644 index ec79a32..0000000 --- a/bookie/src/app/taxes/taxes.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TaxesModule } from './taxes.module'; - -describe('TaxesModule', () => { - let taxesModule: TaxesModule; - - beforeEach(() => { - taxesModule = new TaxesModule(); - }); - - it('should create an instance', () => { - expect(taxesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/taxes/taxes.module.ts b/bookie/src/app/taxes/taxes.module.ts deleted file mode 100644 index 75bde8b..0000000 --- a/bookie/src/app/taxes/taxes.module.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; - -import { TaxDetailComponent } from './tax-detail/tax-detail.component'; -import { TaxListComponent } from './tax-list/tax-list.component'; -import { TaxesRoutingModule } from './taxes-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatSelectModule, - MatTableModule, - ReactiveFormsModule, - TaxesRoutingModule, - ], - declarations: [TaxListComponent, TaxDetailComponent], -}) -export class TaxesModule {} diff --git a/bookie/src/app/taxes/taxes.routes.ts b/bookie/src/app/taxes/taxes.routes.ts new file mode 100644 index 0000000..b432bf6 --- /dev/null +++ b/bookie/src/app/taxes/taxes.routes.ts @@ -0,0 +1,47 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { regimeListResolver } from '../regimes/regime-list.resolver'; + +import { TaxDetailComponent } from './tax-detail/tax-detail.component'; +import { TaxListComponent } from './tax-list/tax-list.component'; +import { taxListResolver } from './tax-list.resolver'; +import { taxResolver } from './tax.resolver'; + +export const routes: Routes = [ + { + path: '', + component: TaxListComponent, + canActivate: [authGuard], + data: { + permission: 'Taxes', + }, + resolve: { + list: taxListResolver, + }, + }, + { + path: 'new', + component: TaxDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Taxes', + }, + resolve: { + item: taxResolver, + regimes: regimeListResolver, + }, + }, + { + path: ':id', + component: TaxDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Taxes', + }, + resolve: { + item: taxResolver, + regimes: regimeListResolver, + }, + }, +]; diff --git a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.html b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.html index fb464b9..1cb3f47 100644 --- a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.html +++ b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.html @@ -38,17 +38,21 @@ Menu Category - - {{ mc.name }} - + @for (mc of menuCategories; track mc) { + + {{ mc.name }} + + } Sale Category - - {{ sc.name }} - + @for (sc of saleCategories; track sc) { + + {{ sc.name }} + + } diff --git a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.spec.ts b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.spec.ts index 01dee74..0fd0733 100644 --- a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.spec.ts +++ b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('TemporalProductDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [TemporalProductDetailComponent], + imports: [TemporalProductDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts index b59fc13..2b69b75 100644 --- a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts +++ b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts @@ -1,8 +1,16 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { MenuCategory } from '../../core/menu-category'; import { Product } from '../../core/product'; @@ -15,6 +23,26 @@ import { TemporalProductService } from '../temporal-product.service'; selector: 'app-product-detail', templateUrl: './temporal-product-detail.component.html', styleUrls: ['./temporal-product-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatCheckbox, + MatSelect, + MatOption, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatCardActions, + MatButton, + ], }) export class TemporalProductDetailComponent implements OnInit, AfterViewInit { @ViewChild('name', { static: true }) nameElement?: ElementRef; @@ -98,27 +126,27 @@ export class TemporalProductDetailComponent implements OnInit, AfterViewInit { } update() { - this.ser.update(this.getItem()).subscribe( - () => { + this.ser.update(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/temporal-products'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.versionId as string).subscribe( - () => { + this.ser.delete(this.item.versionId as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/temporal-products'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/temporal-product/temporal-product-list-resolver.service.ts b/bookie/src/app/temporal-product/temporal-product-list-resolver.service.ts deleted file mode 100644 index 81180d5..0000000 --- a/bookie/src/app/temporal-product/temporal-product-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { Product } from '../core/product'; - -import { TemporalProductService } from './temporal-product.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TemporalProductListResolverService { - constructor(private ser: TemporalProductService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/temporal-product/temporal-product-list-resolver.service.spec.ts b/bookie/src/app/temporal-product/temporal-product-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/temporal-product/temporal-product-list-resolver.service.spec.ts rename to bookie/src/app/temporal-product/temporal-product-list.resolver.spec.ts diff --git a/bookie/src/app/temporal-product/temporal-product-list.resolver.ts b/bookie/src/app/temporal-product/temporal-product-list.resolver.ts new file mode 100644 index 0000000..5b18130 --- /dev/null +++ b/bookie/src/app/temporal-product/temporal-product-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Product } from '../core/product'; + +import { TemporalProductService } from './temporal-product.service'; + +export const temporalProductListResolver: ResolveFn = () => { + return inject(TemporalProductService).list(); +}; diff --git a/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.html b/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.html index ffbd803..c2a18e5 100644 --- a/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.html +++ b/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.html @@ -13,18 +13,22 @@ Menu Category -- All Products -- - - {{ mc.name }} - + @for (mc of menuCategories; track mc) { + + {{ mc.name }} + + } Sale Category -- All Products -- - - {{ mc.name }} - + @for (mc of saleCategories; track mc) { + + {{ mc.name }} + + } diff --git a/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.spec.ts b/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.spec.ts index 20e34bf..05da17e 100644 --- a/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.spec.ts +++ b/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.spec.ts @@ -8,7 +8,7 @@ describe('TemporalProductListComponent', () => { beforeEach(fakeAsync(() => { TestBed.configureTestingModule({ - declarations: [TemporalProductListComponent], + imports: [TemporalProductListComponent], }).compileComponents(); fixture = TestBed.createComponent(TemporalProductListComponent); diff --git a/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.ts b/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.ts index ece5251..be651c4 100644 --- a/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.ts +++ b/bookie/src/app/temporal-product/temporal-product-list/temporal-product-list.component.ts @@ -1,6 +1,25 @@ +import { DecimalPipe, CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatFormField, MatLabel } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; @@ -15,6 +34,33 @@ import { TemporalProductListDatasource } from './temporal-product-list-datasourc selector: 'app-product-list', templateUrl: './temporal-product-list.component.html', styleUrls: ['./temporal-product-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatSelect, + MatOption, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + RouterLink, + MatIcon, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + DecimalPipe, + CurrencyPipe, + ], }) export class TemporalProductListComponent implements OnInit { searchFilter: Observable = new Observable(); diff --git a/bookie/src/app/temporal-product/temporal-product-resolver.service.ts b/bookie/src/app/temporal-product/temporal-product-resolver.service.ts deleted file mode 100644 index 75d2f63..0000000 --- a/bookie/src/app/temporal-product/temporal-product-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { Product } from '../core/product'; - -import { TemporalProductService } from './temporal-product.service'; - -@Injectable({ - providedIn: 'root', -}) -export class TemporalProductResolverService { - constructor(private ser: TemporalProductService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id as string); - } -} diff --git a/bookie/src/app/temporal-product/temporal-product-resolver.service.spec.ts b/bookie/src/app/temporal-product/temporal-product.resolver.spec.ts similarity index 100% rename from bookie/src/app/temporal-product/temporal-product-resolver.service.spec.ts rename to bookie/src/app/temporal-product/temporal-product.resolver.spec.ts diff --git a/bookie/src/app/temporal-product/temporal-product.resolver.ts b/bookie/src/app/temporal-product/temporal-product.resolver.ts new file mode 100644 index 0000000..fd56c43 --- /dev/null +++ b/bookie/src/app/temporal-product/temporal-product.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { Product } from '../core/product'; + +import { TemporalProductService } from './temporal-product.service'; + +export const temporalProductResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(TemporalProductService).get(id as string); +}; diff --git a/bookie/src/app/temporal-product/temporal-products-routing.module.spec.ts b/bookie/src/app/temporal-product/temporal-products-routing.module.spec.ts deleted file mode 100644 index 7cf6e18..0000000 --- a/bookie/src/app/temporal-product/temporal-products-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TemporalProductsRoutingModule } from './temporal-products-routing.module'; - -describe('TemporalProductsRoutingModule', () => { - let temporalProductsRoutingModule: TemporalProductsRoutingModule; - - beforeEach(() => { - temporalProductsRoutingModule = new TemporalProductsRoutingModule(); - }); - - it('should create an instance', () => { - expect(temporalProductsRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/temporal-product/temporal-products-routing.module.ts b/bookie/src/app/temporal-product/temporal-products-routing.module.ts deleted file mode 100644 index eb0bbfd..0000000 --- a/bookie/src/app/temporal-product/temporal-products-routing.module.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { MenuCategoryListResolver } from '../menu-category/menu-category-list-resolver.service'; -import { SaleCategoryListResolver } from '../sale-category/sale-category-list-resolver.service'; - -import { TemporalProductDetailComponent } from './temporal-product-detail/temporal-product-detail.component'; -import { TemporalProductListComponent } from './temporal-product-list/temporal-product-list.component'; -import { TemporalProductListResolverService } from './temporal-product-list-resolver.service'; -import { TemporalProductResolverService } from './temporal-product-resolver.service'; - -const temporalProductsRoutes: Routes = [ - { - path: '', - component: TemporalProductListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Temporal Products', - }, - resolve: { - list: TemporalProductListResolverService, - menuCategories: MenuCategoryListResolver, - saleCategories: SaleCategoryListResolver, - }, - }, - { - path: 'new', - component: TemporalProductDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Temporal Products', - }, - resolve: { - item: TemporalProductResolverService, - menuCategories: MenuCategoryListResolver, - saleCategories: SaleCategoryListResolver, - }, - }, - { - path: ':id', - component: TemporalProductDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Temporal Products', - }, - resolve: { - item: TemporalProductResolverService, - menuCategories: MenuCategoryListResolver, - saleCategories: SaleCategoryListResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(temporalProductsRoutes)], - exports: [RouterModule], - providers: [TemporalProductListResolverService, TemporalProductResolverService], -}) -export class TemporalProductsRoutingModule {} diff --git a/bookie/src/app/temporal-product/temporal-products.module.spec.ts b/bookie/src/app/temporal-product/temporal-products.module.spec.ts deleted file mode 100644 index af97f77..0000000 --- a/bookie/src/app/temporal-product/temporal-products.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TemporalProductsModule } from './temporal-products.module'; - -describe('TemporalProductsModule', () => { - let temporalProductsModule: TemporalProductsModule; - - beforeEach(() => { - temporalProductsModule = new TemporalProductsModule(); - }); - - it('should create an instance', () => { - expect(temporalProductsModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/temporal-product/temporal-products.module.ts b/bookie/src/app/temporal-product/temporal-products.module.ts deleted file mode 100644 index e7721d7..0000000 --- a/bookie/src/app/temporal-product/temporal-products.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MatOptionModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { TemporalProductDetailComponent } from './temporal-product-detail/temporal-product-detail.component'; -import { TemporalProductListComponent } from './temporal-product-list/temporal-product-list.component'; -import { TemporalProductsRoutingModule } from './temporal-products-routing.module'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - CommonModule, - MatTableModule, - MatCardModule, - MatProgressSpinnerModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatOptionModule, - MatSelectModule, - MatCheckboxModule, - ReactiveFormsModule, - TemporalProductsRoutingModule, - MatDatepickerModule, - ], - declarations: [TemporalProductListComponent, TemporalProductDetailComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class TemporalProductsModule {} diff --git a/bookie/src/app/temporal-product/temporal-products.routes.ts b/bookie/src/app/temporal-product/temporal-products.routes.ts new file mode 100644 index 0000000..4e8db5f --- /dev/null +++ b/bookie/src/app/temporal-product/temporal-products.routes.ts @@ -0,0 +1,52 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { menuCategoryListResolver } from '../menu-category/menu-category-list.resolver'; +import { saleCategoryListResolver } from '../sale-category/sale-category-list.resolver'; + +import { TemporalProductDetailComponent } from './temporal-product-detail/temporal-product-detail.component'; +import { TemporalProductListComponent } from './temporal-product-list/temporal-product-list.component'; +import { temporalProductListResolver } from './temporal-product-list.resolver'; +import { temporalProductResolver } from './temporal-product.resolver'; + +export const routes: Routes = [ + { + path: '', + component: TemporalProductListComponent, + canActivate: [authGuard], + data: { + permission: 'Temporal Products', + }, + resolve: { + list: temporalProductListResolver, + menuCategories: menuCategoryListResolver, + saleCategories: saleCategoryListResolver, + }, + }, + { + path: 'new', + component: TemporalProductDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Temporal Products', + }, + resolve: { + item: temporalProductResolver, + menuCategories: menuCategoryListResolver, + saleCategories: saleCategoryListResolver, + }, + }, + { + path: ':id', + component: TemporalProductDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Temporal Products', + }, + resolve: { + item: temporalProductResolver, + menuCategories: menuCategoryListResolver, + saleCategories: saleCategoryListResolver, + }, + }, +]; diff --git a/bookie/src/app/update-product-prices/update-product-prices-resolver.service.ts b/bookie/src/app/update-product-prices/update-product-prices-resolver.service.ts deleted file mode 100644 index 7cf769c..0000000 --- a/bookie/src/app/update-product-prices/update-product-prices-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { UpdateProductPrices } from './update-product-prices'; -import { UpdateProductPricesService } from './update-product-prices.service'; - -@Injectable({ - providedIn: 'root', -}) -export class UpdateProductPricesResolver { - constructor(private ser: UpdateProductPricesService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const date = route.queryParamMap.get('date') ?? null; - const id = route.paramMap.get('id'); - return this.ser.get(id, date); - } -} diff --git a/bookie/src/app/update-product-prices/update-product-prices-routing.module.spec.ts b/bookie/src/app/update-product-prices/update-product-prices-routing.module.spec.ts deleted file mode 100644 index 2dc6643..0000000 --- a/bookie/src/app/update-product-prices/update-product-prices-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UpdateProductPricesRoutingModule } from './update-product-prices-routing.module'; - -describe('UpdateProductPricesRoutingModule', () => { - let pupdateProductPricesRoutingModule: UpdateProductPricesRoutingModule; - - beforeEach(() => { - pupdateProductPricesRoutingModule = new UpdateProductPricesRoutingModule(); - }); - - it('should create an instance', () => { - expect(pupdateProductPricesRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/update-product-prices/update-product-prices-routing.module.ts b/bookie/src/app/update-product-prices/update-product-prices-routing.module.ts deleted file mode 100644 index 4ab7b62..0000000 --- a/bookie/src/app/update-product-prices/update-product-prices-routing.module.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; -import { MenuCategoryListResolver } from '../menu-category/menu-category-list-resolver.service'; - -import { UpdateProductPricesResolver } from './update-product-prices-resolver.service'; -import { UpdateProductPricesComponent } from './update-product-prices.component'; - -const pupdateProductPricesRoutes: Routes = [ - { - path: '', - component: UpdateProductPricesComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - menuCategories: MenuCategoryListResolver, - info: UpdateProductPricesResolver, - }, - runGuardsAndResolvers: 'always', - }, - { - path: ':id', - component: UpdateProductPricesComponent, - canActivate: [AuthGuard], - data: { - permission: 'Products', - }, - resolve: { - menuCategories: MenuCategoryListResolver, - info: UpdateProductPricesResolver, - }, - runGuardsAndResolvers: 'always', - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(pupdateProductPricesRoutes)], - exports: [RouterModule], - providers: [UpdateProductPricesResolver], -}) -export class UpdateProductPricesRoutingModule {} diff --git a/bookie/src/app/update-product-prices/update-product-prices.component.html b/bookie/src/app/update-product-prices/update-product-prices.component.html index c2d5ef5..557097d 100644 --- a/bookie/src/app/update-product-prices/update-product-prices.component.html +++ b/bookie/src/app/update-product-prices/update-product-prices.component.html @@ -19,9 +19,11 @@ Menu Category - - {{ s.name }} - + @for (s of menuCategories; track s) { + + {{ s.name }} + + } diff --git a/bookie/src/app/update-product-prices/update-product-prices.component.spec.ts b/bookie/src/app/update-product-prices/update-product-prices.component.spec.ts index 5d6051c..4d75f61 100644 --- a/bookie/src/app/update-product-prices/update-product-prices.component.spec.ts +++ b/bookie/src/app/update-product-prices/update-product-prices.component.spec.ts @@ -8,7 +8,7 @@ describe('UpdateProductPricesComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [UpdateProductPricesComponent], + imports: [UpdateProductPricesComponent], }).compileComponents(); })); diff --git a/bookie/src/app/update-product-prices/update-product-prices.component.ts b/bookie/src/app/update-product-prices/update-product-prices.component.ts index eda7b9d..34af73b 100644 --- a/bookie/src/app/update-product-prices/update-product-prices.component.ts +++ b/bookie/src/app/update-product-prices/update-product-prices.component.ts @@ -1,7 +1,35 @@ +import { CurrencyPipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatIconButton, MatButton } from '@angular/material/button'; +import { + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatCardContent, + MatCardActions, +} from '@angular/material/card'; +import { MatOption } from '@angular/material/core'; +import { MatDatepickerInput, MatDatepickerToggle, MatDatepicker } from '@angular/material/datepicker'; +import { MatFormField, MatLabel, MatSuffix, MatPrefix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatSelect } from '@angular/material/select'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; -import * as moment from 'moment'; +import moment from 'moment'; import { map } from 'rxjs/operators'; import { MenuCategory } from '../core/menu-category'; @@ -16,6 +44,40 @@ import { UpdateProductPricesService } from './update-product-prices.service'; selector: 'app-update-product-prices', templateUrl: './update-product-prices.component.html', styleUrls: ['./update-product-prices.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatIconButton, + MatIcon, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatDatepickerInput, + MatDatepickerToggle, + MatSuffix, + MatDatepicker, + MatSelect, + MatOption, + MatButton, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatPrefix, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + MatCardActions, + CurrencyPipe, + ], }) export class UpdateProductPricesComponent implements OnInit { info: UpdateProductPrices = new UpdateProductPrices(); @@ -128,14 +190,14 @@ export class UpdateProductPricesComponent implements OnInit { } save() { - this.ser.save(this.getInfo()).subscribe( - (result: UpdateProductPrices) => { + this.ser.save(this.getInfo()).subscribe({ + next: (result: UpdateProductPrices) => { this.toaster.show('Success', ''); this.loadData(result); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } } diff --git a/bookie/src/app/update-product-prices/update-product-prices.module.spec.ts b/bookie/src/app/update-product-prices/update-product-prices.module.spec.ts deleted file mode 100644 index 73d9be8..0000000 --- a/bookie/src/app/update-product-prices/update-product-prices.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UpdateProductPricesModule } from './update-product-prices.module'; - -describe('UpdateProductPricesModule', () => { - let pupdateProductPricesModule: UpdateProductPricesModule; - - beforeEach(() => { - pupdateProductPricesModule = new UpdateProductPricesModule(); - }); - - it('should create an instance', () => { - expect(pupdateProductPricesModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/update-product-prices/update-product-prices.module.ts b/bookie/src/app/update-product-prices/update-product-prices.module.ts deleted file mode 100644 index b4dc0c6..0000000 --- a/bookie/src/app/update-product-prices/update-product-prices.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { A11yModule } from '@angular/cdk/a11y'; -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -import { SharedModule } from '../shared/shared.module'; - -import { UpdateProductPricesRoutingModule } from './update-product-prices-routing.module'; -import { UpdateProductPricesComponent } from './update-product-prices.component'; - -export const MY_FORMATS = { - parse: { - dateInput: 'DD-MMM-YYYY', - }, - display: { - dateInput: 'DD-MMM-YYYY', - monthYearLabel: 'MMM YYYY', - dateA11yLabel: 'DD-MMM-YYYY', - monthYearA11yLabel: 'MMM YYYY', - }, -}; - -@NgModule({ - imports: [ - A11yModule, - CommonModule, - CdkTableModule, - MatAutocompleteModule, - MatButtonModule, - MatCardModule, - MatDatepickerModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatNativeDateModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - UpdateProductPricesRoutingModule, - MatSelectModule, - ], - declarations: [UpdateProductPricesComponent], - providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, - { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, - ], -}) -export class UpdateProductPricesModule {} diff --git a/bookie/src/app/update-product-prices/update-product-prices-resolver.service.spec.ts b/bookie/src/app/update-product-prices/update-product-prices.resolver.spec.ts similarity index 100% rename from bookie/src/app/update-product-prices/update-product-prices-resolver.service.spec.ts rename to bookie/src/app/update-product-prices/update-product-prices.resolver.spec.ts diff --git a/bookie/src/app/update-product-prices/update-product-prices.resolver.ts b/bookie/src/app/update-product-prices/update-product-prices.resolver.ts new file mode 100644 index 0000000..a763127 --- /dev/null +++ b/bookie/src/app/update-product-prices/update-product-prices.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { UpdateProductPrices } from './update-product-prices'; +import { UpdateProductPricesService } from './update-product-prices.service'; + +export const updateProductPricesResolver: ResolveFn = (route) => { + const date = route.queryParamMap.get('date') ?? null; + const id = route.paramMap.get('id'); + return inject(UpdateProductPricesService).get(id, date); +}; diff --git a/bookie/src/app/update-product-prices/update-product-prices.routes.ts b/bookie/src/app/update-product-prices/update-product-prices.routes.ts new file mode 100644 index 0000000..d05e2ba --- /dev/null +++ b/bookie/src/app/update-product-prices/update-product-prices.routes.ts @@ -0,0 +1,36 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; +import { menuCategoryListResolver } from '../menu-category/menu-category-list.resolver'; + +import { UpdateProductPricesComponent } from './update-product-prices.component'; +import { updateProductPricesResolver } from './update-product-prices.resolver'; + +export const routes: Routes = [ + { + path: '', + component: UpdateProductPricesComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + menuCategories: menuCategoryListResolver, + info: updateProductPricesResolver, + }, + runGuardsAndResolvers: 'always', + }, + { + path: ':id', + component: UpdateProductPricesComponent, + canActivate: [authGuard], + data: { + permission: 'Products', + }, + resolve: { + menuCategories: menuCategoryListResolver, + info: updateProductPricesResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; diff --git a/bookie/src/app/users/user-detail/user-detail.component.html b/bookie/src/app/users/user-detail/user-detail.component.html index 5ee8615..3813a3a 100644 --- a/bookie/src/app/users/user-detail/user-detail.component.html +++ b/bookie/src/app/users/user-detail/user-detail.component.html @@ -22,13 +22,11 @@
-
- {{ r.name }} -
+ @for (r of item.roles; track r; let i = $index) { +
+ {{ r.name }} +
+ }
diff --git a/bookie/src/app/users/user-detail/user-detail.component.spec.ts b/bookie/src/app/users/user-detail/user-detail.component.spec.ts index a85cd5f..0edc151 100644 --- a/bookie/src/app/users/user-detail/user-detail.component.spec.ts +++ b/bookie/src/app/users/user-detail/user-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('UserDetailComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [UserDetailComponent], + imports: [UserDetailComponent], }).compileComponents(); })); diff --git a/bookie/src/app/users/user-detail/user-detail.component.ts b/bookie/src/app/users/user-detail/user-detail.component.ts index 9650b9d..0e2254c 100644 --- a/bookie/src/app/users/user-detail/user-detail.component.ts +++ b/bookie/src/app/users/user-detail/user-detail.component.ts @@ -1,6 +1,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; +import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, MatCardActions } from '@angular/material/card'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { MatDivider } from '@angular/material/divider'; +import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; import { ToasterService } from '../../core/toaster.service'; @@ -12,6 +19,23 @@ import { UserService } from '../user.service'; selector: 'app-user-detail', templateUrl: './user-detail.component.html', styleUrls: ['./user-detail.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitle, + MatCardContent, + ReactiveFormsModule, + MatFormField, + MatLabel, + MatInput, + MatIcon, + MatSuffix, + MatCheckbox, + MatDivider, + MatCardActions, + MatButton, + ], }) export class UserDetailComponent implements OnInit, AfterViewInit { @ViewChild('nameElement', { static: true }) nameElement?: ElementRef; @@ -77,8 +101,8 @@ export class UserDetailComponent implements OnInit, AfterViewInit { } save() { - this.ser.saveOrUpdate(this.getItem()).subscribe( - () => { + this.ser.saveOrUpdate(this.getItem()).subscribe({ + next: () => { this.toaster.show('Success', ''); console.log(this.item.id); if ((this.item.id as string) === 'me') { @@ -87,22 +111,22 @@ export class UserDetailComponent implements OnInit, AfterViewInit { this.router.navigateByUrl('/users'); } }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } delete() { - this.ser.delete(this.item.id as string).subscribe( - () => { + this.ser.delete(this.item.id as string).subscribe({ + next: () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/users'); }, - (error) => { + error: (error) => { this.toaster.show('Error', error); }, - ); + }); } confirmDelete(): void { diff --git a/bookie/src/app/users/user-list-resolver.service.ts b/bookie/src/app/users/user-list-resolver.service.ts deleted file mode 100644 index fad3ebc..0000000 --- a/bookie/src/app/users/user-list-resolver.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; - -import { User } from '../core/user'; - -import { UserService } from './user.service'; - -@Injectable({ - providedIn: 'root', -}) -export class UserListResolver { - constructor(private ser: UserService) {} - - resolve(): Observable { - return this.ser.list(); - } -} diff --git a/bookie/src/app/users/user-list-resolver.service.spec.ts b/bookie/src/app/users/user-list.resolver.spec.ts similarity index 100% rename from bookie/src/app/users/user-list-resolver.service.spec.ts rename to bookie/src/app/users/user-list.resolver.spec.ts diff --git a/bookie/src/app/users/user-list.resolver.ts b/bookie/src/app/users/user-list.resolver.ts new file mode 100644 index 0000000..eac25ae --- /dev/null +++ b/bookie/src/app/users/user-list.resolver.ts @@ -0,0 +1,10 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { User } from '../core/user'; + +import { UserService } from './user.service'; + +export const userListResolver: ResolveFn = () => { + return inject(UserService).list(); +}; diff --git a/bookie/src/app/users/user-list/user-list.component.html b/bookie/src/app/users/user-list/user-list.component.html index 4879717..85c1725 100644 --- a/bookie/src/app/users/user-list/user-list.component.html +++ b/bookie/src/app/users/user-list/user-list.component.html @@ -29,7 +29,9 @@ Roles
    -
  • {{ role }}
  • + @for (role of row.roles; track role) { +
  • {{ role }}
  • + }
@@ -38,7 +40,7 @@ Last Login {{ row.lastDevice }} @ {{ row.lastDate ? (row.lastDate | localTime) : 'Never' }}{{ row.lastDevice }} @ {{ row.lastDate ? (row.lastDate | localTime) : 'Never' }} diff --git a/bookie/src/app/users/user-list/user-list.component.ts b/bookie/src/app/users/user-list/user-list.component.ts index 3fbcd8b..2106e9d 100644 --- a/bookie/src/app/users/user-list/user-list.component.ts +++ b/bookie/src/app/users/user-list/user-list.component.ts @@ -1,7 +1,23 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { MatAnchor } from '@angular/material/button'; +import { MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatCardContent } from '@angular/material/card'; +import { MatIcon } from '@angular/material/icon'; +import { + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, +} from '@angular/material/table'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { User } from '../../core/user'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { UserListDataSource } from './user-list-datasource'; @@ -9,6 +25,28 @@ import { UserListDataSource } from './user-list-datasource'; selector: 'app-user-list', templateUrl: './user-list.component.html', styleUrls: ['./user-list.component.css'], + standalone: true, + imports: [ + MatCard, + MatCardHeader, + MatCardTitleGroup, + MatCardTitle, + MatAnchor, + RouterLink, + MatIcon, + MatCardContent, + MatTable, + MatColumnDef, + MatHeaderCellDef, + MatHeaderCell, + MatCellDef, + MatCell, + MatHeaderRowDef, + MatHeaderRow, + MatRowDef, + MatRow, + LocalTimePipe, + ], }) export class UserListComponent implements OnInit { dataSource: UserListDataSource = new UserListDataSource([]); diff --git a/bookie/src/app/users/user-resolver.service.ts b/bookie/src/app/users/user-resolver.service.ts deleted file mode 100644 index 6ac22dd..0000000 --- a/bookie/src/app/users/user-resolver.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; - -import { User } from '../core/user'; - -import { UserService } from './user.service'; - -@Injectable({ - providedIn: 'root', -}) -export class UserResolver { - constructor(private ser: UserService) {} - - resolve(route: ActivatedRouteSnapshot): Observable { - const id = route.paramMap.get('id'); - return this.ser.get(id); - } -} diff --git a/bookie/src/app/users/user-resolver.service.spec.ts b/bookie/src/app/users/user.resolver.spec.ts similarity index 100% rename from bookie/src/app/users/user-resolver.service.spec.ts rename to bookie/src/app/users/user.resolver.spec.ts diff --git a/bookie/src/app/users/user.resolver.ts b/bookie/src/app/users/user.resolver.ts new file mode 100644 index 0000000..884371c --- /dev/null +++ b/bookie/src/app/users/user.resolver.ts @@ -0,0 +1,11 @@ +import { inject } from '@angular/core'; +import { ResolveFn } from '@angular/router'; + +import { User } from '../core/user'; + +import { UserService } from './user.service'; + +export const userResolver: ResolveFn = (route) => { + const id = route.paramMap.get('id'); + return inject(UserService).get(id); +}; diff --git a/bookie/src/app/users/users-routing.module.spec.ts b/bookie/src/app/users/users-routing.module.spec.ts deleted file mode 100644 index 87274e1..0000000 --- a/bookie/src/app/users/users-routing.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UsersRoutingModule } from './users-routing.module'; - -describe('UsersRoutingModule', () => { - let userRoutingModule: UsersRoutingModule; - - beforeEach(() => { - userRoutingModule = new UsersRoutingModule(); - }); - - it('should create an instance', () => { - expect(userRoutingModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/users/users-routing.module.ts b/bookie/src/app/users/users-routing.module.ts deleted file mode 100644 index ac303cd..0000000 --- a/bookie/src/app/users/users-routing.module.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AuthGuard } from '../auth/auth-guard.service'; - -import { UserDetailComponent } from './user-detail/user-detail.component'; -import { UserListComponent } from './user-list/user-list.component'; -import { UserListResolver } from './user-list-resolver.service'; -import { UserResolver } from './user-resolver.service'; - -const usersRoutes: Routes = [ - { - path: '', - component: UserListComponent, - canActivate: [AuthGuard], - data: { - permission: 'Users', - }, - resolve: { - list: UserListResolver, - }, - }, - { - path: 'new', - component: UserDetailComponent, - canActivate: [AuthGuard], - data: { - permission: 'Users', - }, - resolve: { - item: UserResolver, - }, - }, - { - path: ':id', - component: UserDetailComponent, - canActivate: [AuthGuard], - resolve: { - item: UserResolver, - }, - }, -]; - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(usersRoutes)], - exports: [RouterModule], - providers: [UserListResolver, UserResolver], -}) -export class UsersRoutingModule {} diff --git a/bookie/src/app/users/users.module.spec.ts b/bookie/src/app/users/users.module.spec.ts deleted file mode 100644 index f6a5b71..0000000 --- a/bookie/src/app/users/users.module.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UsersModule } from './users.module'; - -describe('UsersModule', () => { - let userModule: UsersModule; - - beforeEach(() => { - userModule = new UsersModule(); - }); - - it('should create an instance', () => { - expect(userModule).toBeTruthy(); - }); -}); diff --git a/bookie/src/app/users/users.module.ts b/bookie/src/app/users/users.module.ts deleted file mode 100644 index 718a61a..0000000 --- a/bookie/src/app/users/users.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CdkTableModule } from '@angular/cdk/table'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTableModule } from '@angular/material/table'; - -import { SharedModule } from '../shared/shared.module'; - -import { UserDetailComponent } from './user-detail/user-detail.component'; -import { UserListComponent } from './user-list/user-list.component'; -import { UsersRoutingModule } from './users-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - CdkTableModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatInputModule, - MatProgressSpinnerModule, - MatTableModule, - ReactiveFormsModule, - SharedModule, - UsersRoutingModule, - ], - declarations: [UserListComponent, UserDetailComponent], -}) -export class UsersModule {} diff --git a/bookie/src/app/users/users.routes.ts b/bookie/src/app/users/users.routes.ts new file mode 100644 index 0000000..65cfbb4 --- /dev/null +++ b/bookie/src/app/users/users.routes.ts @@ -0,0 +1,41 @@ +import { Routes } from '@angular/router'; + +import { authGuard } from '../auth/auth-guard.service'; + +import { UserDetailComponent } from './user-detail/user-detail.component'; +import { UserListComponent } from './user-list/user-list.component'; +import { userListResolver } from './user-list.resolver'; +import { userResolver } from './user.resolver'; + +export const routes: Routes = [ + { + path: '', + component: UserListComponent, + canActivate: [authGuard], + data: { + permission: 'Users', + }, + resolve: { + list: userListResolver, + }, + }, + { + path: 'new', + component: UserDetailComponent, + canActivate: [authGuard], + data: { + permission: 'Users', + }, + resolve: { + item: userResolver, + }, + }, + { + path: ':id', + component: UserDetailComponent, + canActivate: [authGuard], + resolve: { + item: userResolver, + }, + }, +]; diff --git a/bookie/src/environments/environment.prod.ts b/bookie/src/environments/environment.prod.ts deleted file mode 100644 index f1135a7..0000000 --- a/bookie/src/environments/environment.prod.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const environment = { - production: true, - ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry - version: '11.7.0', -}; diff --git a/bookie/src/environments/environment.ts b/bookie/src/environments/environment.ts deleted file mode 100644 index 413a1a3..0000000 --- a/bookie/src/environments/environment.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, - ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry - version: '11.7.0', -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/bookie/src/main.ts b/bookie/src/main.ts index 17a5cd4..2cf9665 100644 --- a/bookie/src/main.ts +++ b/bookie/src/main.ts @@ -1,7 +1,7 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { bootstrapApplication } from '@angular/platform-browser'; -import { AppModule } from './app/app.module'; +import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; -platformBrowserDynamic() - .bootstrapModule(AppModule) +bootstrapApplication(AppComponent, appConfig) .catch((err) => console.error(err)); diff --git a/bookie/src/styles.sass b/bookie/src/styles.sass index a9ff186..dba73eb 100644 --- a/bookie/src/styles.sass +++ b/bookie/src/styles.sass @@ -16,11 +16,11 @@ a text-decoration: underline -$my-primary: mat.define-palette(mat.$indigo-palette, 500) -$my-accent: mat.define-palette(mat.$amber-palette, A200, A100, A400) +$my-primary: mat.m2-define-palette(mat.$m2-indigo-palette, 500) +$my-accent: mat.m2-define-palette(mat.$m2-amber-palette, A200, A100, A400) /* The "warn" palette is optional and defaults to red if not specified.*/ -$my-warn: mat.define-palette(mat.$red-palette) -$my-disabled: mat.define-palette(mat.$grey-palette, 500) +$my-warn: mat.m2-define-palette(mat.$m2-red-palette) +$my-disabled: mat.m2-define-palette(mat.$m2-grey-palette, 500) .square-button min-width: 150px @@ -43,40 +43,40 @@ $my-disabled: mat.define-palette(mat.$grey-palette, 500) .square-button.primary /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-primary, '200-contrast') - background: mat.get-color-from-palette($my-primary, 200) + color: mat.m2-get-color-from-palette($my-primary, '200-contrast') + background: mat.m2-get-color-from-palette($my-primary, 200) .square-button.strong-primary /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-primary, '700-contrast') - background: mat.get-color-from-palette($my-primary, 700) + color: mat.m2-get-color-from-palette($my-primary, '700-contrast') + background: mat.m2-get-color-from-palette($my-primary, 700) .square-button.accent /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-accent, '200-contrast') - background: mat.get-color-from-palette($my-accent, 200) + color: mat.m2-get-color-from-palette($my-accent, '200-contrast') + background: mat.m2-get-color-from-palette($my-accent, 200) .square-button.strong-accent /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-accent, '700-contrast') - background: mat.get-color-from-palette($my-accent, 700) + color: mat.m2-get-color-from-palette($my-accent, '700-contrast') + background: mat.m2-get-color-from-palette($my-accent, 700) .square-button.warn /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-warn, '700-contrast') - background: mat.get-color-from-palette($my-warn, 700) + color: mat.m2-get-color-from-palette($my-warn, '700-contrast') + background: mat.m2-get-color-from-palette($my-warn, 700) .square-button.strong-warn /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-warn, '700-contrast') - background: mat.get-color-from-palette($my-warn, 700) + color: mat.m2-get-color-from-palette($my-warn, '700-contrast') + background: mat.m2-get-color-from-palette($my-warn, 700) .square-button.disabled /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-disabled, '500-contrast') - background: mat.get-color-from-palette($my-disabled, 500) + color: mat.m2-get-color-from-palette($my-disabled, '500-contrast') + background: mat.m2-get-color-from-palette($my-disabled, 500) .square-button.strong-disabled /* Read the 500 hue from the primary color palete.*/ - color: mat.get-color-from-palette($my-disabled, '800-contrast') - background: mat.get-color-from-palette($my-disabled, 800) + color: mat.m2-get-color-from-palette($my-disabled, '800-contrast') + background: mat.m2-get-color-from-palette($my-disabled, 800) diff --git a/bookie/tsconfig.json b/bookie/tsconfig.json index cc01d43..4a6b165 100644 --- a/bookie/tsconfig.json +++ b/bookie/tsconfig.json @@ -10,9 +10,10 @@ "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, "sourceMap": true, "declaration": false, - "downlevelIteration": true, "experimentalDecorators": true, "moduleResolution": "node", "importHelpers": true, diff --git a/lint.sh b/lint.sh index ca784c3..b13116c 100755 --- a/lint.sh +++ b/lint.sh @@ -1,9 +1,16 @@ #!/usr/bin/env bash +set -eEu -o pipefail +shopt -s extdebug +IFS=$'\n\t' + parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd -P ) cd "$parent_path/bookie" || exit npx prettier --write src/app npx ng lint --fix + cd "$parent_path/barker" || exit -isort barker -black barker -flake8 barker +ruff format . +ruff check . # Lint all files in the current directory (and any subdirectories) +bandit --recursive brewman +bandit --recursive . +safety check