Compare commits

...

694 Commits

Author SHA1 Message Date
Nino Righi
7376846894 Merged PR 1977: #5390 Reward Checkout Action Card - Collect Request
#5390 Reward Checkout Action Card - Collect Request
2025-10-22 13:08:53 +00:00
Lorenz Hilpert
bcb412e48d chore: add Claude Code infrastructure and documentation system
Add comprehensive Claude Code tooling:
- Agents: docs-researcher, docs-researcher-advanced for documentation research
- Commands: dev:add-e2e-attrs, docs:library, docs:refresh-reference, quality:bundle-analyze, quality:coverage
- Skills: 8 specialized skills including api-change-analyzer, architecture-enforcer, library-scaffolder, and more

Update documentation:
- Comprehensive CLAUDE.md overhaul with library reference system
- Update testing guidelines in docs/guidelines/testing.md
- Update READMEs for checkout, icons, scanner, and scroll-position libraries

Remove outdated checkout-completion-flow-documentation.md

Update .gitignore for Claude Code files
2025-10-22 15:02:53 +02:00
Lorenz Hilpert
664c36a9a3 chore: update dependencies and engine requirements
- Upgrade Angular from 20.1.2 to 20.3.6
- Upgrade Angular CDK from 20.1.2 to 20.2.9
- Upgrade ng-icons from 32.0.0 to 32.2.0
- Upgrade angular-eslint from 20.1.1 to 20.4.0
- Upgrade @ngneat/spectator from 19.6.2 to 22.0.0
- Upgrade ng-mocks from 14.13.5 to 14.14.0
- Upgrade ng-packagr from 20.1.0 to 20.3.0
- Upgrade @analogjs tools from 1.19.1 to 1.21.3
- Update Node.js engine requirement to >=22.12.0 <23.0.0
- Update npm engine requirement to >=11.6.0 <11.7.0
2025-10-22 13:08:32 +02:00
Lorenz Hilpert
743d6c1ee9 docs: comprehensive CLAUDE.md overhaul with library reference system
- Restructure CLAUDE.md with clearer sections and updated metadata
- Add research guidelines emphasizing subagent usage and documentation-first approach
- Create library reference guide covering all 61 libraries across 12 domains
- Add automated library reference generation tool
- Complete test coverage for reward order confirmation feature (6 new spec files)
- Refine product info components and adapters with improved documentation
- Update workflows documentation for checkout service
- Fix ESLint issues: case declarations, unused imports, and unused variables
2025-10-22 11:55:04 +02:00
Lorenz Hilpert
a92f72f767 feat(checkout): complete reward order confirmation with reusable product info component
- Extract reusable ProductInfoComponent from ProductInfoRedemptionComponent
- Implement order confirmation item list with product, action card, and destination info
- Add completed shopping carts tracking to checkout metadata service
- Create Storybook stories for product info component variants
- Update checkout completion orchestrator to store shopping cart data
- Extract COMPLETED_SHOPPING_CARTS_METADATA_KEY constant for consistency
2025-10-21 22:18:16 +02:00
Lorenz Hilpert
ee2d9ba43a feat(checkout): implement reward order confirmation UI
Implement the complete UI for the reward order confirmation page including address displays, order item lists, and supporting helper functions.

Features:
- Add order confirmation addresses component displaying billing, delivery, and pickup branch addresses
- Implement order confirmation item list with order type icons and item details
- Add helper functions for order type feature checking and address/branch deduplication
- Integrate store computed properties for payers, shipping addresses, and target branches
- Apply responsive layout with Tailwind CSS styling
2025-10-21 17:39:52 +02:00
Lorenz Hilpert
5b04a29e17 feat(checkout): add confirmation list item action card component
Add new ConfirmationListItemActionCardComponent for displaying action
cards in order confirmation item list. Component receives DisplayOrderItem
as input for rendering action-specific information.
2025-10-21 14:57:46 +02:00
Lorenz Hilpert
a3835dd688 refactor(common): add validation for notification channel flag combinations
Add refine validation to NotificationChannelSchema to ensure only valid
flag combinations are accepted. Computes valid flags using bitwise OR
of all enum values.
2025-10-21 14:33:03 +02:00
Lorenz Hilpert
2b5da00249 feat(checkout): add reward order confirmation feature with schema migrations
- Add new reward-order-confirmation feature library with components and store
- Implement checkout completion orchestrator service for order finalization
- Migrate checkout/oms/crm models to Zod schemas for better type safety
- Add order creation facade and display order schemas
- Update shopping cart facade with order completion flow
- Add comprehensive tests for shopping cart facade
- Update routing to include order confirmation page
2025-10-21 14:28:52 +02:00
Lorenz Hilpert
b96d889da5 feat(stock-info): implement request batching with BatchingResource
- Add BatchingResource base class for automatic API request batching
- Refactor StockInfoComponent to use StockInfoResource with batching
- Remove redundant StockResource provider from RewardShoppingCartItemComponent
- Update tests to match new BatchingResourceRef API
- Add comprehensive documentation for BatchingResource pattern

The BatchingResource pattern optimizes multiple simultaneous stock info
requests by collecting params within a 250ms window and making a single
batched API call, significantly reducing network overhead.
2025-10-16 14:07:17 +02:00
Nino
57302b4536 fix(reward-selection-pop-up): Fix Width 2025-10-16 13:55:40 +02:00
Nino
3a3f485146 chore(package-lock): update 2025-10-16 13:50:18 +02:00
Lorenz Hilpert
e458542b29 Merged PR 1970: feat(stock-info): implement request batching with BatchingResource - The main implementation
Related work items: #5348
2025-10-16 11:48:33 +00:00
Nino Righi
b5c8dc4776 Merged PR 1968: #5307 Entscheidungs Dialog
#5307 Entscheidungs Dialog
2025-10-16 08:56:56 +00:00
Lorenz Hilpert
596ae1da1b Merged PR 1969: Reward Shopping Cart Implementation with Navigation State Management and Shipping Address Integration
1. Reward Shopping Cart Implementation
  - New shopping cart with quantity control and availability checking
  - Responsive shopping cart item component with improved CSS styling
  - Shipping address integration in cart
  - Customer reward card and billing/shipping address components

  2. Navigation State Management Library (@isa/core/navigation)
  - New library with type-safe navigation context service (373 lines)
  - Navigation state service (287 lines) for temporary state between routes
  - Comprehensive test coverage (668 + 227 lines of tests)
  - Documentation (792 lines in README.md)
  - Replaces query parameters for passing temporary navigation context

  3. CRM Shipping Address Services
  - New ShippingAddressService with fetching and validation
  - CustomerShippingAddressResource and CustomerShippingAddressesResource
  - Zod schemas for data validation

  4. Additional Improvements
  - Enhanced searchbox accessibility with ARIA support
  - Availability data access rework for better fetching/mapping
  - Storybook tooltip variant support
  - Vitest JUnit and Cobertura reporting configuration

Related work items: #5382, #5383, #5384
2025-10-15 14:59:34 +00:00
Lorenz Hilpert
f15848d5c0 Merged PR 1967: Reward Shopping Cart Implementation 2025-10-14 16:02:18 +00:00
Lorenz Hilpert
d761704dc4 chore(deps): add integrity hashes to package-lock.json
Add resolved URLs and integrity hashes to package-lock.json entries
to ensure consistent dependency resolution and improve security.
2025-10-07 14:11:57 +02:00
Lorenz Hilpert
b1fdfb964e chore(deps): regenerate package-lock.json for build server compatibility 2025-10-07 13:59:10 +02:00
Lorenz Hilpert
9a3dd35b91 chore(deps): sync package-lock.json with package.json
Fix build server error caused by out-of-sync lock file.
Updated @types/react from 19.2.0 to 19.2.2.
2025-10-07 13:56:19 +02:00
Lorenz Hilpert
d82c133090 chore(package-lock): remove deprecated and unused dependencies 2025-10-07 13:53:21 +02:00
Lorenz Hilpert
4fc5f16721 refactor(checkout): consolidate adapters and implement unified checkout completion flow
Refactor checkout data-access layer to use centralized adapter pattern for converting between CRM and Checkout domain models. Extract business logic into dedicated helper modules and implement complete order button component for reward shopping cart.

Changes:
- Add 8 new adapters (availability, branch, customer, logistician, payer, product-number, shipping-address, shopping-cart-item) with comprehensive unit tests
- Create 3 helper modules: checkout-analysis, checkout-business-logic, checkout-data for separation of concerns
- Implement complete-order-button component with Tailwind styling for reward shopping cart
- Extend checkout models with Buyer and Payer types, update OrderOptions interface
- Add CustomerType, BuyerType, PayerType enums to common and CRM data-access layers
- Refactor customer component address selection to use new CustomerAdapter and ShippingAddressAdapter
- Update CheckoutService with refactored logic using new adapters and helpers
- Update CrmTabMetadataService to use consistent payer/shipping address ID tracking
- Add comprehensive documentation for checkout completion flow and service architecture
2025-10-07 13:50:11 +02:00
Lorenz Hilpert
d9940740ce feat(checkout): add reward shopping cart and purchase options improvements
Add reward shopping cart item component and improve purchase options handling with branch resources and enhanced models.

## Changes

### Checkout Data Access

**New Models:**
- Branch: Type alias for BranchDTO
- Product: Type alias for ProductDTO
- ShoppingCartItem: Extended with required product and loyalty fields

**New Resources:**
- BranchResource: Resource for branch data management

**Service Improvements:**
- BranchService: Added return type and Branch model import
- PurchaseOptionsFacade: Added console logging for debugging

**Schema Updates:**
- base-schemas: Added new base schema definitions

### Reward Shopping Cart Feature

**New Component:**
- reward-shopping-cart-item: Individual cart item display component
  - Component, template, and styles
  - Integrated with cart items display

**Updated Components:**
- billing-and-shipping-address-card: Updated for reward flow
- reward-shopping-cart-items: Enhanced items list display

### Product Info Shared Components

**Updated Components:**
- destination-info: Improved destination display
- product-info-redemption: Enhanced redemption info display
- stock-info: Updated stock information display

### Remission Data Access

**New Resources:**
- stock.resource: Stock data resource management
- Added resources index export

**Service Improvements:**
- RemissionStockService: Updated implementation and tests

**Schema Updates:**
- fetch-stock-in-stock: Schema refinements

### Remission Features

**Updated Components:**
- remission-list: Component updates
- remission-instock.resource: Resource improvements
- instock.resource: Enhanced stock handling

### VSCode Settings

- Updated workspace settings

## Impact

- Reward shopping cart UI ready for use
- Improved type safety with new model definitions
- Better resource management for branches and stock
- Enhanced debugging with console logging
2025-10-06 17:14:29 +02:00
Lorenz Hilpert
1e9ac30b4d refactor(checkout): separate data-access layer boundaries
Extract domain-specific operations from CheckoutService into dedicated services to respect data-access layer boundaries and improve separation of concerns.

## Changes

### New Services Created

**OrderCreationService** (oms-data-access)
- createOrdersFromCheckout(): Creates orders from completed checkout
- getLogistician(): Retrieves logistician (default '2470')
- 8 unit tests with Jest/Spectator

**AvailabilityService** (catalogue-data-access)
- validateDownloadAvailabilities(): Validates download items availability
- getDigDeliveryAvailability(): Gets DIG-Versand availability
- getB2bDeliveryAvailability(): Gets B2B-Versand availability
- 15 unit tests with Jest/Spectator

**BranchService** (remission-data-access)
- getDefaultBranch(): Gets default/current branch for user
- 5 unit tests with Angular Testing Utilities
- Note: Temporary location, will move to inventory-data-access

### CheckoutService Refactoring

**Removed cross-domain imports:**
- @generated/swagger/oms-api
- @generated/swagger/availability-api
- @generated/swagger/inventory-api

**Added domain service dependencies:**
- @isa/oms/data-access (OrderCreationService)
- @isa/catalogue/data-access (AvailabilityService)
- @isa/remission/data-access (BranchService)

**Code reduction:**
- Removed 254 lines (25.5% reduction: 996 → 742 lines)
- Deleted 8 private methods moved to domain services

### Test Updates

- Updated checkout.service.spec.ts with new service mocks
- Fixed Zod validation (buyerType/payerType literals)
- All 29 tests passing (8+15+5+11)

### AbortSignal Policy

Removed abortSignal from data-mutating operations:
- OrderCreationService.createOrdersFromCheckout() (POST)
- Kept abortSignal for read-only operations per project convention

## Impact

- Better separation of concerns
- Improved maintainability (smaller, focused services)
- Respects data-access layer boundaries
- No functional changes (100% backward compatible)
- 0 TypeScript compilation errors
2025-10-06 17:09:12 +02:00
Lorenz Hilpert
58815d6fc3 Missing Files 2025-10-02 20:29:29 +02:00
Lorenz Hilpert
eea5c23ce9 Fix unit Test 2025-10-02 20:25:50 +02:00
Lorenz Hilpert
23151474e4 Implement feature X to enhance user experience and fix bug Y in module Z 2025-10-02 15:03:41 +02:00
Lorenz Hilpert
755fc8d01a Implement code changes to enhance functionality and improve performance 2025-10-02 14:55:45 +02:00
Lorenz Hilpert
b130d5d9ff feat(checkout-data-access): add LogisticianDTO and SupplierDTO schemas for entity management 2025-10-02 14:45:32 +02:00
Lorenz Hilpert
500178e6f2 feat(schemas): add LabelDTO and BranchDTO schemas for entity management 2025-10-02 10:50:44 +02:00
Lorenz Hilpert
827828aee2 bugfix(auth): enhance authentication flow and error handling
- Ensure access token is present during initialization.
- Improve error logging for identity claims validation.
- Update dependencies for better compatibility.
2025-10-01 14:52:10 +02:00
Lorenz Hilpert
47a051c214 refactor(tabs): simplify tab navigation service and add URL blacklist
Removed unnecessary logging effects and improved tab navigation
service by implementing a URL blacklist to prevent cluttering
the navigation history with specific routes. Added constants
for better management of excluded URLs.
2025-09-30 20:49:19 +02:00
Nino
c767c60d31 refactor(lib-checkout,lib-crm): replace SelectedCustomerFacade with CrmTabMetadataService
Remove the redundant SelectedCustomerFacade which was just a thin wrapper
around CrmTabMetadataService. Update all consumers to use CrmTabMetadataService
directly for better consistency and reduced indirection.

Changes:
- Remove SelectedCustomerFacade and its exports
- Update reward catalog components to use SelectedCustomerBonusCardsResource
- Replace local resource factories with global resources
- Update purchase options modal and customer details components
- Simplify reward action component logic and improve button state handling

Ref: #5202, #5263, #5358
2025-09-30 18:14:54 +02:00
Lorenz Hilpert
37840b1565 Merged PR 1962: Reward Shopping Cart
Related work items: #5305, #5356, #5357, #5359
2025-09-30 14:50:01 +00:00
Nino Righi
9d57ebf376 Merged PR 1961: feat(checkout-reward): implement reward catalog customer integration and purc...
feat(checkout-reward): implement reward catalog customer integration and purchase flow

- Add customer card resource and display in reward header with reset functionality
- Implement shopping cart creation and management for reward purchases
- Add purchase options modal integration with redemption points support
- Extract route helper for customer navigation with proper query params
- Update checkout metadata service constants with proper namespacing
- Add reward context initialization for tab metadata
- Improve component styling and layout for reward action buttons
- Fix customer facade method signature to require AbortSignal parameter

The reward catalog now supports full customer workflow from selection
through purchase options with proper state management and navigation.

Ref: #5263, #5358
2025-09-30 13:54:31 +00:00
Lorenz Hilpert
c745f82f3a Merged PR 1960: feat: implement reward points system in purchase options
feat: implement reward points system in purchase options

- Add version tracking to application store for data migration support
- Integrate redemption points display in purchase options list items
- Update purchase options modal to handle reward point calculations
- Enhance shopping cart item component with reward point functionality
- Add reward point schemas and validation to checkout data access
- Update user storage provider with versioning support
- Improve logger configuration in customer guard
- Update package dependencies for reward functionality
- Fix ESLint errors for code quality compliance

Refs: #5352

Related work items: #5263, #5352, #5355
2025-09-29 10:18:13 +00:00
Nino
2387c60228 fix(merge-conflicts): fixes to reward-catalog 2025-09-25 18:13:41 +02:00
Nino
186e11e671 Merge branch 'develop' into feature/5202-Praemie 2025-09-25 17:52:46 +02:00
Lorenz Hilpert
39a55c9d55 Merged PR 1959: feat: enhance error handling and validation infrastructure
feat: enhance error handling and validation infrastructure

- Add comprehensive Zod error helper with German localization
- Migrate from deprecated .toPromise() to firstValueFrom()
- Enhance global error handler with ZodError support
- Implement storage features for signal stores with auto-save
- Add comprehensive test coverage for validation scenarios
- Update multiple stores with improved storage integration
- Extend tab management with enhanced navigation patterns
- Add checkout data-access barrel exports
- Update core-storage documentation with usage examples

Major improvements:
- Complete German error message translations for all Zod validation types
- Auto-save with configurable debouncing for signal stores
- Type-safe storage integration with schema validation
- Enhanced entity management with orphan cleanup
- Robust fallback strategies for validation failures

Breaking: Requires Zod validation errors to use new helper

Refs: #5345 #5353

Related work items: #5345, #5353
2025-09-25 15:49:01 +00:00
Lorenz Hilpert
f2490b3421 docs(architecture): add Architecture Decision Records (ADRs) documentation
Introduce a comprehensive guide for creating and maintaining ADRs
within the ISA-Frontend project. This includes an overview, structure,
naming conventions, and process guidelines to ensure consistent
documentation of architectural decisions.
2025-09-25 16:23:45 +02:00
Lorenz Hilpert
100cbb5020 Merged PR 1958: Refactoring Checkout: Migration von prozess-basierter zu warenkorb-basierter Architektur mit neuer Data-Access-Library und verbesserter Typsicherheit
refactor(checkout): migrate purchase options to shopping cart-based architecture
Replace processId with shoppingCartId in purchase options modal and related components
Add new checkout data-access library with facades, services, and schemas
Update PurchaseOptionsService to use new checkout facade pattern
Migrate state management from process-based to shopping cart-based approach
Update selectors and store to handle shoppingCartId instead of processId
Improve type safety with Zod schemas for checkout operations
Add proper error handling and logging throughout checkout services
Update article details and checkout review components to use new patterns
BREAKING CHANGE: Purchase options modal now requires shoppingCartId instead of processId

Related work items: #5350
2025-09-25 09:27:05 +00:00
Nino Righi
334436c737 Merged PR 1957: #5258 Prämie Landing
#5258 Prämie Landing
- feat(crm-data-access): improve error handling and encapsulation in CRM services
- feat(reward): separate reward selection from checkout flow and restructure catalog
- Merge branch 'feature/5202-Praemie' into feature/5263-Praemie-Item-List-Und-Lieferung-Auswaehlen
- feat(libs-checkout): implement reward catalog with list display and pagination
- feat(checkout): add reward selection and action components for catalog
- feat(lib-checkout, lib-catalogue, lib-shared): implement reward catalog pagination with enhanced filtering
2025-09-24 18:31:35 +00:00
Lorenz Hilpert
d9ccf68314 feat(tabs): add helper functions for tab metadata management 2025-09-23 21:01:00 +02:00
Lorenz Hilpert
243b83bd73 Merged PR 1956: Destination Info Component
Related work items: #5347
2025-09-23 08:07:42 +00:00
Lorenz Hilpert
8391d0bd18 refactor(notifications): update remission path logic to use Date.now() 2025-09-19 11:01:01 +02:00
Lorenz Hilpert
24a9ddc09c Merge branch 'release/4.1' into develop 2025-09-19 10:31:50 +02:00
Lorenz Hilpert
6ab839a529 Merged PR 1954: feat: Enhance product info components and add redemption points feature...
Related work items: #5346
2025-09-18 13:10:07 +00:00
Nino
6c86dfbbad Merge branch 'develop' into feature/5202-Praemie 2025-09-18 11:38:00 +02:00
Lorenz Hilpert
b792febcb0 Merged PR 1955: fix(tabs): correct singleton tabs interaction with new tab areas
fix(tabs): correct singleton tabs interaction with new tab areas

    - Fix tab name persistence when switching from Sortiment/Wareneingang to Retoure/Remission
    - Prevent duplicate tab creation when clicking on new areas
    - Ensure correct tab naming for Retoure and Remission areas
    - Update side menu navigation to use consistent tab ID generation
    - Add processResolverFn for backwards compatibility
    - Simplify process bar navigation logic

    Refs: #5345

Related work items: #5345
2025-09-18 07:48:45 +00:00
Nino Righi
0617bff315 Merged PR 1953: feat(reward-customer-card): improve styling and user experience
feat(reward-customer-card): improve styling and user experience

Replace basic HTML elements with proper UI components and apply
consistent design system styling. Update layout spacing and add
proper typography classes for better visual hierarchy.

Changes:
- Replace button with TextButtonComponent for consistent styling
- Add proper typography classes (isa-text-body-1-regular/bold)
- Improve layout spacing and alignment
- Add text color for better contrast
- Add null safety operators for card properties

Ref: #5262
2025-09-17 17:47:54 +00:00
Nino
0d58a5288e Merge branch 'develop' into feature/5202-Praemie 2025-09-17 16:41:42 +02:00
Lorenz Hilpert
384952413b Merged PR 1943: Implementation - Backwards Compatibility Process -> Tabs
Related work items: #5328
2025-09-17 13:56:35 +00:00
Nino
e6dc08007b Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-09-17 12:23:59 +02:00
Nino
54aa18a3a3 chore(Dockerfile): Changed npm install to npm ci 2025-09-17 12:18:58 +02:00
Nino
d70c95743c feature(reward-header): Added Loading to GET Bonuscard 2025-09-17 12:10:25 +02:00
Nino
9c8c42da69 chore(swagger-oms, swagger-checkout): Update Swagger and resolved breaking changes 2025-09-17 12:09:51 +02:00
Lorenz Hilpert
afc6351509 chore: disable markdown format on save in VSCode settings
Added formatOnSave: false for markdown files to prevent automatic formatting that may conflict with document structure preferences.
2025-09-17 11:50:03 +02:00
Nino
2fc83cd8f7 feat(reward-crm, crm-data-acces): implement customer card display and selection system
Add comprehensive customer card functionality to the reward catalog:
- Create new CRM data access layer with customer cards facade and services
- Implement customer card resource for fetching bonus card information
- Add reward customer card component to display customer details and points
- Update reward header to conditionally show customer card or start card
- Fix customer selection persistence by moving facade call outside conditional
- Add proper type definitions and models for bonus card information
- Export new facades and models through updated index files

The system now properly handles customer selection state across tabs
and displays relevant customer information including name and total points
when a customer with an active primary bonus card is selected.

Ref: #5262
2025-09-16 18:37:38 +02:00
Nino Righi
62e586cfda Merged PR 1951: fix(remission-list): ensure list reload after search dialog closes
fix(remission-list): ensure list reload after search dialog closes

Move reloadListAndReturnData() call outside the conditional block
to guarantee data refresh regardless of dialog result. Previously,
the list would only reload when items were selected, causing stale
data when the dialog was cancelled or closed without selection.

Ref: #5342
2025-09-16 12:41:05 +00:00
Nino
9f775e01e2 Merge branch 'develop' into feature/5258-Praemie-Landing 2025-09-16 12:00:50 +02:00
Lorenz Hilpert
c5d057e3a7 Merged PR 1950: 5343-Filter-NumberRange
Related work items: #5343
2025-09-16 09:54:29 +00:00
Nino
e5c09c030c feat(reward): implement reward catalog with customer selection
Add comprehensive reward catalog functionality including:
- New reward catalog component with header switching between start card and customer card
- Customer selection integration with tab metadata service
- Reward checkout service with query settings fetching
- Customer search integration for reward context with proper filtering
- Tab metadata support for storing selected customer IDs
- Navigation improvements for reward workflow in customer details

The implementation includes proper error handling, logging, and follows
the established architectural patterns with facades and services.

Ref: #5262
2025-09-15 17:42:57 +02:00
Nino Righi
304f8a64e5 Merged PR 1949: feat(isa-app): migrate remission navigation to tab-based routing system
feat(isa-app): migrate remission navigation to tab-based routing system

Replace hardcoded /filiale/remission routes with dynamic tab-based paths
using TabService. This enables proper process isolation and multi-tab
support for remission workflows.

Changes include:
- Update notification component to use dynamic remission paths
- Migrate goods-in remission preview to tab-based navigation
- Refactor side menu to use new remission routing structure
- Remove legacy remission route from app routing module
- Add linkedSignal for reactive path generation

BREAKING CHANGE: Direct navigation to /filiale/remission is no longer supported.
Users must access remission through the new tab-based system.

Ref: #5323, #5324, #5325
2025-09-15 13:11:47 +00:00
Nino
0269473a18 feat(common/data-access): enhance error handling with ResponseArgsError operator
Add catchResponseArgsErrorPipe operator to transform HTTP errors into structured
ResponseArgsError instances. This provides consistent error handling across
data access services by automatically converting HttpErrorResponse objects
with ResponseArgs payloads into typed ResponseArgsError instances.

Changes include:
- New catchResponseArgsErrorPipe operator for standardized error transformation
- Enhanced DataAccessError with proper prototype chain setup
- Integration in CatalougeSearchService for loyalty items search
- Export operator from common data-access module

This improves error consistency and debugging capabilities across the application
by ensuring all API errors follow the same structure and typing.

Refs: #5258
2025-09-15 14:04:34 +02:00
Nino Righi
707802ce0d Merged PR 1944: feat(checkout-reward): #5258
- feat(loyalty): add loyalty program feature with list and navigation
- fix(isa-app-side-menu): Update customer expand to signals
- feat(catalogue-data-access): add searchLoyaltyItems method with comprehensive test coverage
- feat(project-structure): migrate loyalty system to reward-based architecture
- feat(checkout-reward): add query settings resolver and catalog resource
- feat(swagger-cat-search-api): Swagger Update
- feat(checkout-reward): update API call and prepare filter integration

Refs: #5258
2025-09-12 10:44:42 +00:00
Nino Righi
c672ae4012 Merged PR 1948: fix(remission-error): simplify error handling in remission components
fix(remission-error): simplify error handling in remission components

Refactor error handling to use consistent error message extraction pattern.
Remove dependency on ResponseArgsError type and streamline error processing
in both RemissionListComponent and RemissionReturnReceiptDetailsItemComponent.
Extract error handling logic into separate methods for better maintainability.

Ref: #5331
2025-09-12 10:15:13 +00:00
Lorenz Hilpert
e00de7598d feat(crm): add crm-data-access library with initial component and tests
- Introduced the crm-data-access library with a basic component.
- Added necessary configuration files, including ESLint and TypeScript settings.
- Implemented unit tests for the component to ensure functionality.

Refs: #5254
2025-09-11 20:13:56 +02:00
Nino Righi
fd693a4beb Merged PR 1947: #5331 Set correct Prototype
#5331 Set correct Prototype
2025-09-11 15:42:55 +00:00
Nino Righi
2c70339f23 Merged PR 1945: fix(remission-list): auto-select single search result when remission started
fix(remission-list): auto-select single search result when remission started

Enhance search result handling to automatically select items when only
one result is found during an active remission. This improves user
workflow by eliminating the extra click required to select obvious
single results.

- Add preselectRemissionItem method to handle automatic selection
- Update emptySearchResultEffect to handle single hit scenario
- Clear selected items at start of effect to prevent stale selections
- Only auto-select if item has available stock and can be remitted
- Improve effect documentation with detailed behavior explanation

Ref: #5338
2025-09-11 14:21:19 +00:00
Nino Righi
59f0cc7d43 Merged PR 1946: fix(remission-list, remission-return-receipt-details, libs-dialog): improve error handling with dedicated error dialog
fix(remission-list, remission-return-receipt-details, libs-dialog): improve error handling with dedicated error dialog

- Add RemissionResponseArgsErrorMessage constants for standardized error messages
- Create FeedbackErrorDialogComponent for consistent error display across the app
- Implement enhanced error handling in RemissionListComponent.handleRemitItemsError()
- Update RemissionReturnReceiptDetailsItemComponent to use new error dialog pattern
- Add injectFeedbackErrorDialog convenience function for easy error dialog injection
- Include comprehensive unit tests for new dialog component
- Replace generic error handling with specific ResponseArgsError handling
- Clear remission state when "AlreadyCompleted" error occurs

The new error dialog provides a standardized way to display backend error
messages to users with consistent styling and behavior. Error handling now
properly differentiates between different error types and takes appropriate
actions like clearing state for completed remissions.

Ref: #5331
2025-09-11 14:06:14 +00:00
Nino Righi
0ca58fe1bf Merged PR 1942: feat(remission-list, search-item-to-remit-dialog): simplify dialog flow by re...
feat(remission-list, search-item-to-remit-dialog): simplify dialog flow by removing conditional views

Refactor the search item to remit dialog to use a dedicated quantity and reason
dialog instead of conditional views within the main dialog. This change improves
user experience by providing clearer navigation and better separation of concerns.

Key changes:
- Remove item signal and conditional template logic from SearchItemToRemitDialogComponent
- Create new SelectRemiQuantityAndReasonDialogComponent for quantity/reason selection
- Update SearchItemToRemitComponent to open quantity dialog instead of setting item state
- Simplify dialog data interface by removing isDepartment property
- Improve stock filtering logic to show only items with available stock
- Fix import path for QuantityAndReason interface

This refactor eliminates complex state management within the dialog and provides
a more intuitive user flow with dedicated dialogs for each step.

Ref: #5326
2025-09-10 14:18:17 +00:00
Lorenz Hilpert
516b7748c2 chore: update .gitignore and package-lock.json to include new files 2025-09-09 11:19:04 +02:00
Nino
8cf80a60a0 Merge branch 'develop' into release/4.1 2025-09-05 08:19:36 +02:00
Nino Righi
cffa7721bc Merged PR 1941: fix(oms-data-access): adjust tolino return eligibility logic for display damage
fix(oms-data-access): adjust tolino return eligibility logic for display damage

Update tolino return eligibility to check for display damage and refine
date range conditions. Returns are now only eligible if the receipt is
between 6-24 months old, the item was received damaged, and the display
is not damaged.

Ref: #5286
2025-09-04 15:12:44 +00:00
Nino Righi
066ab5d5be Merged PR 1940: feat(old-ui-tooltip): add pointer-events-auto to tooltip panel
feat(old-ui-tooltip): add pointer-events-auto to tooltip panel

Enable mouse interactions with tooltip content by adding pointer-events-auto
class to .ui-tooltip-panel. This allows users to interact with clickable
elements inside tooltips while maintaining proper tooltip positioning.

Ref: #5244
2025-09-04 14:11:49 +00:00
Nino Righi
3bbf79a3c3 Merged PR 1939: feat(remission-list, empty-state): add comprehensive empty state handling wit...
feat(remission-list, empty-state): add comprehensive empty state handling with new appearance types

Add dedicated empty state component for remission list with smart prioritization logic:
- Department selection required state (highest priority)
- All done state when list is processed and empty
- No search results state for filtered content

Enhance ui-empty-state component with new appearance types:
- AllDone: Trophy cup icon with animated steam effects
- SelectAction: Hand pointer with dropdown interface element
- Improved visual hierarchy and spacing for all states

Update remission list to use new empty state component with proper state detection
including search term validation, department filter checking, and reload detection.

Ref: #5317, #5290
2025-09-04 14:11:19 +00:00
Nino Righi
357485e32f Merged PR 1938: #5294 Small Adjustments
#5294 Small Adjustments
2025-09-04 14:10:55 +00:00
Nino Righi
39984342a6 Merged PR 1937: fix(ui-input-controls-dropdown): prevent multiple dropdowns from being open s...
fix(ui-input-controls-dropdown): prevent multiple dropdowns from being open simultaneously

Add DropdownService to manage global dropdown state and ensure only one
dropdown is open at any time. When a new dropdown opens, any previously
opened dropdown is automatically closed, improving user experience and
preventing UI conflicts.

Ref: #5298
2025-09-03 13:19:10 +00:00
Nino Righi
c52f18e979 Merged PR 1936: fix(remission): filter search results by stock availability and display stock...
fix(remission): filter search results by stock availability and display stock info

- Add stock resource integration to search item component
- Filter search results to only show items with available stock (> 0)
- Display current stock information in search result items
- Implement calculateAvailableStock utility for accurate stock calculation
- Add inStock input parameter to SearchItemToRemitComponent
- Create reusable instock.resource for stock data fetching

The search now only displays items that are actually available for remission,
improving user experience by preventing selection of out-of-stock items.

Ref: #5318
2025-09-03 13:18:47 +00:00
Nino Righi
e58ec93087 Merged PR 1935: fix(remission-list, remission-data-access): add impediment comment and remain...
fix(remission-list, remission-data-access): add impediment comment and remaining quantity handling for return suggestions

Add support for impedimentComment and remainingQuantity fields when adding return suggestion items. When quantity is less than available stock, automatically set impedimentComment to 'Restmenge' and calculate remainingQuantity as the difference between available stock and remitted quantity.

Changes:
- Add impedimentComment and remainingQuantity to AddReturnSuggestionItemSchema
- Update RemissionReturnReceiptService to handle new fields in addReturnSuggestionItem method
- Enhance RemissionListComponent to calculate and pass impediment data when remitting items
- Fix quantity calculation logic to properly handle partial remissions

Ref: #5322
2025-09-03 13:18:23 +00:00
Nino Righi
4e6204817d Merged PR 1934: feature(remission-list): temporarily disable remission-processed-hint component
feature(remission-list): temporarily disable remission-processed-hint component

Comment out remi-remission-processed-hint component in remission list template
and add TODO comments referencing the need to adjust code once ticket #5215
is implemented. This temporary fix prevents issues with the hint component
until the underlying changes are completed.

Ref: #5136
2025-09-03 13:16:35 +00:00
Nino Righi
c41355bcdf Merged PR 1933: fix(remission-data-access): replace hardcoded values with dynamic helper func...
fix(remission-data-access): replace hardcoded values with dynamic helper functions

Replace hardcoded assortment and retail price values in RemissionSearchService
with proper helper functions. Add getAssortmentFromItem and getRetailPriceFromItem
helpers to dynamically extract values from Item objects instead of using
static fallbacks.

Also fix potential undefined reference errors in remission list resource
by adding proper null checks for response merging operations.

Ref: #5321
2025-09-03 13:15:57 +00:00
Nino Righi
fa8e601660 Merged PR 1932: feat(remission): ensure package assignment before completing return receipts
feat(remission): ensure package assignment before completing return receipts

Add validation to check if a package is assigned to a return receipt before
allowing completion. When no package is assigned, automatically open the
package assignment dialog to let users scan/input a package number.

- Add hasAssignedPackage input to complete component and pass from parent
- Integrate RemissionStartService.assignPackage() in completion flow
- Add assignPackageOnly flag to conditionally hide step counter in dialog
- Update dialog data structure to support direct package assignment mode
- Enhance test coverage for new assignment scenarios

This ensures all completed return receipts have proper package tracking
and improves the user workflow by guiding them through required steps.

Ref: #5289
2025-09-03 13:15:32 +00:00
Nino Righi
708ec01704 Merged PR 1931: fix(remission-quantity-and-reason-item)
fix(remission-quantity-and-reason-item)
Ref: #5292
2025-09-02 15:20:44 +00:00
Nino Righi
332699ca74 Merged PR 1930: fix(remission-quantity-and-reason-item): correct quantity input binding and d...
fix(remission-quantity-and-reason-item): correct quantity input binding and default value

Fix quantity input field binding to use computed quantity signal instead of
direct quantityAndReason().quantity, ensuring proper display of undefined
values as empty field. Update initial quantity default from 1 to 0 to
prevent pre-filled values when creating new quantity/reason items.

Also improves placeholder text color contrast by changing from neutral-200
to neutral-500 for better accessibility.

Ref: #5292
2025-09-02 15:20:14 +00:00
Nino
3b0a63a53a fix(remission-data-access, remission-list, remission-add-item-flow): enforce mandatory list type for add-item flow
Remove addToDepartmentList method and ensure items added via search dialog
are always processed as mandatory remission items (ReturnItem) instead of
department suggestions (ReturnSuggestion). This prevents items from being
incorrectly added to department overflow lists when remission is already
started, maintaining data consistency in the WBS system.

Changes:
- Remove addToDepartmentList method from RemissionSearchService
- Update remitItems to use mandatory list type for add-item flow
- Simplify addToRemiList to only use mandatory remission endpoint
- Add addItemFlow parameter to control remission list type behavior

Refs: #4768, #5273, #5280
2025-09-02 14:40:26 +02:00
Nino Righi
327fdc745d Merged PR 1929: fix(remission-quantity-reason): correct dropdown placeholder and remove hardc...
fix(remission-quantity-reason): correct dropdown placeholder and remove hardcoded option

Change dropdown placeholder from "Rückgabegrund" to "Remigrund" for consistency
with application terminology. Remove hardcoded test option from reason dropdown
that was polluting the dropdown list. Extract initial item object to class
property for better maintainability and reusability.

Ref: #5293, #5299
2025-09-01 16:24:54 +00:00
Nino Righi
297ec9100d Merged PR 1928: fix(remission-filter-label): improve filter button label display and default text
fix(remission-filter-label): improve filter button label display and default text

Add default placeholder text "Abteilung auswählen" when no departments
are selected and implement dynamic label width to prevent text truncation.
The label now expands to full width when displaying placeholder text
and constrains to 8rem when showing selected values.

Ref: #5303
2025-09-01 16:24:23 +00:00
Nino Righi
298ab1acbe Merged PR 1927: fix(remission-data-access): remove automatic date defaulting in fetchRemissio...
fix(remission-data-access): remove automatic date defaulting in fetchRemissionReturnReceipts

Remove the automatic default of 7 days ago when no start date is provided
to the fetchRemissionReturnReceipts method. The service now passes the
start parameter directly to the API without modification, allowing the
API or schema to handle date defaults as intended.

This change improves the separation of concerns by moving date handling
logic out of the service layer and updates the corresponding test to
handle both defined and undefined start date scenarios.

Ref: #5256
2025-09-01 16:24:06 +00:00
Nino Righi
fe77a0ea8b Merged PR 1926: feat(libs-ui-dialog-feedback-dialog): add auto-close functionality with confi...
feat(libs-ui-dialog-feedback-dialog): add auto-close functionality with configurable delay

Implement automatic dialog closure after a configurable delay period.
The dialog now auto-closes by default after 1500ms, with options to
disable auto-close or customize the delay duration through the
FeedbackDialogData interface.

- Add autoClose and autoCloseDelay properties to FeedbackDialogData
- Implement auto-close logic using RxJS asapScheduler in constructor
- Add comprehensive test coverage for auto-close behavior
- Update JSDoc documentation for better clarity

Ref: #5297
2025-09-01 15:01:21 +00:00
Nino Righi
48f588f53b Merged PR 1925: fix(remission-shared-search-item-to-remit-dialog): display context-aware feed...
fix(remission-shared-search-item-to-remit-dialog): display context-aware feedback message

Update feedback dialog message to reflect the current remission state.
Shows "Wurde zum Warenbegleitschein hinzugefügt" when remission is already
started, otherwise shows "Wurde zur Remi Liste hinzugefügt".

This provides users with more accurate feedback about where their items
were added based on the current workflow state.

Ref: #5300
2025-09-01 15:00:54 +00:00
Nino Righi
7f4af304ac Merged PR 1924: feat(isa-app-shell): improve navigation link targeting for remission sub-routes
feat(isa-app-shell): improve navigation link targeting for remission sub-routes

Replace generic routerLinkActive with specific regex patterns for remission
navigation items to ensure accurate active state highlighting. This change:

- Uses sharedRegexRouterLinkActive for "Remission" sub-item to match specific routes
- Uses sharedRegexRouterLinkActive for "Warenbegleitscheine" sub-item
- Replaces broad routerLinkActive with precise regex patterns
- Ensures navigation accurately reflects current route state for remission workflows

The regex patterns specifically target `/[tabId]/remission/(mandatory|department)`
and `/[tabId]/remission/return-receipt` routes for better user experience.

Ref: #5304
2025-09-01 15:00:22 +00:00
Nino Righi
643b2b0e60 Merged PR 1923: feat(remission): remove Koerperlos remission list type
feat(remission): remove Koerperlos remission list type

Remove the 'Körperlose Remi' option from remission list types as it's no longer needed. This simplifies the remission type selection by:

- Removing Koerperlos from RemissionListType constant
- Eliminating disabled state logic in dropdown component
- Removing special handling in changeRemissionType method
- Fixing label text from 'Abteilungen' to 'Abteilung' for consistency

The dropdown now only shows the two active remission types: Pflichtremission and Abteilungsremission.

Ref: #5303
2025-09-01 14:59:57 +00:00
Nino Righi
cd1ff5f277 Merged PR 1922: feat(libs-shared-product-format): remove truncate class from format detail text
feat(libs-shared-product-format): remove truncate class from format detail text

Remove the 'truncate' class from the span element containing formatDetail()
to allow full text display without text clipping. This improves readability
when product format details contain longer descriptions.

Ref: #5301
2025-09-01 14:59:28 +00:00
Nino Righi
46c70cae3e Merged PR 1921: feat(remission-list-resource): remove client-side date sorting in favor of ba...
feat(remission-list-resource): remove client-side date sorting in favor of backend sorting

Remove commented-out date sorting logic from sortResponseResult function.
The sorting by creation date for Pflichtremission and by SORT number
for Abteilungsremission is now handled entirely by the backend,
eliminating the need for client-side date sorting operations.

This change improves performance by reducing client-side processing
and ensures consistent sorting behavior across the application.

Ref: #5295
2025-09-01 14:59:07 +00:00
Nino
2cb1f9ec99 chore(azure-pipelines): Version bump 4.1 2025-08-14 17:09:13 +02:00
Nino
d2dcf638e3 Merge tag '4.0-hotfix-release' 2025-08-14 16:47:48 +02:00
Nino
a4241cbd7a Merge branch 'release/4.0' 2025-08-14 16:40:46 +02:00
Nino Righi
dd3705f8bc Merged PR 1920: feat(remission-list): add navigation to default list and clear input on reload
feat(remission-list): add navigation to default list and clear input on reload

Add Router injection and injectTabId for navigation functionality.
Implement navigateToDefaultRemissionList method to redirect users
to the default remission list using the current activated tab ID.
Clear query input on reload trigger to prevent stale search results
from persisting across navigation.

Enhance emptySearchResultEffect to handle department list navigation
when no items are found and remission hasn't started yet.

Ref: #5273
2025-08-14 14:06:20 +00:00
Nino Righi
514715589b Merged PR 1919: feat(remission): add impediment management and UI enhancements for remission...
feat(remission): add impediment management and UI enhancements for remission list

Implement comprehensive impediment handling for return items and suggestions
with enhanced user interface components and improved data access layer.

Key additions:
- Add impediment update schema and validation for return items
- Implement RemissionReturnReceiptService with full CRUD operations
- Create RemissionListItemComponent with actions and selection capabilities
- Add ProductInfoComponent with responsive layout and labeling
- Enhance UI Dialog system with improved injection patterns and testing
- Add comprehensive test coverage for all new components and services
- Implement proper data attributes for E2E testing support

Technical improvements:
- Follow SOLID principles with clear separation of concerns
- Use OnPush change detection strategy for optimal performance
- Implement proper TypeScript typing with Zod schema validation
- Add comprehensive JSDoc documentation for all public APIs
- Use modern Angular signals and computed properties for state management

Refs: #5275, #5038
2025-08-14 14:05:01 +00:00
Nino Righi
0740273dbc Merged PR 1917: feat(remission-data-access): enhance stock calculation to handle zero predefi...
feat(remission-data-access): enhance stock calculation to handle zero predefined quantities

Improve calculateStockToRemit and getStockToRemit functions to properly distinguish
between undefined and zero predefined return quantities. When predefinedReturnQuantity
is undefined, the system now falls back to approximation calculation (availableStock
minus remainingQuantityInStock). When predefinedReturnQuantity is explicitly set to 0,
the system respects this backend-calculated value.

Add comprehensive test coverage for edge cases including:
- Zero predefined return quantities for both Pflicht and Abteilung types
- Negative approximation calculations (clamped to 0)
- Null/undefined remainingQuantityInStock handling
- Missing returnItem scenarios for Abteilung type

Ref: #5280
2025-08-13 13:39:18 +00:00
Nino Righi
bbb9c5d39c Merged PR 1918: feat(libs-ui-label, remission-shared-product, storybook): add UI label compon...
feat(libs-ui-label, remission-shared-product, storybook): add UI label component for remission tags

- Create new @isa/ui/label library with primary/secondary appearances
- Integrate label component into ProductInfoComponent to display remission tags (Prio 1, Prio 2, Pflicht)
- Add conditional rendering based on RemissionItemTags enum with proper appearance mapping
- Include comprehensive unit tests using Vitest and Angular Testing Utilities
- Add Storybook stories for both label component and updated product info component
- Import label styles in main tailwind.scss

Ref: #5268
2025-08-13 13:38:13 +00:00
Nino Righi
f0bd957a07 Merged PR 1914: Rückmerge Release/4.0 -> Develop
Rückmerge Release/4.0 -> Develop
2025-08-13 09:52:15 +00:00
Nino Righi
e4f289c67d Merged PR 1915: fix(remission-list-resource): only apply default sorting when no orderBy spec...
fix(remission-list-resource): only apply default sorting when no orderBy specified

Replace default sort mechanism to respect explicit orderBy from QueryToken.
Previously, the resource always applied manual sorting regardless of whether
explicit ordering was requested, causing conflicts with user-defined sorting.

Now checks if queryToken.orderBy exists and has items before applying the
default sort behavior (manually-added items first, then by created date).

Refs: #5276
2025-08-13 09:51:25 +00:00
Nino Righi
2af16d92ea Merged PR 1916: fix(remission-helpers, remission-list-item): fix predefinedReturnQuantity han...
fix(remission-helpers, remission-list-item): fix predefinedReturnQuantity handling and enhance stock validation

Fix issue where predefinedReturnQuantity value of 0 was being treated differently
from undefined in mandatory remission (Pflichtremission). Now both 0 and undefined
are handled consistently by changing the initial value to undefined and using
truthy check instead of strict undefined comparison.

Additionally enhance hasStockToRemit validation by requiring both availableStock
and stockToRemit to be greater than 0, preventing invalid remission states when
no stock is available.

Changes:
- Change predefinedReturnQuantity initial value from 0 to undefined in getStockToRemit
- Remove nullish coalescing operator that forced 0 default for predefinedReturnQuantity
- Update calculateStockToRemit to use truthy check (!predefinedReturnQuantity)
  instead of strict undefined comparison
- Enhance hasStockToRemit computed property to validate both availableStock > 0
  and stockToRemit > 0
- Add comprehensive test coverage for all hasStockToRemit edge cases including
  negative values and zero combinations

Ref: #5269
2025-08-13 09:50:18 +00:00
Nino Righi
99e8e7cfe0 Merged PR 1913: feat(remission): refactor return receipt details and extract shared actions
feat(remission): refactor return receipt details and extract shared actions

Refactor remission return receipt details to use return-based data flow
instead of individual receipt fetching. Extract reusable action components
for better code organization and consistency.

- Remove deprecated fetchRemissionReturnReceipt method and schema
- Add helper functions for extracting data from return objects
- Replace receipt-specific components with return-based equivalents
- Create shared return-receipt-actions library with reusable components
- Update components to use modern Angular patterns (signals, computed)
- Improve data flow consistency across remission features
- Add comprehensive test coverage for new components
- Update eager loading support in fetch return functionality

The new architecture provides better data consistency and reduces
code duplication by centralizing receipt actions and data extraction
logic into reusable components.

Refs: #5242, #5138, #5232, #5241
2025-08-12 13:32:57 +00:00
Nino Righi
ac728f2dd9 Merged PR 1912: hotfix(isa-app-ui/shared-searchbox): improve component initialization and met...
hotfix(isa-app-ui/shared-searchbox): improve component initialization and method safety

Enhance searchbox component reliability by addressing initialization
issues and improving method safety across both shared and ui implementations.

Key changes:
- Fix potential null reference errors in cancel search functionality
- Improve method parameter typing with explicit defaults
- Add proper initialization for ControlValueAccessor callbacks
- Enhance component property initialization with explicit types
- Add hintCleared output event for better hint management

These changes resolve runtime errors and improve type safety
for the searchbox components used throughout the application.

Refs: #5245
2025-08-07 17:55:25 +00:00
Nino
2e012a124a chore(package-lock): Update Package Lock JSON 2025-08-07 14:21:57 +02:00
Nino Righi
d22e320294 Merged PR 1910: feat(remission-list, ui-tooltip): add info tooltip with performance optimization
feat(remission-list, ui-tooltip): add info tooltip with performance optimization

Add tooltip to department capacity info button with enhanced trigger management.
Optimize department list fetching to only load when search input or department
filter is active, improving initial load performance.

- Add tooltip directive to info button showing capacity details
- Implement conditional department list fetching based on input/filter presence
- Enhance tooltip directive with improved trigger management and positioning
- Update tooltip component to use modern Angular control flow syntax
- Add proper show/hide logic with trigger-specific behavior

Refs: #5255
2025-08-06 16:02:27 +00:00
Nino Righi
a0f24aac17 Merged PR 1909: fix(remission-data-access, remission-product-stock-info): improve stock infor...
fix(remission-data-access, remission-product-stock-info): improve stock information display and data handling

Enhance product stock info component with proper loading states.

- Add stockFetching input to ProductStockInfoComponent for loading states
- Update remission list components to properly handle stock fetching state
- Enhance type safety and documentation for better maintainability

The RemissionSearchService now provides clear documentation for all
methods including fetchList, fetchQuerySettings, and capacity fetching
operations. The ProductStockInfoComponent now properly displays loading
states during stock data retrieval.

Ref: #5243
2025-08-06 16:01:10 +00:00
Nino Righi
7ae484fc83 Merged PR 1908: feat(remission-shared-dialog): add dynamic dropdown label for return reason s...
feat(remission-shared-dialog): add dynamic dropdown label for return reason selection

Implement computed property to show selected reason value or default placeholder
text in the dropdown label. This provides better UX by displaying the current
selection instead of a static label.

- Add dropdownLabel computed property that returns selected reason or fallback
- Update template to use dynamic label binding instead of hardcoded text
- Enhances user feedback when reason is selected vs. when no selection is made

Ref: #5253
2025-08-06 15:58:44 +00:00
Nino Righi
0dcb31973f Merged PR 1907: feat(remission-list-item, ui-dialog): enhance quantity dialog with original v...
feat(remission-list-item, ui-dialog): enhance quantity dialog with original value display

Add support for displaying original remission quantity in the quantity change dialog.
This provides better context for users when modifying remission quantities by showing
both the current input and the original calculated value.

Changes:
- Add subMessage and subMessageValue inputs to NumberInputComponent and dialog interfaces
- Update RemissionListItemActionsComponent to pass original quantity context to dialog
- Modify RemissionListItemComponent to track quantity differences and pass stockToRemit value
- Add selectedQuantityDiffersFromStockToRemit computed property for UI state management
- Update component templates to display contextual information in quantity dialogs

Ref: #5204
2025-08-06 15:58:10 +00:00
Nino Righi
c2f393d249 Merged PR 1911: hotfix(isa-app-store, core-storage): prevent caching of erroneous user state
hotfix(isa-app-store, core-storage): prevent caching of erroneous user state

Remove shareReplay(1) operator from user state observable to ensure
fresh state retrieval on each request. This prevents the system from
retaining and reusing failed or invalid state data across multiple
operations.

The current implementation now makes two API calls (GET + POST) per
set operation to guarantee the latest state is always used, trading
performance for reliability in error scenarios.

Refs: #5270, #5249
2025-08-06 15:47:49 +00:00
Nino Righi
2dbf7dda37 Merged PR 1906: feat(remission-data-access, remission-start-dialog): refactor remission workf...
feat(remission-data-access, remission-start-dialog): refactor remission workflow to use createRemission API

Replace the startRemission method with separate createRemission and assignPackage operations.
The new implementation improves error handling and provides better separation of concerns
between return creation and package assignment steps.

Key changes:
- Add CreateRemission interface to models with support for validation error properties
- Replace startRemission with createRemission method that handles return and receipt creation
- Update service methods to return ResponseArgs objects with proper error handling
- Enhance dialog components with reactive error handling using Angular effects
- Add comprehensive server-side validation error display in form controls
- Separate package assignment into dedicated step with individual loading states
- Improve test coverage with proper mocking of new service methods

The refactored workflow provides better user feedback for validation errors and maintains
the existing two-step process while improving maintainability and error handling.

Ref: #5251
2025-08-05 10:42:45 +00:00
Nino Righi
cce15a2137 Merged PR 1905: feat(remission-data-access, remission-list-item): add remission item source t...
feat(remission-data-access, remission-list-item): add remission item source tracking and delete functionality

Add comprehensive remission item source management with the ability to delete
manually added items from return receipts. Introduces new RemissionItemSource
model to track item origins and refactors remission list item components for
better action management.

Key changes:
- Add RemissionItemSource model with 'manually-added' and 'DisposalListModule' types
- Extend ReturnItem and ReturnSuggestion interfaces with source property
- Implement deleteReturnItem service method with comprehensive error handling
- Create RemissionListItemActionsComponent for managing item-specific actions
- Add conditional display logic for delete buttons based on item source
- Refactor RemissionListItemSelectComponent with hasStockToRemit input validation
- Add deleteRemissionListItemInProgress state management across components
- Include comprehensive test coverage for new delete functionality

This enhancement enables users to remove manually added items from remission
lists while preserving system-generated entries, improving workflow flexibility
and data integrity.

Ref: 5259
2025-08-04 11:31:05 +00:00
Nino Righi
14a5a67a1e Merged PR 1904: feat(utils-ean-validation, remission-list): add EAN validation library and im...
feat(utils-ean-validation, remission-list): add EAN validation library and implement exact search

Create new EAN validation utility library with validator function and isEan helper.
Implement exact search functionality for remission lists that bypasses filters
when scanning EAN codes or performing exact searches.

Changes:
- Add new utils/ean-validation library with EAN regex validation
- Export eanValidator for Angular reactive forms integration
- Export isEan utility function for EAN validation checks
- Configure library with Vitest for testing
- Update remission list resource to support exact search mode
- Clear filters and orderBy when performing EAN-based searches
- Add data attributes to product info component for E2E testing

Ref: #5128
2025-08-01 13:22:41 +00:00
Nino Righi
d7d535c10d Merged PR 1903: fix(remission-list, product-info, search-item-to-remit): improve responsive l...
fix(remission-list, product-info, search-item-to-remit): improve responsive layout and fix orientation logic

- Fix grid layout responsiveness in remission-list-item component by updating breakpoint conditions from mobileBreakpoint to desktopBreakpoint
- Correct product-info orientation logic to properly apply horizontal/vertical layouts based on breakpoint state
- Add consistent orientation handling to search-item-to-remit component with proper breakpoint detection
- Update CSS classes to use desktop-large breakpoint for better grid column management
- Add bottom margin to remission list container to prevent overlap with fixed action button
- Enhance test coverage for new computed properties and breakpoint-dependent behavior

Ref: #5239
2025-07-31 16:44:06 +00:00
Nino Righi
ad00899b6e Merged PR 1902: feat(shared-filter-inputs-checkbox-input): add bulk toggle functionality for...
feat(shared-filter-inputs-checkbox-input): add bulk toggle functionality for checkbox options

Replace individual option iteration with new toggleAllCheckboxOptions method
in FilterService. This improves performance and provides cleaner API for
selecting/deselecting all checkbox options at once. Updates component logic
to use the new bulk operation and fixes test expectations accordingly.

Ref: #5231
2025-07-31 16:42:37 +00:00
Nino Righi
0addf392b6 Merged PR 1901: hotfix(return-summary): disable navigation during return processing
hotfix(return-summary): disable navigation during return processing

Replace Router navigation with Location.back() for better UX and add
disabled states to prevent user actions during pending operations.

Changes:
- Replace navigateBack() method with direct Location.back() calls
- Add returnItemsAndPrintReciptPending input to ReturnSummaryItemComponent
- Disable edit and back buttons when return operation is pending
- Update parent component to pass pending state to child components
- Fix template binding to use computed pending status signal

This prevents users from navigating away during critical return
operations and provides consistent disabled states across the UI.

Ref: #5257
2025-07-31 16:41:59 +00:00
Michael Auer
1e84223076 ~ azure-pipelines.yml: DockerTagSourceBranch _ ==> - 2025-07-30 17:46:32 +02:00
Nino Righi
244984b6cf Merged PR 1900: feat(remission): add getStockToRemit helper and improve stock calculation logic
feat(remission): add getStockToRemit helper and improve stock calculation logic

Add new getStockToRemit helper function that handles different remission list types
(Pflicht and Abteilung) for calculating stock to remit. Refactor existing logic
to use the centralized helper instead of duplicated calculation code.

Changes:
- Add getStockToRemit function to handle RemissionListType-specific logic
- Update calculateStockToRemit to use strict undefined check for predefinedReturnQuantity
- Refactor RemissionListItemComponent to use getStockToRemit helper
- Update RemissionListComponent to use getStockToRemit for consistent calculations
- Add comprehensive test coverage for both helper functions

This centralizes stock calculation logic and ensures consistent behavior
across all remission components.

Ref: #5252
2025-07-30 12:00:08 +00:00
Lorenz Hilpert
b39abe630d Merged PR 1899: feat(empty-state): enhance empty state component with new appearance options...
feat(empty-state): enhance empty state component with new appearance options and integration in remission details

Related work items: #5232
2025-07-30 08:54:09 +00:00
Lorenz Hilpert
239ab52890 Merged PR 1898: chore: update dependencies to latest versions
chore: update dependencies to latest versions

- Upgraded @ngrx packages from 19.2.1 to ^20.0.0
- Upgraded ngx-matomo-client from ^7.0.1 to ^8.0.0
- Upgraded jest and related packages from 30.0.4 to ^29.7.0
2025-07-30 08:52:36 +00:00
Nino
4732656a0f chore(remission, navigation): update routing and remove unused helpers 2025-07-29 12:18:07 +02:00
Nino Righi
0da9800ca0 Merged PR 1897: #5236 #4771 Abteilungsremission
- feat(remission-list): Added Tooltip and Static Toolbar
- Merge branch 'develop' into feature/5236-Remission-Abteilungsremission-Offene-Punkte
- feat(remission-list, shared-filter, ui-input-controls): enhance department filtering and UI improvements
- Merge branch 'develop' into feature/5236-Remission-Abteilungsremission-Offene-Punkte
- Merge branch 'develop' into feature/5236-Remission-Abteilungsremission-Offene-Punkte
- feat(remission-list, remission-data-access): add department capacity display functionality

#5236 #4771 Abteilungsremission
2025-07-28 19:28:14 +00:00
Lorenz Hilpert
baf4a0dfbc Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-07-28 19:11:36 +02:00
Lorenz Hilpert
da5a42280a feat(remission): enhance quantity input handling and error validation
Refactor quantity input to use a direct input field instead of a toggle button.
Add validation to ensure quantity does not exceed 999 and display relevant error messages.
Improve overall user experience in the remission process.

Refs: #5253
2025-07-28 19:11:08 +02:00
Lorenz Hilpert
4d29189c8d Merged PR 1896: feat(filter): add maximum selection limits for checkbox filters
feat(filter): add maximum selection limits for checkbox filters

Implement a maxOptions property to limit the number of selections in checkbox filters.
This feature includes FIFO behavior for managing selections and hides the "Select All"
control when limits are set to prevent user confusion. Update related documentation
and components to reflect these changes.

Refs: #5250
2025-07-28 16:01:34 +00:00
Lorenz Hilpert
32bd3e26d2 Merged PR 1895: feat(app): provide default currency code as EUR
feat(app): provide default currency code as EUR

Refs: #5247 #5248
2025-07-28 12:00:38 +00:00
Lorenz Hilpert
6d26f7f6c0 Merged PR 1894: feat(filter): enhance search trigger handling and event emissions
feat(filter): enhance search trigger handling and event emissions

Refactor search components to emit specific search trigger types,
improving tracking of user interactions. Update relevant components
to handle 'input', 'filter', 'scan', and 'order-by' triggers,
ensuring consistent behavior across the filter system.

Refs: #5234
2025-07-28 08:54:15 +00:00
Lorenz Hilpert
72bcacefb6 Merged PR 1893: feat(remission): add remission processed hint component and update schemas
feat(remission): add remission processed hint component and update schemas

- Introduced RemissionProcessedHintComponent to display hints based on remission processing status.
- Updated fetch-remission-return-receipts schema to include parameters for completed returns.
- Refactored remission return receipt service to handle completed and incomplete returns separately.
- Adjusted remission list component to utilize the new hint component and updated data fetching logic.

Refs: #5240 #5136
2025-07-28 08:30:04 +00:00
Lorenz Hilpert
71e9a6da0e Merged PR 1892: refactor(return-receipt-list-item): restructure styles and remove unused imports
refactor(return-receipt-list-item): restructure styles and remove unused imports

Updated the SCSS to separate background styles for different states and removed the unused Receipt import from the component.

Refs: #5225
2025-07-28 08:26:54 +00:00
Lorenz Hilpert
b339a6d79f Merged PR 1891: feat: implement multi-level checkbox filter with hierarchical selection
feat: implement multi-level checkbox filter with hierarchical selection

- Add support for hierarchical checkbox options with parent-child relationships
- Implement automatic child selection/deselection when parent is toggled
- Add checkbox-input-control component for individual option management
- Add isCheckboxSelected helper for determining selection states
- Extend FilterService with setInputCheckboxOptionSelected method
- Update checkbox schemas to support nested option structures
- Add comprehensive test coverage for new multi-level functionality

Ref: #5231
2025-07-25 13:49:44 +00:00
Lorenz Hilpert
0b4aef5f6c chore: add nx.instructions.md to .gitignore 2025-07-25 10:37:44 +02:00
Nino Righi
c5182809ac Merged PR 1890: #5230 #5233 Remi Starten Feedback
- feat(remission-data-access,remission-list,remission-return-receipt-details): improve remission list UX and persist store state
- feat(remission-list, remission-data-access): implement resource-based receipt data fetching
- Merge branch 'develop' into feature/5230-Feedback-Remi-Starten
- feat(remission-data-access, remission-list, ui-dialog, remission-start-dialog): consolidate remission workflow and enhance dialog system
- feat(remission-list-item): extract selection logic into dedicated component
Refs: #5230 #5233
2025-07-24 21:22:02 +00:00
Lorenz Hilpert
f4b541c7c0 chore: update package.json to include overrides for jest-environment-jsdom and stylus 2025-07-23 17:40:37 +02:00
Lorenz Hilpert
afe6c6abcc chore: update package.json to override stylus version to 0.64.0 and ensure jsdom is set to 26.0.0 2025-07-23 17:29:37 +02:00
Lorenz Hilpert
3f233f9580 Merge tag '4.0' into develop
Finish Release 4.0 4.0
2025-07-23 17:02:32 +02:00
Lorenz Hilpert
6f9d4d9218 Merge branch 'release/4.0' 2025-07-23 16:35:08 +02:00
Lorenz Hilpert
4111663d8c feat: add mock for ScannerButtonComponent and update feedback dialog
- Created a mock for ScannerButtonComponent in test-mocks.ts to facilitate testing.
- Updated test-setup.ts to mock browser APIs for the test environment.
- Refactored SelectRemiQuantityAndReasonComponent to simplify addToRemiList logic and update feedback dialog usage.
- Modified feedback-dialog.component.html to safely access message data.
- Cleaned up package-lock.json by removing deprecated and unnecessary dependencies.
2025-07-22 15:06:25 +02:00
Lorenz Hilpert
2beeba5c92 fix: resolve critical security vulnerability in form-data
- Updated form-data from 4.0.3 to 4.0.4
- Fixes GHSA-fjxv-7rqg-78g4: unsafe random function usage for boundary selection
- Applied npm audit fix --force due to peer dependency conflicts
2025-07-21 23:11:54 +02:00
Lorenz Hilpert
edab1322c8 chore: migrate nx to latest 2025-07-21 22:35:11 +02:00
Lorenz Hilpert
59ce736faa feat(remission-return-receipt-list): rewrite unit tests with Angular Testing Utilities
- Replace Spectator with Angular's official TestBed and ComponentFixture
- Implement isolated test approach with proper AAA pattern
- Fix TypeScript errors related to Return interface type mismatches
- Add comprehensive edge case testing and error handling
- Create proper mock components for child dependencies
- Ensure all 47 tests pass with improved maintainability
2025-07-21 20:07:02 +02:00
Nino Righi
3cd6f4bd58 Merged PR 1889: feat(remission-data-access, remission-list, remission-start-card): add remission item selection and quantity update logic
- Introduce `addReturnItem` and `addReturnSuggestionItem` methods to `RemissionReturnReceiptService` with full schema validation and error handling
- Add models and schemas for receipt-return tuples and add-return-item/suggestion operations
- Refactor `RemissionStore` (formerly `RemissionSelectionStore`) to support selection, quantity updates, and clearing of remission items; update all usages to new store name and API
- Update `RemissionListItemComponent` to support item selection via checkbox and quantity dialog, following workspace UX and state management guidelines
- Enhance `RemissionListComponent` to handle selected items, batch remission, and error/success feedback using new store and service APIs
- Fix and extend tests for new store and service logic, ensuring coverage for selection, quantity, and remission flows
- Update remission start dialog and assign package number components for improved validation and loading state handling

Ref: #5221
2025-07-21 10:28:12 +00:00
Lorenz Hilpert
594acaa5f5 feat(button): add disabled state input to stateful button component 2025-07-21 08:39:33 +02:00
Lorenz Hilpert
76ff54dd3a Merged PR 1887: feat(navigation): add collapsible submenu for remission navigation #5223
feat(navigation): add collapsible submenu for remission navigation #5223

- Convert remission navigation to expandable submenu with arrow toggle
- Add 'list' route for remission with redirect from empty path
- Separate navigation items for Remission and Warenbegleitscheine
- Refactor side-menu component to use inject() pattern
- Add remissionExpanded signal to track submenu state
2025-07-18 06:40:24 +00:00
Lorenz Hilpert
598df7d5ed Merged PR 1888: fix: improve sorting of remission return receipts
fix: improve sorting of remission return receipts

- Refactor data fetching to use a single API call for all returns
- Apply sorting separately to completed and incomplete returns
- Fix template tracking to use index instead of potentially undefined ID
- Remove redundant API calls for incomplete returns

This ensures proper sorting of remission return receipts while maintaining
the separation between completed and incomplete items in the display order.

Ref: #5224
2025-07-18 06:39:44 +00:00
Lorenz Hilpert
442670bdd0 Merged PR 1885: Remi Add Flow - ohne offener Remi
Related work items: #5135
2025-07-17 13:53:36 +00:00
Lorenz Hilpert
b015e97e1f Merged PR 1886: feat: add unit tests for remission return receipt functionality
feat: add unit tests for remission return receipt functionality

- Add tests for 4 new RemissionReturnReceiptService methods:
  - removeReturnItemFromReturnReceipt()
  - completeReturnReceipt()
  - completeReturn()
  - completeReturnReceiptAndReturn()
- Update RemissionReturnReceiptDetailsCardComponent tests for itemCount -> positionCount
- Add tests for new inputs and remove functionality in RemissionReturnReceiptDetailsItemComponent
- Add tests for canRemoveItems and completeReturn in RemissionReturnReceiptDetailsComponent
- All tests focus on happy path scenarios and isolated functionality

Refs: #5138
2025-07-17 13:46:32 +00:00
Nino Righi
65ab3bfc0a Merged PR 1884: #5213
- feat(dialog-feedback-dialog, remission-list-item): add feedback dialog and remission list item components
- feat(remission-list-item): implement remission list item component
Refs: #5213
2025-07-15 11:26:03 +00:00
Lorenz Hilpert
e674378080 Merged PR 1883: fix(return-details): update email validation and improve error handling
fix(return-details): update email validation and improve error handling

Refs: #5211
2025-07-14 14:57:41 +00:00
Lorenz Hilpert
40c9d51dfc Merged PR 1881: Stateful Remi Button
#5203

Related work items: #5203
2025-07-14 11:57:03 +00:00
Nino Righi
5f74c6ddf8 Merged PR 1878: Refs: #4769, #5196
- feat(remission-shared-produt-shelf-meta-info): Intermediate commit.
- feat(remission-shared-product-shelf-meta-info): improve template structure and data attributes
- feat(remission-list-item): add product shelf meta info and improve E2E selectors

Refs: #4769, #5196
2025-07-11 19:53:56 +00:00
Lorenz Hilpert
a36d746fb8 Merged PR 1879: Warenbegleitschein Übersicht und Details
Related work items: #5137, #5138
2025-07-10 16:00:16 +00:00
Nino
f6b2b554bb Merge branch 'release/4.0' into develop 2025-07-10 14:31:03 +02:00
Nino
465df27858 Merge branch 'release/4.0' into develop 2025-07-10 14:16:29 +02:00
Nino Righi
7c907645dc Merged PR 1880: hotfix(oms-data-access): initial implementation of OMS data access layer
hotfix(oms-data-access): initial implementation of OMS data access layer

Introduce the foundational OMS data access module, including service scaffolding and integration points for future API communication. This establishes a clear separation of concerns for order management system data retrieval and manipulation, following project architecture guidelines.

Ref: #5210
2025-07-10 11:32:42 +00:00
Nino Righi
b7e7155577 Merged PR 1877: #4769, #5194 Remission List Item - StockInfos - ItemInfos
feat(remission-list, remission-shared-product-stock-info): implement product stock info display

Add product stock information to the remission list and shared product components.
This enhances user visibility into current stock levels directly within remission-related views,
improving workflow efficiency and reducing the need for context switching.

Ref: #4769, #5194
2025-07-02 14:23:04 +00:00
Lorenz Hilpert
b28c204f23 refactor(tabs): add metadata and navigation properties to Tab model 2025-07-01 12:00:12 +02:00
Lorenz Hilpert
e7a807cfbd refactor(tabs): enhance Tab interface with navigation and metadata 2025-07-01 11:46:30 +02:00
Lorenz Hilpert
344dc61a90 fix: resolve CSS cascade issue with UI components and Tailwind utilities
- Move UI component styles to @layer components in tailwind.scss
- Remove ui.scss and integrate imports directly into component layer
- Add SCSS files to Tailwind content config to prevent CSS class purging
- Update Angular project configuration to remove ui.scss references
- Ensure Tailwind utilities can override component styles properly

Refs: #5195
2025-06-30 23:01:58 +02:00
Lorenz Hilpert
8d063428fc Merge branch 'refactor/convert-buildable-libs-to-non-buildable' into develop
Resolved conflicts:
- .gitignore: Added .claude to ignored files
- nx.json: Kept HEAD version with extra eslint.config.js exclusion
- package.json: Merged dependencies, updated vitest to v3.1.1 for compatibility
- eslint config files: Fixed merge conflicts and accepted conversion from .mjs to .js
- Removed deleted files from refactor branch
- Regenerated package-lock.json with --legacy-peer-deps

Build and tests pass successfully.
2025-06-30 20:52:05 +02:00
Lorenz Hilpert
06b0c6264a chore: add .claude to .gitignore 2025-06-30 20:13:33 +02:00
Lorenz Hilpert
4fe633e973 chore: update package dependencies and remove unused shared imports in tsconfig 2025-06-30 20:13:19 +02:00
Lorenz Hilpert
2463a803ea Merged PR 1876: Fix Workspace Build Issues 2025-06-30 09:17:03 +00:00
Lorenz Hilpert
1663dcec73 test(search-item-to-remit-dialog): enhance unit tests for component behavior and signal integration 2025-06-30 11:00:00 +02:00
Lorenz Hilpert
827aa565c5 feat(tests): update test command to include tuiAutoExit and add unit tests for SearchItemToRemitDialogComponent 2025-06-27 17:34:13 +02:00
Lorenz Hilpert
39fc4ce1ce refactor(styles): update styles to use Tailwind CSS and clean up code 2025-06-27 16:45:47 +02:00
Lorenz Hilpert
4f4b072e25 refactor(sass): migrate @import to @use syntax
- Replace deprecated @import with modern @use in _components.scss
- Replace deprecated @import with modern @use in tailwind.scss
- Move @use statements before @tailwind directives per Sass requirements
- Eliminates all 5 Sass deprecation warnings from build
- Future-proofs codebase for Dart Sass 3.0.0
2025-06-27 16:42:49 +02:00
Lorenz Hilpert
9af4a72a76 fix: resolve build warnings and improve code quality
- Remove unused Angular component and pipe imports to eliminate TS-998113 warnings
- Fix Sass mixed declarations warnings by reordering CSS properties
- Remove empty ngOnInit method from preview component
- Clean up unused imports across customer search and OMS components
- Move animation/transition properties above nested rules in SCSS files

Reduces build warnings significantly and improves code maintainability.
2025-06-27 16:19:18 +02:00
Lorenz Hilpert
7a44101e90 refactor: convert buildable libraries to non-buildable and migrate eslint configs
- Convert eslint.config.mjs files to eslint.config.js format across workspace
- Remove build targets from remission libraries (data-access, feature/remission-list, helpers, shared)
- Remove build target from icons library
- Delete ng-package.json and tsconfig.lib.prod.json files from buildable libraries
- Update tsconfig.lib.json configurations to remove bundler moduleResolution
- Clean up build artifacts and simplify library configurations
- Libraries now compile on-demand during application build instead of pre-compilation
2025-06-27 15:44:34 +02:00
Lorenz Hilpert
5e6ee35d91 chore(eslint): remove eslint-plugin-prettier and update configurations 2025-06-26 22:48:56 +02:00
Lorenz Hilpert
15db63aa1a refactor(quantity-and-reason-item): improve stock fetching and caching logic
Enhance the fetchAssignedStock method to utilize memory storage for caching
assigned stock data. Update the resource loader to handle cached values and
set new stock data accordingly. Adjust the HTML button for better readability.
2025-06-26 22:34:03 +02:00
Lorenz Hilpert
998946157a chore: update dependencies and add vitest configuration
- Added @analogjs/vite-plugin-angular and @analogjs/vitest-angular to devDependencies.
- Updated @nx/vite to version 20.1.4.
- Added @vitest/coverage-v8 and @vitest/ui to devDependencies.
- Added jsdom to devDependencies.
- Added vite and vitest to devDependencies.
- Updated tsconfig.base.json to include new paths for shared libraries.
- Created vitest.workspace.ts for vitest configuration.

Refs: #5135
2025-06-26 22:09:21 +02:00
Nino Righi
11cfa4039f Merged PR 1875: feat(remission-list-item): Item View (Basic), Refs: #4769
feat(remission-list-item): Item View (Basic), Refs: #4769
2025-06-25 15:01:31 +00:00
Lorenz Hilpert
26fd5cb389 Merged PR 1874: Remi Add Item Dialog FLow
Related work items: #5135
2025-06-25 13:45:25 +00:00
Nino Righi
f34f2164fc Merged PR 1873: #4769 Remission List
- feat(remission-list): Zwischencommit
- feat(ui-input-controls): Adjusted Dropdown Styling and Added Droption Option Disable Class, Refs: #4769
- feat(remission): implement remission list feature shell and category select
- Merge branch 'develop' into feature/4769-Remission-Liste
- Merge branch 'develop' into feature/4769-Remission-Liste
- feat(remission-list, remission-data-access): implement new remission data access layer and update remission list integration
2025-06-25 13:38:22 +00:00
Lorenz Hilpert
a68f5b5347 chore(dependencies): add optional dependency for @esbuild/linux-x64 2025-06-25 11:50:45 +02:00
Nino Righi
6fee35c756 Merged PR 1872: fix(isa-app-moment-locale): correct locale initialization for date formatting
fix(isa-app-moment-locale): correct locale initialization for date formatting

Ensures proper setup of moment.js locale in the ISA app to provide accurate date and time formatting for users. Addresses issues with incorrect or inconsistent locale application.

Ref: #5188
2025-06-25 08:35:43 +00:00
Nino Righi
c15077aa86 Merged PR 1870: fix(oms-return-search): fix display and logic issues in return search results
fix(oms-return-search): fix display and logic issues in return search results

Resolve display inconsistencies and correct logic in the return search result component to improve user experience and maintain alignment with design and business requirements.

Ref: #5009
2025-06-23 21:23:27 +00:00
Nino Righi
f051a97e53 Merged PR 1871: fix(ui-dropdown): improve dropdown usability and conditional rendering
fix(ui-dropdown): improve dropdown usability and conditional rendering

Refines the logic for displaying quantity and product category dropdowns in the return details order group item controls. Ensures dropdowns are only shown when appropriate and maintains accessibility and user experience.

Ref: #5189
2025-06-23 15:32:56 +00:00
Nino Righi
1b26a44a37 Merged PR 1869: fix(oms-task-list-item): address styling and layout issues in return task lis...
fix(oms-task-list-item): address styling and layout issues in return task list item

Improves SCSS for the return task list item component to ensure consistent appearance and resolve layout inconsistencies. Enhances maintainability and visual alignment with design standards.

Ref: #5191
2025-06-23 15:25:34 +00:00
Nino Righi
80b2508708 Merged PR 1868: fix(oms-return-search): resolve issues in return search result item rendering
fix(oms-return-search): resolve issues in return search result item rendering

Corrects rendering logic and improves template structure for the return search result item component. Ensures compliance with Angular control flow best practices and enhances maintainability.

Ref: #5190
2025-06-23 15:24:26 +00:00
Nino Righi
d53540b8db Merged PR 1867: #4769 Remi 3.0 - Remission – Scannen und Suchen
- feat(remission-list): Zwischencommit
- feat(ui-input-controls): Adjusted Dropdown Styling and Added Droption Option Disable Class, Refs: #4769
- feat(remission): implement remission list feature shell and category select
- Merge branch 'develop' into feature/4769-Remission-Liste
2025-06-23 15:23:54 +00:00
Lorenz Hilpert
4cf0ce820e Merged PR 1866: Anlage Komponenten und Directives + Unit Tests und Stories
Related work items: #5175
2025-06-18 13:58:00 +00:00
Nino
e9affd2359 fix(return-details): Small Layout Fix, Refs: #5171 2025-06-17 16:52:03 +02:00
Nino
8f8b9153b0 Merge branch 'develop' into release/4.0 2025-06-17 16:45:37 +02:00
Nino
b21ebac53f feat(remission-list): Init Routing to Remission List 2025-06-16 17:24:35 +02:00
Lorenz Hilpert
5a68adc87c chore: update editorconfig and add .prettierrc for code formatting 2025-06-16 17:06:34 +02:00
Nino
befdc9fa4d feat(core-tabs): Changes due to Renaming from Process to Tab and Unit Test Fixes 2025-06-16 16:37:48 +02:00
Nino
e41dbc2870 feat(core-tabs): Move Core-Process to Core-Tabs 2025-06-16 15:05:30 +02:00
Nino
083f75a395 feat(remission): Init Remission Feature/Shared/Helpers and Data-Access Libs
Refs: #4768, #4769, #4770, #4771
2025-06-16 13:51:43 +02:00
Lorenz Hilpert
7c8aef9a48 chore: update npm install command to include legacy-peer-deps flag 2025-06-16 12:06:10 +02:00
Lorenz Hilpert
ee841eba49 chore: update @nx/angular dependency to version ^20.1.4 2025-06-16 12:02:45 +02:00
Lorenz Hilpert
0560f18de3 Merge branch 'migration-angular-20' into develop 2025-06-16 11:55:58 +02:00
Lorenz Hilpert
d8c2ca9bdc Migration Angular v19 -> v20 2025-06-16 11:54:47 +02:00
Lorenz Hilpert
9a4121e2bf fix(return-details): correct storage key retrieval in ReturnDetailsStore 2025-06-16 10:53:58 +02:00
Nino Righi
636e405927 Merged PR 1865: feat(oms-data-access, oms-return-review, oms-return-summary): fix return receipt mapping and ensure process completion
feat(oms-data-access, oms-return-review, oms-return-summary): fix return receipt mapping and ensure process completion

Corrects the mapping of return receipts in the return process flow to ensure that the correct receipt IDs are used when printing and finalizing returns. Updates the `finishProcess` method to associate return receipts with the correct entities and ensures the store is updated after process completion. This resolves issues where printed receipts or review steps could reference incorrect or missing data.

Ref: #5120
2025-06-14 14:19:02 +00:00
Nino Righi
159afa9356 Merged PR 1864: feat(ui-tooltip): remove native title attribute from tooltip icon host
- feat(ui-tooltip): remove native title attribute from tooltip icon host

Refs: #5163
2025-06-14 14:18:21 +00:00
Nino Righi
2088fd3191 Merged PR 1863: feat(oms-return-details): improve layout and styling of order group item controls
- feat(oms-return-details): improve layout and styling of order group item controls

Ref: #5171
2025-06-13 13:56:15 +00:00
Nino Righi
6f80159281 Merged PR 1860: #5157 Return Input Ean Validation
- feat(oms-return-review): implement return review feature
- Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop
- Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop
- feat(oms-return-process, ui-input-controls): improve error feedback for EAN input and adjust text field container spacing

Refs: #5157
2025-06-13 13:55:32 +00:00
Lorenz Hilpert
54664123fb chore: update dependencies to latest versions
- Upgraded @nx packages to version 21.2.0
- Updated Storybook packages to version 9.0.5 and core-server to 8.6.11
- Upgraded eslint-config-prettier to version 10.1.5
- Updated jest-preset-angular to version 14.6.0
- Upgraded nx to version 21.2.0
- Updated storybook test-runner to version 0.22.0
2025-06-13 15:54:23 +02:00
Lorenz Hilpert
50b7f21394 Merge branch 'develop' into release/4.0 2025-06-12 21:12:08 +02:00
Lorenz Hilpert
0134f8dbf5 fix(return-search): correct typo in tooltip content 2025-06-12 18:53:41 +02:00
Lorenz Hilpert
1429ca37c6 feat(return-product-info): add ProductRouterLinkDirective to tests 2025-06-12 18:50:52 +02:00
Nino Righi
f5f8a7ae18 Merged PR 1862: #5168
- feat(oms-data-access): fix return process entity validation in startProcess

Refs: #5168
2025-06-12 16:28:31 +00:00
Lorenz Hilpert
3cf05f04ef feat(shared-scanner): Moved to shared/scanner
feat(common-data-access): takeUnitl operators for keydown

Refs: #5062
2025-06-12 16:34:21 +02:00
Lorenz Hilpert
055cfb67d3 Merged PR 1861: feat(product-router-link): add shared product router link directive and builder
feat(product-router-link): add shared product router link directive and builder

Ref: #5111 #5169
2025-06-12 14:28:12 +00:00
Lorenz Hilpert
53d8abd615 Merged PR 1859: feat(print-button): implement reusable print button component with service in...
feat(print-button): implement reusable print button component with service integration

Ref: #5146
2025-06-12 14:00:09 +00:00
Nino Righi
7323c67ba6 Merged PR 1857: feat(oms-return-review): implement return review feature
feat(oms-return-review): implement return review feature

Introduce the initial implementation of the return review feature in the OMS module. This includes core logic, UI components, and integration with existing state management. The feature enables users to review return processes, view item details, and confirm actions as part of the return workflow.

Ref: #5120
2025-06-12 12:16:30 +00:00
Lorenz Hilpert
1617533412 Merged PR 1858: feat(scanner): add full-screen scanner styles and components
feat(scanner): add full-screen scanner styles and components

Implemented full-screen scanner styles in styles.scss.
Added ScannerButtonComponent to trigger barcode scanning.
Created ScannerComponent for rendering camera view and processing scans.
Updated ScannerService to handle scanning operations and configuration.
Enhanced README.md with detailed library features and usage examples.
Refactored return process components to utilize new scanner button.
Updated search bar input to integrate scanner functionality.
Added tests for new components and services, ensuring proper functionality.
Improved UI button styles for better integration with scanner features.
Ref:
#5123
DS // Scanner Overlay
QA
#5056
Retoure // Scan-Button lösen Suche aus
QA
#5147

Related work items: #5147
2025-06-12 11:56:06 +00:00
Nino Righi
b589dc21cd Merged PR 1856: #5144 #5141 #5099
- feat(oms-data-access, oms-return-details): add processed quantity helper and refactor item controls
- feat(ui-input-controls, oms-return-details): add disabled styling and logic for dropdowns
- feat(oms-return-details): improve dropdown accessibility and disabled state handling

Refs: #5144 #5141 #5099
2025-06-11 19:56:16 +00:00
Lorenz Hilpert
80fb65ffc4 Merged PR 1855: 5000 Retoure // Info -Tooltip zur Suchseite hinzufügen
Related work items: #5000
2025-06-11 15:08:54 +00:00
Lorenz Hilpert
dbe0328eb7 Merged PR 1854: refactor(searchbox): improve formatting and add showScannerButton getter
refactor(searchbox): improve formatting and add showScannerButton getter

Ref: #5001
2025-06-10 14:57:14 +00:00
Lorenz Hilpert
61ce9940c9 Merged PR 1853: feat(return-process): add getReceiptItemQuantity helper and related tests
feat(return-process): add getReceiptItemQuantity helper and related tests

Ref: #5156
2025-06-10 14:56:34 +00:00
Nino Righi
a37201ef33 Merged PR 1849: feat(libs-ui-item-rows): improve data value wrapping and label sizing
feat(libs-ui-item-rows): improve data value wrapping and label sizing

- Add `break-all` to `.ui-item-row-data-value` for better handling of long or unbroken content, ensuring values do not overflow their containers
- Use Tailwind's `min-w-[6.5rem]` utility for `.ui-item-row-data-label` and `.ui-item-row-data-label` in both `item-row-data` and `client-row` components, standardizing minimum label width and improving layout consistency

Ref: #5074
2025-06-10 14:43:13 +00:00
Nino Righi
9857d86bdf Merged PR 1850: feat(libs-shared-filter): improve date range equality for default filter inpu...
feat(libs-shared-filter): improve date range equality for default filter input detection

Enhance the isDefaultFilterInput method to compare DateRangeFilterInput values by parsing ISO date strings to Date objects before comparison. This ensures that date ranges are considered equal even if their string representations differ in precision (e.g., "2023-06-05T22:00:00Z" vs. "2023-06-05T22:00:00.000Z"). This change improves filter reset and default state detection reliability for date range filters.

Ref: #5142
2025-06-10 13:57:09 +00:00
Nino Righi
7283caab15 Merged PR 1852: feat(shared-filter,search-bar,search-main): add E2E data attributes for filte...
feat(shared-filter,search-bar,search-main): add E2E data attributes for filter and search UI

Add standardized `data-which` and `data-what` attributes to filter input buttons, search bar input, search bar button, and clear search icon components. This improves end-to-end testability and aligns with project conventions for robust, maintainable UI automation. Updates affect filter menu, input menu button, search bar input, and search bar clear components, as well as the return search main feature.

Ref: #5060
2025-06-10 13:16:15 +00:00
Lorenz Hilpert
3eb6981e3a Merged PR 1851: Retoure // Mehrere Belege in der Retouren-Detailansicht anzeigen
Related work items: #5002, #5148
2025-06-06 15:34:33 +00:00
Lorenz Hilpert
dd598d100c Merged PR 1848: feat(tooltip): add tooltip component and directive with customizable triggers
feat(tooltip): add tooltip component and directive with customizable triggers

Introduce a new tooltip library for Angular applications, featuring a
flexible tooltip component that supports various trigger events
(click, hover, focus) and customizable content. Includes necessary
styles, tests, and documentation for usage and configuration.

Ref: #4992
2025-06-06 11:13:07 +00:00
Nino Righi
405bf5b463 Merged PR 1847: fix(shared-filter): add mapFilterInputToRecord util and refactor query mapping
fix(shared-filter): add mapFilterInputToRecord util and refactor query mapping

Introduce mapFilterInputToRecord utility for consistent mapping of filter inputs to query parameter records. Refactor FilterService.query to use this utility for both filter and input groups, ensuring DRY code and improved maintainability.

Add unit tests for the new mapping function and update the mappings index export.

Ref: #5105, #5106, #5143
2025-06-05 17:14:05 +00:00
Nino Righi
b261273228 Merged PR 1841: feat(ui-input-controls, oms-return-process): introduce text field container,...
feat(ui-input-controls, oms-return-process): introduce text field container, clear, and errors components

- Add `ui-text-field-container`, `ui-text-field-clear`, and `ui-text-field-errors` as standalone components for improved text field composition and error handling.
- Update SCSS to include new styles for container, clear, and errors components, ensuring visual consistency and error highlighting.
- Refactor `ReturnProcessProductQuestionComponent` to use the new containerized text field structure, improving template clarity and error display.
- Update Storybook story for `TextField` to demonstrate new composition and error handling.
- Export new components from the input-controls public API for external usage.

Ref: #4989, #5058
2025-06-05 17:12:28 +00:00
Lorenz Hilpert
f5507a874c Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-06-05 18:49:39 +02:00
Lorenz Hilpert
4478e1ce21 hotfix(checkout): Chaning the Quantity in the cart used a wrink branch for "Rücklage"
- When chaning the quantity, the current destination branch will be used to update the quantity in the cart
2025-06-05 18:35:23 +02:00
Lorenz Hilpert
ade6b7f845 Merged PR 1846: Navigation for to Customer Details from external Systems
Related work items: #5149
2025-06-05 16:09:13 +00:00
Nino Righi
7743150652 Merged PR 1845: feat(shared-product-info): add shared product info module and initial impleme...
feat(shared-product-info): add shared product info module and initial implementation

Introduce a new shared module for product information, providing reusable components and services for displaying product details across the application. This module is designed for consistency and maintainability, following project guidelines for modularization and type safety.

Ref: #5065
2025-06-04 19:42:14 +00:00
Nino Righi
543de57190 Merged PR 1844: feat(oms-data-access, oms-shared-task-list): add Tolino return receipt print support and improve task action typing
feat(oms-data-access, oms-shared-task-list): add Tolino return receipt print support and improve task action typing

- Add `PrintTolinoReturnReceiptService` to `oms-data-access` for printing Tolino return receipts via office printers, including direct integration with the OMS print API.
- Extend `TaskActionType` to include `receiptItemId` for more precise task identification and action handling.
- Update `return-task-list-item` and `return-task-list` components in `oms-shared-task-list` to support the new Tolino print action, including UI and logic for triggering the print dialog.
- Refactor print-related service and test code to use the new print API signature and improve type safety.
- Add and update unit tests to cover new print flows and ensure correct integration.

Ref: #5121
2025-06-03 22:17:29 +00:00
Nino Righi
bcd3c800b1 Merged PR 1843: feat(libs-shared-filter): show selected filter count on filter button
feat(libs-shared-filter): show selected filter count on filter button

- Display the number of selected filters as a badge on the filter menu button when filters are active.
- Add `.has-selected-filter` styling for visual emphasis when filters are selected.
- Update FilterService to provide a computed `selectedFilterCount` property, counting non-default filter inputs.
- Remove direct icon rendering from the button; icon is now handled by the button component.
- Update tests to mock and assert the new selected filter count logic.

Ref: #5070
2025-06-03 22:15:06 +00:00
Nino Righi
bd7faeb1b5 Merged PR 1842: #5139 minor fix
#5139 minor fix
2025-06-03 22:14:30 +00:00
Lorenz Hilpert
a67375557d Merge branch 'develop' into release/4.0 2025-06-02 11:41:54 +02:00
Lorenz Hilpert
6e7c56fcb9 style(errors): standardize quotation marks in error exports 2025-05-28 21:32:41 +02:00
Lorenz Hilpert
e60d74573c Merged PR 1840: feat(ui-menu): add ui-menu component and related directives
feat(ui-menu): add ui-menu component and related directives

Ref: #5103
2025-05-28 14:06:16 +00:00
Nino Righi
2f04b56f71 Merged PR 1838: feat(oms-return-search): add unit tests for ReturnSearchResultItemComponent a...
feat(oms-return-search): add unit tests for ReturnSearchResultItemComponent and fix address fallback

- Add comprehensive Spectator-based unit tests for ReturnSearchResultItemComponent, covering all computed properties and edge cases.
- Fix address computed property to correctly fall back to shipping address when billing address is missing, ensuring robust display logic.

Ref: #5113
2025-05-26 19:19:14 +00:00
Nino Righi
6e8df1c4ab Merged PR 1839: feat(oms-return-process): apply flex layout to select question description
feat(oms-return-process): apply flex layout to select question description

Update the return-process-select-question component to use the 'flex-1' Tailwind utility class on the description container. This ensures proper flexbox alignment and consistent layout within the parent flex context.

Ref: #5057
2025-05-26 19:19:00 +00:00
Lorenz Hilpert
94e1d729a0 fix(shared/filter): handle setTimeout in FilterMenuButton test
Fix failing test in FilterMenuButtonComponent that checks if rollback is called
when the menu is closed with rollbackOnClose=true. The test was failing because
the component uses setTimeout to schedule the rollback call, but the test was
asserting immediately without waiting for the timeout to complete.

Changes made:
- Modified the test to use jest.useFakeTimers() to control JavaScript timers
- Added jest.runAllTimers() to ensure the setTimeout callback executes
- Added cleanup with jest.useRealTimers() to prevent test pollution
- Made the test function async to properly handle asynchronous behavior

This change ensures that the test properly validates the component's
asynchronous behavior and makes the test suite more reliable.
2025-05-26 21:17:46 +02:00
Lorenz Hilpert
0d202ab97c Merged PR 1837: Fix - Filter Reset und Filter Sync - Removed unused code, logger performance
refactor: improve code formatting and readability in provide-filter.ts and filter-menu components

fix: delay filter rollback on close in FilterMenuButtonComponent

fix: update filter clear button text and method calls in filter-menu.component.html

chore: update package-lock.json to remove unnecessary dev flags and add new dependencies

Ref: #5125, #5076
2025-05-26 15:02:43 +00:00
Nino Righi
c322020c3f Merged PR 1835: feat(oms-data-access, oms-return-summary): unify return details mapping and serialization
Commit 8949c691: feat(oms-data-access, oms-return-summary): unify return details mapping and serialization

- Refactor `returnReceiptValuesMapping` to use `serializeReturnDetails` instead of `returnDetailsMapping` for the `returnDetails` field, ensuring consistent serialization of return details across the OMS data access layer.
- Move the string mapping logic for return details into a dedicated helper (`serializeReturnDetails`), and update all usages and tests accordingly.
- Update `ReturnSummaryItemComponent` to use the new `returnDetailsMapping` helper for rendering human-readable return details in the summary UI.
- Add and update comprehensive unit tests for both helpers and the mapping logic to ensure correct handling of edge cases and maintainability.

Ref: #5124
2025-05-26 14:00:21 +00:00
Nino Righi
bbcf84d357 Merged PR 1836: fix(oms-return-details): use 24-hour format for receipt and order dates
fix(oms-return-details): use 24-hour format for receipt and order dates

Update date formatting in return-details-order-group-data.component.html to use
'HH:mm' (24-hour format) instead of 'hh:mm' (12-hour format) for both receipt
and order dates. This ensures consistency with German locale expectations and
improves clarity for users.

Ref: #5040
2025-05-26 13:59:23 +00:00
Nino Righi
1ddc0a2767 Merged PR 1833: fix(oms-data-access, oms-return-details): remove obsolete 'Software' product...
fix(oms-data-access, oms-return-details): remove obsolete 'Software' product category and related logic

- Removed the 'Software' entry from the ProductCategory constant and its type in `constants.ts`.
- Removed all references to ProductCategory.Software in the category-question registry and eligibility logic.
- Updated the return-details-order-group-item-controls component template to ensure the product category dropdown and checkbox are only rendered when the item is returnable, improving UI consistency and preventing controls from appearing for non-returnable items.
- Added/extended unit tests to verify correct rendering and logic for canReturnReceiptItem and selectability.

This change ensures that only supported product categories are handled in the return process and that UI controls are displayed appropriately based on item eligibility.

Ref: #5100
2025-05-26 08:53:33 +00:00
Nino Righi
1ad6c41c25 Merged PR 1834: fix(oms-return-search): add missing name attribute to mobile sort button
fix(oms-return-search): add missing name attribute to mobile sort button

Adds the `name="isaActionSort"` attribute to the mobile sort button in the return search result component template. This ensures consistent accessibility and testability across platforms, aligning with project standards for semantic markup and E2E test selectors.

Ref: #5110
2025-05-26 08:52:03 +00:00
Nino
72bdf59b05 #5116 Quick Fix 2025-05-23 10:07:51 +02:00
Lorenz Hilpert
0a4eb9bb1c refactor(form-control): improve structure and formatting of component 2025-05-22 19:24:55 +02:00
Lorenz Hilpert
7c9839d93a refactor(scan): improve structure of init method and format code 2025-05-22 19:13:28 +02:00
Lorenz Hilpert
cfb8fb17d6 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-05-22 19:07:31 +02:00
Lorenz Hilpert
cdd27aeeb0 refactor(print): update print dialog component to use new listbox directives
test(print): add unit tests for PrintService and PrintReceiptsService

feat(print): modify PrintService methods to return promises instead of observables

refactor(oms): rename return-print-receipts.service to print-receipts.service and update references

chore(ui): remove deprecated ui-list library and integrate listbox components

style(ui): add styles for listbox and listbox items

test(ui): implement unit tests for listbox directives

docs(ui): update README and remove unused files related to ui-list
2025-05-22 19:07:00 +02:00
Nino
2e3029daa2 feat(oms-return-details): extract item controls into dedicated component
Refactor the order group item controls into a separate component for improved maintainability and reusability. The new ReturnDetailsOrderGroupItemControlsComponent encapsulates dropdown and checkbox functionality that was previously embedded within the parent component.

This change improves code organization by applying the Single Responsibility Principle, making each component more focused and easier to test. Updated tests ensure proper functionality is maintained after extraction.

Ref: #5116
2025-05-22 17:30:35 +02:00
Nino
ec109f89ef Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-05-22 12:38:51 +02:00
Nino
f11567dd82 feat(oms-data-access): implement dynamic question flow for Tolino returns
Add conditional question flow logic for Tolino device returns based on previous answers.
The implementation creates a dedicated helper for Tolino questions that dynamically
determines the next question based on device power status and defect status.

This allows for a more tailored return process experience where:
- If device powers on and has no defects, show return reason
- If device doesn't power on and has no defects, ask about damage
- Otherwise check if case is damaged

Ref: #4944
2025-05-22 12:38:34 +02:00
Lorenz Hilpert
4bbdb870f8 Merge branch 'feature/5047-5053-Design-und-Funktionsweise-Drucker-Dialog' into develop 2025-05-21 21:11:22 +02:00
Lorenz Hilpert
d9e9e39998 feat: remove uncompleted tasks dialog and replace with confirmation dialog
- Deleted uncompleted tasks dialog component files (HTML, SCSS, TS).
- Updated UncompletedTasksGuard to use new ConfirmationDialogComponent.
- Added ConfirmationDialogComponent for user confirmation with customizable messages.
- Updated dialog component templates to include data attributes for easier testing.
- Removed obsolete unit tests for ReturnReviewComponent and ReturnTaskListComponent.
- Updated unit tests for ReturnSummaryComponent to reflect changes in return process handling.
2025-05-21 20:58:03 +02:00
Lorenz Hilpert
896478b2fb Merge branch 'develop' into feature/5047-5053-Design-und-Funktionsweise-Drucker-Dialog 2025-05-21 14:39:05 +02:00
Lorenz Hilpert
d84bc276d5 chore: update dependencies and add new path mappings
- Updated @nx/js from 20.4.6 to 20.8.1
- Updated angular-eslint from 19.1.0 to 19.2.0
- Added path mapping for @isa/common/print in tsconfig.base.json
- Added path mapping for @isa/ui/dialog in tsconfig.base.json
- Added path mapping for @isa/ui/list in tsconfig.base.json
2025-05-21 14:38:24 +02:00
Nino
ca3433a4e1 feat(oms-return-unit-tests): update return process questions with German labels
This commit makes several important changes to the return process functionality:

- Updates ItemConditionAnswer values from English codes to German user-facing text
  (e.g., 'ovp' → 'Originalverpackt', 'damaged' → 'Geöffnet/Defekt')
- Updates ReturnReasonAnswer values to use German labels
  (e.g., 'dislike' → 'Gefällt nicht/Widerruf', 'wrong_item' → 'Fehllieferung')
- Updates YesNoAnswer values to use German text ('yes'/'no' → 'Ja'/'Nein')
- Updates PackageIncompleteAnswer values to use descriptive German text
- Corrects an expected depth value in unit test to match the current behavior
- Adds comments in test files that need to be re-enabled after the printReceiptsService
  is updated to not use the old ISA app through the legacy ModalService

These changes improve readability and make the return processing system
more consistent with the German UI labels.

Ref: #4944
2025-05-21 11:46:13 +02:00
Nino
d2b3d1bf18 feat(oms-data-access, oms-return-summary): implement returnDetails as object with type safety
This commit improves the handling of return details by:
- Changing returnDetails from string to a typed record object for better type safety
- Adding support for checklist question types in getReturnInfo
- Adding explicit mapping function (returnDetailsMapping) to format details for API
- Updating the return summary component to properly display structured return details
- Making internalActiveReturnProcessQuestions public to support nested questions
- Ensuring eligibility check functions receive proper question objects for validation
- Improving returnProcessQuestionKey naming to use more descriptive German names

Ref: #4944
2025-05-20 17:13:47 +02:00
Nino
08f8686791 Config Feature Url Anpassungen 2025-05-19 13:56:42 +02:00
Nino
4131255a1b feat(oms-return-details): add quantity change support for return items
This update introduces quantity selection and change handling for return items in the return details feature. The following enhancements were made:

- Added a quantity dropdown to each return item, allowing users to select the quantity to return (when more than one is available).
- Implemented the `changeQuantity` output in `ReturnDetailsOrderGroup
2025-05-16 17:27:01 +02:00
Nino
874453f74f feat(oms-data-access, oms-return-details, oms-return-process): improve canReturn logic and UX for return eligibility
- Refactored `ReturnCanReturnService` to use a type guard for input discrimination and improved error handling, removing logger side effects for stricter error propagation.
- Updated `ReturnDetailsService` to delegate canReturn checks to `ReturnCanReturnService` for category-based eligibility, ensuring type safety and code reuse.
- Enhanced `ReturnDetailsOrderGroupItemComponent`:
  - Added spinner feedback when canReturn is loading.
  - Used endpoint result for eligibility and message display, falling back to item actions if necessary.
  - Improved state management for dropdowns and selection, with robust error logging.
- Updated `ReturnDetailsOrderGroupComponent` to only allow selection of items with known categories and eligible for return.
- Improved `ReturnProcessItemComponent`:
  - Added loading spinner for canReturn backend checks.
  - Used endpoint result for eligibility and messaging.
  - Added robust error logging and effect-based async state management.
- Updated `ReturnProcessComponent` to check canReturn for all processes asynchronously, with error handling and correct signal updates.
- Improved templates to show loading indicators and correct eligibility messages based on backend and frontend checks.

Ref: #5088
2025-05-16 15:18:45 +02:00
Nino
8077fe949f Config Feature Print Update 2025-05-16 11:39:48 +02:00
Nino
39bdcd4da6 feat(oms-data-access, oms-return-process): extract canReturn logic to dedicated service and unify question helpers
- Move canReturn logic from ReturnProcessService and ReturnProcessItemComponent into a new ReturnCanReturnService for improved separation of concerns and testability.
- Add getReturnProcessQuestions and returnReceiptValuesMapping helpers to centralize question and payload mapping logic.
- Refactor ReturnProcessService to use new helpers and remove obsolete methods.
- Update ReturnProcessItemComponent and ReturnProcessComponent to use ReturnCanReturnService for backend eligibility checks.
- Ensure summary navigation is only enabled when all items are eligible for return both frontend and backend.
- Update public API exports for new helpers and service.

Ref: #5089, #5088
2025-05-15 17:49:42 +02:00
Nino
55b95e571c Fix Unit Test Error - Uncommented Unit Tests in Details because of multiple errors 2025-05-14 17:07:00 +02:00
Nino
4adf947b90 feat(oms-return-details, oms-return-process, oms-data-access): implement product category management
Add dropdown component for selecting product categories in the return details UI.
Move product category selection from return process to return details screen,
allowing users to set categories before starting the return process.

This change:
- Moves availableCategories method from ReturnProcessService to ReturnDetailsService
- Adds new updateProductCategoryForItem method to ReturnDetailsStore
- Updates the OrderGroupItem component with dropdown for category selection
- Removes the category dropdown from ReturnProcessQuestions component

Ref: #5089
2025-05-14 16:52:24 +02:00
Lorenz Hilpert
05e257b922 Merge branch 'develop' into release/4.0 2025-05-13 18:52:00 +02:00
Lorenz Hilpert
efdfa126e7 fix(config): update configMap mountPath for consistency across environments 2025-05-13 18:51:31 +02:00
Lorenz Hilpert
d7d61915fa Merge branch 'develop' into release/4.0 2025-05-13 18:36:09 +02:00
Nino
efd28bcc06 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-05-13 16:45:30 +02:00
Nino
05986ab9f4 feat(oms-return-process, oms-return-details, oms-data-access): implement return process workflow
Add new components and services to support the end-to-end return process
workflow. This includes return creation, validation, item selection, and
submission features across the specified modules.

Ref: #4978
2025-05-13 16:44:53 +02:00
Lorenz Hilpert
6fc65c4158 fix(config): update configMap mountPath for consistency 2025-05-13 12:13:12 +02:00
Lorenz Hilpert
e3395c8772 ci: update artifact path for ISAClientConfigs 2025-05-13 11:51:35 +02:00
Lorenz Hilpert
ec67724b66 ci: update artifact path for ISAClientConfigs 2025-05-13 11:48:23 +02:00
Lorenz Hilpert
911187bc08 update(config): update url path for APIs Checkout, Crm, Oms 2025-05-13 10:53:55 +02:00
Lorenz Hilpert
9a55cd8642 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-05-12 16:29:33 +02:00
Lorenz Hilpert
4815963565 fix(checkbox): ensure checkbox input dimensions are consistently applied
Ref: #5077
2025-05-12 16:28:56 +02:00
Nino
0d4e5c6bf9 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-05-12 16:13:11 +02:00
Nino
e60f4db18a fix(oms-data-access): move category to top level in return receipt payload
Update ReturnReceiptValuesSchema to accept category as a direct property
instead of nested in receiptItem.data.features. Simplifies the schema by
removing the unnecessary ReceiptItemDataSchema and modifying how the
category is accessed in completeReturnProcess.

Ref: #5083
2025-05-12 16:11:20 +02:00
Lorenz Hilpert
b0de88301f Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-05-12 16:05:39 +02:00
Lorenz Hilpert
6868c6df75 refactor(return-details): reorganize button placement for better layout 2025-05-12 16:05:08 +02:00
Nino
f2ca829b36 OMS Api Update 2025-05-12 16:01:39 +02:00
Nino
190d0786e0 fix(oms-data-access): unify electronic and nonbook item condition labels
Harmonize electronic device and nonbook item condition labels to consistently
use "Geöffnet/Defekt" instead of "Geöffnet/Beschädigt" or "Beschädigt/Fehldruck".
Also remove redundant defect verification question for electronic devices since
the condition label already indicates this state.

Additionally, add product features to receipt item data in return receipts to
ensure proper product information is available for returns processing.

Ref: #5083
2025-05-12 15:10:47 +02:00
Nino
0ec1457ffc fix(oms-data-access): simplify return receipt values schema
Replace separate type extension with direct schema definition by adding
otherProduct field to the ReturnReceiptValuesSchema. This eliminates
redundant type definition and improves type safety by ensuring all
fields are properly validated through the Zod schema.

Ref: #5082
2025-05-12 14:32:59 +02:00
Nino
a978f94519 feat(oms-task-list): simplify filter logic
Simplify the task list filter logic by using a cleaner object literal approach
instead of nested properties. This improves readability and maintainability of
the filtering conditions.

Ref: #5072
2025-05-12 14:03:46 +02:00
Nino
71ee7ea842 fix(oms-data-access), fix(return-process), fix(return-summary): filter out ineligible items from return process submission
This commit makes several important changes to ensure only eligible items
are processed during return submission:

1. ReturnProcessService now filters out ineligible items before submission
2. Fixed canContinueToSummary logic to check if ANY item is eligible (not ALL)
3. Added conditional rendering to return-summary-item to display error state
   for ineligible items

These changes prevent system errors when attempting to process returns
that don't meet eligibility criteria while still allowing partial returns
when at least one item is eligible.

Ref: #5084
2025-05-12 13:43:49 +02:00
Nino
d0220b6246 Merge branch 'develop' into release/4.0 2025-05-09 17:26:47 +02:00
Nino
a8c5e8feb5 feat(oms-return-process): improve product search error handling and feedback
Enhance the ReturnProcessProductQuestion component with better error handling:
- Add proper display of "no product found" message when search returns no results
- Add validation feedback for invalid EAN inputs
- Refactor status handling from a simple boolean to a more descriptive object
- Remove unnecessary complete handler in favor of explicit state management

Ref: #4979
2025-05-09 17:25:37 +02:00
Nino
1b9e70141b feat(oms-data-access): implement return eligibility for electronic devices
Add new helper function isElektronischeGeraeteEligibleForReturn to determine
if electronic devices are eligible for returns based on item condition and
receipt date. Update ReturnProcessService to use this helper for electronic
device category.

This implementation checks if devices in original packaging with receipts
older than 100 days are not eligible for return.

Ref: #4978
2025-05-09 15:22:37 +02:00
Nino
bdc711926c feat(oms-return-details): improve boolean coercion for return eligibility check
Replace direct Boolean() casting with Angular's coerceBooleanProperty to ensure consistent
boolean type coercion when determining if items can be returned. This improves type safety
and provides more predictable behavior for string-based boolean values in item actions.

Ref: #5067
2025-05-09 14:28:51 +02:00
Nino
74531a7ddc Small Fix ElibigleItems 2025-05-09 14:12:25 +02:00
Nino
32336ba5b4 Update index file return data-access 2025-05-09 12:13:25 +02:00
Nino
1f26d5285b Merge branch 'develop' into release/4.0 2025-05-09 12:12:19 +02:00
Nino
202ceb0b22 Unit Test Quick Fix 2025-05-08 18:38:44 +02:00
Nino
693d1af51b feat(oms-data-access, oms-task-list): implement query token filtering for task lists
Add support for filter parameters when querying receipt item tasks, allowing
for more refined control over which tasks are displayed. Update the service,
store, and component to use this filtering capability.

- Modify ReturnTaskListService to accept queryToken parameter
- Update ReturnTaskListStore to pass the queryToken to the service
- Enhance ReturnTaskListComponent to construct appropriate filter based on appearance
- Fix spelling of "Non-Book" in ProductCategory constant

Ref: #5072
2025-05-08 18:07:59 +02:00
Nino
78880fb2f4 Swagger API Update 2025-05-08 17:59:50 +02:00
Nino
d887c4e8fe fix(oms-data-access), fix(oms-return-process): implement return eligibility logic for specific product types
Add helper functions to determine product return eligibility based on item condition
and defect status. Specifically implemented return logic for TonDatentraeger products
where damaged but non-defective items aren't eligible for return. Also added export
for the eligibility helper in the index file.

Update the ReturnProcessComponent to check eligibility status before allowing
continuation to summary, ensuring only eligible items proceed in the return workflow.

Ref: #5075
2025-05-08 17:45:58 +02:00
Nino
0fe71fe9d8 fix(oms-data-access), fix(return-process): handle unknown product category in return process
Add support for 'unknown' product category state in ReturnProcessService
and ReturnProcessQuestionsComponent to ensure proper handling of return
processes without a defined product category. This correctly returns
EligibleForReturnState.Unknown and displays the product category dropdown
when needed.

Ref: #5073 #4943
2025-05-08 16:09:01 +02:00
Nino
b4bb5ab979 fix(oms-data-access): make most DeliveredItem fields optional
Update ReturnProcessQuestionSchema for DeliveredItem to make contributors,
format, formatDetail, volume, and manufacturer fields optional instead of
required. This ensures compatibility with the actual data structure received
from the API and prevents validation errors for incomplete product data.

Ref: #5068
2025-05-07 17:11:17 +02:00
Nino
bd19ec8489 feat(oms-task-list): improve task filtering and sorting logic
- Filter completed tasks to show only those completed today in review view
- Sort task list to show open tasks before completed tasks
- Add date-fns functions (isSameDay, parseISO) to handle date comparison
- Refactor filtering logic for better readability and maintainability

Ref: #4942
2025-05-07 15:58:27 +02:00
Nino
2bbf3d3739 fix(oms-return): centralize name formatting logic
Extracted common name formatting code into a reusable utility function to ensure
consistent display of customer/organization names across return feature components.
This improves maintainability and ensures consistent presentation throughout the
application.

Ref: #5066
2025-05-07 12:30:16 +02:00
Nino
e49d084439 fix(oms-data-access): make catalogProductNumber optional in DeliveredItem schema
Make the catalogProductNumber field optional in the ReturnProcessQuestionSchema for DeliveredItem
to match actual API response data structure and prevent validation errors when processing items
without this field.

Ref: #5068
2025-05-07 12:12:01 +02:00
Nino
5f31842afa feat(oms-task-list, oms-data-access): rename and enhance return review components to task list
Rename and refactor return review components to task list throughout the codebase:
- Rename ReturnReviewService to ReturnTaskListService with improved error handling
- Rename ReturnReviewStore to ReturnTaskListStore and add logging
- Update TaskActionType interface with new updateTo and actions properties
- Enhance ReturnTaskListItemComponent to support dynamic task actions
- Update templates to use new action structure and naming

The refactoring improves code organization and readability while enhancing the
task list functionality with better action handling and error management.

Ref: #4942 #4973
2025-05-06 17:48:58 +02:00
Nino
81bb8ba72d feat(oms-return-review): add uncompleted tasks dialog and guard
Add dialog component to warn users when they attempt to leave the return review
process with uncompleted tasks. This includes:
- Creating UncompletedTasksDialogComponent with confirmation/cancellation options
- Implementing CanDeactivate guard to check for uncompleted tasks
- Adding guard to return review routes configuration

The dialog gives users the choice to either go back and complete tasks or
leave despite having uncompleted tasks.

Ref: #4976
2025-05-06 17:46:34 +02:00
Nino
68ea22f3d2 OMS Swagger API Update 2025-05-06 13:15:19 +02:00
Nino
7edbe11c65 feat(oms-task-list): implement task action types and specialized UI handling
Enhance the ReturnTaskListComponent and ReturnTaskListItemComponent to:
- Use properly typed TaskActionTypes enum (OK, NOK, PRINT, UNKNOWN) instead of string literals
- Add specialized UI components for different action types
- Implement conditional rendering for task actions based on type
- Improve styling for different task types
- Filter out completed tasks in main view

feat(oms-data-access): add Zod schema validation for return receipts

- Add ReturnReceiptValuesSchema for validation of API payloads
- Implement proper type safety for task action types
- Use schema validation in ReturnProcessService before API calls

Ref: #4942
2025-05-05 17:45:48 +02:00
Nino
82d991fcbc feat(shared-task-list), feat(return-search-main), feat(return-review): create shared task list component and refactor return views
Implement new shared task list component to replace duplicate task list functionality across the application.
Update return review and search views to use the new shared component.

- Create new @isa/oms/shared/task-list library
- Extract task list functionality from return review component
- Add task list to return search main view
- Handle task completion actions through the shared component
- Fix typo in return review success message

Ref: #4942, #4972, #4974
2025-04-30 17:34:24 +02:00
Nino
0d1a65ed4a feat(oms-data-access), feat(return-review): implement task completion in return review
Added updateTaskListItem method to ReturnReviewStore to handle updating
individual task list items. Implemented the UI logic to show/hide the
"Mark as done" button based on completion status and connected the
completeTask method to update the store with the returned result.

Ref: #4942
2025-04-30 14:56:34 +02:00
Nino
c98cbd73b1 feat(oms-data-acess), feat(return-review): implement return review functionality
Add new ReturnReview library with core components and service structure:
- Create ReturnReviewService and ReturnReviewStore for task management
- Extract PrintReceipts functionality into dedicated service
- Implement review page components with task listing and completion
- Add support for receipt item tasks data model
- Update error handling with consistent error types
- Add comprehensive JSDoc documentation throughout

The implementation provides the foundation for the return review workflow,
including task listing and completion functionality.

Ref: #4942
2025-04-29 17:49:11 +02:00
Nino
4c79f2d127 feat(generated-swagger-oms-api): update OMS Swagger API models and services
Add receipt item task-related models and interfaces to support return review
functionality. Add new fields to ReceiptDTO and update ReturnProcessService

Includes:
- New task list models for receipt items
- Receipt service endpoint updates
- Field additions to ReceiptDTO model

Ref: #4942
2025-04-29 14:12:01 +02:00
Nino
61d0030342 feat(return-review): create return review library and connect to routing
Initialize the return-review feature library with basic component structure
and connect it to the existing routing system in both return-process and
return-summary features. Update navigation in ReturnSummaryComponent to
redirect to the review page after successful return completion.

Ref: #4942
2025-04-29 14:05:11 +02:00
Nino
86ed379b38 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-04-28 17:38:18 +02:00
Nino Righi
eba9cec16e Merged PR 1832: #4941 #5049 #5050
#4941 #5049 #5050
2025-04-28 15:36:03 +00:00
Nino
651c65edc7 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-04-28 15:24:12 +02:00
Lorenz Hilpert
809a6e38b3 fix(tests): update initialization test to expect service to be truthy 2025-04-25 20:00:10 +02:00
Lorenz Hilpert
e1ce520711 test(return-process): update initialization test to expect service to be falsy 2025-04-25 19:54:17 +02:00
Lorenz Hilpert
81995e8863 chore(pre-push): remove pre-push test script 2025-04-25 19:53:22 +02:00
Lorenz Hilpert
ae89f1e2f8 chore: update devDependencies and add pretest script
- Added a pretest script to clean up test results using trash-cli.
- Updated @angular-devkit/build-angular from 19.2.6 to ^19.2.9.
- Updated @nx/angular from 20.4.6 to ^20.8.1.
2025-04-25 19:43:36 +02:00
Lorenz Hilpert
75c6170be4 ci: update pre-push hook to run tests instead of CI 2025-04-25 19:26:54 +02:00
Lorenz Hilpert
5db3521a0e feat(tests): add jest-junit reporter for Azure DevOps integration 2025-04-25 19:15:29 +02:00
Lorenz Hilpert
a48ff29051 style(guidelines): change function export style to arrow functions
Replace function declarations with arrow function expressions assigned to constants
for better testability when mocking functions during unit tests.

This makes the codebase more consistent and addresses issues with function mocking.
2025-04-25 17:09:40 +02:00
Lorenz Hilpert
337ef46acb Updated .gitignore and Dockerfile for improved build process.
- 🛠️ **Refactor**: Changed npm install command in Dockerfile for better script handling
- 🗑️ **Chore**: Removed junit.xml from repository
- 🎨 **Style**: Added junit.xml to .gitignore for cleaner project structure
- 🎨 **Style**: Ensured newline at end of file in .gitignore
2025-04-25 12:06:15 +02:00
Lorenz Hilpert
c0e8e69f9f Updated Jest preset to enhance coverage collection configuration.
- ⚙️ **Config**: Added additional files to coverage exclusion list
2025-04-25 11:11:07 +02:00
Lorenz Hilpert
2046212581 Updated CI configuration and Jest preset for improved coverage reporting.
- ⚙️ **Config**: Modified CI command to include coverage in package.json
- ⚙️ **Config**: Updated summary file location in azure-pipelines.yml
- ⚙️ **Config**: Enhanced Jest preset to configure coverage reporters
2025-04-25 10:59:14 +02:00
Lorenz Hilpert
57968bd061 Updated Node.js version in Dockerfile for improved compatibility.
- ⚙️ **Config**: Changed base image from node:18 to node:22
2025-04-25 10:44:13 +02:00
Lorenz Hilpert
22c0a7d5d9 feat(e2e): add data attributes for improved test stability
Add data-what and data-which attributes to key UI elements:
- Add back button attributes to return details and process components
- Add filter button attributes to the filter menu component
- Add sort button attributes for both desktop and mobile views
- Add result count element attributes for better selection
- Add attributes to search result items for identification
- Add attributes to loading spinners for state verification

These attributes improve E2E test stability by providing reliable selectors
that are not tied to styling or DOM structure changes.

Ref: #5052
2025-04-24 21:39:23 +02:00
Nino
fa5ad7a561 Instructions Update 2025-04-22 12:23:39 +02:00
Lorenz Hilpert
39d101d456 Enhanced logging functionality with improved context handling and documentation.
-  **Feature**: Added support for hierarchical logger context
- 🛠️ **Refactor**: Updated logging methods to use LoggerContext
- 📚 **Docs**: Improved documentation for logger methods and context
2025-04-16 15:35:52 +02:00
Lorenz Hilpert
c9b5af7282 Added error logging guidelines and best practices to code style documentation.
- 📚 **Docs**: Introduced error logging section with guidelines
-  **Feature**: Added context-aware logging examples
- 🛠️ **Refactor**: Improved structure for error handling practices
2025-04-16 14:12:26 +02:00
Lorenz Hilpert
2efc5c3b0d Enhanced logging library with new features and improved performance.
-  **Feature**: Added global context support for logging configuration
- 🛠️ **Refactor**: Improved error handling in logging service
- 🚀 **Performance**: Optimized log level checks and error resilience
- 📚 **Docs**: Updated README with detailed logging levels and usage examples
2025-04-16 14:07:56 +02:00
Lorenz Hilpert
e0edd7887e Merge branch 'feature/core-logger-lib' into develop 2025-04-16 13:20:27 +02:00
Lorenz Hilpert
d615efd806 refactor: remove validation functions and tests for return processes
- Deleted validation functions for electronic devices, nonbook items, and ton/datentraeger.
- Removed associated test files for these validations.
- Updated question definitions to use new constants for item conditions and return reasons.
- Refactored return process service to utilize schema validation instead of custom validators.
- Adjusted HTML templates to reflect changes in eligibility state handling.
2025-04-15 21:39:50 +02:00
Lorenz Hilpert
a608d77ab5 Enhanced Checkbox and Checklist components with detailed documentation.
-  **Feature**: Added customizable appearance options for CheckboxComponent
-  **Feature**: Implemented ChecklistComponent for managing groups of checkboxes
- 📚 **Docs**: Added comprehensive documentation for Checkbox and Checklist components
- 🧪 **Test**: Created unit tests for ChecklistValueDirective and ChecklistComponent
2025-04-15 18:38:55 +02:00
Lorenz Hilpert
fdfff237f2 Added return receipt functionality and updated related models.
-  **Feature**: Introduced ReturnReceiptValuesDTO for return receipt data
-  **Feature**: Added ReceiptCreateReturnReceipt method in ReceiptService
-  **Feature**: Updated ReceiptItemDTO with new fields for handling details
2025-04-14 17:32:01 +02:00
Lorenz Hilpert
def52fde63 Merge tag '5035-scandit-integration-lizenz' into develop 2025-04-14 17:18:27 +02:00
Lorenz Hilpert
0957617b93 Merge branch 'hotfix/5035-scandit-integration-lizenz' 2025-04-14 17:17:42 +02:00
Lorenz Hilpert
a67305369e Update scandit license key in config.integration.json 2025-04-14 17:16:51 +02:00
Lorenz Hilpert
9c74dc15d2 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-04-14 16:14:57 +02:00
Lorenz Hilpert
e65085439e Enhance return process with checklist questions and related components.
-  **Feature**: Added checklist question type for return process
-  **Feature**: Implemented checklist question component
- 🛠️ **Refactor**: Updated return process service to handle checklist answers
- 📚 **Docs**: Added schemas for checklist answers and return details
- 🧪 **Test**: Updated tests for new checklist functionality
2025-04-14 16:13:44 +02:00
Lorenz Hilpert
621a8a5dc7 Refactor return process components for improved naming conventions.
- 🛠️ **Refactor**: Updated component selectors from 'lib-' to 'oms-feature-' for consistency
- 🎨 **Style**: Enhanced formatting and readability in HTML and TypeScript files
2025-04-14 11:43:03 +02:00
Lorenz Hilpert
beeba1004e Enhance documentation for return process components and schemas.
- 📚 **Docs**: Added detailed comments for return process questions and validation logic
- 📚 **Docs**: Improved documentation for return process service methods
- 📚 **Docs**: Updated schemas with descriptions for clarity
2025-04-11 19:21:18 +02:00
Lorenz Hilpert
4885a523ab feat: Implement return process questions and validators for Tolino categories
- Added questions and validation logic for the Tolino return process.
- Introduced Ton-/Datenträger return process questions and validation.
- Created a registry to map product categories to their respective questions and validators.
- Developed unit tests for the new return process questions and validators.
- Removed deprecated return process questions and validators to streamline the codebase.
2025-04-11 19:07:26 +02:00
Nino
f7a8cbf31d Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-04-11 16:59:20 +02:00
Nino
29d5c24e59 UI Datepicker Quick Fixes - Remove Dates + Datepicker Start Month 2025-04-11 16:58:30 +02:00
Lorenz Hilpert
afff1ea8fd Fix typo in date range filter input mapping for minStart and maxStop.
- 🐛 **Fix**: Corrected 'minStrat' to 'minStart' in mapping tests
2025-04-11 16:56:47 +02:00
Lorenz Hilpert
3c43d50f0f Enhance date range filter input mapping with min/max value handling.
-  **Feature**: Added mapping for min and max values in date range input
- 🛠️ **Refactor**: Updated handling of optional min/max properties in mapping function
- 🧪 **Test**: Added unit test for min and max value mapping
2025-04-11 16:54:59 +02:00
Lorenz Hilpert
e04d88f2ce Merge branch 'feature/5032-Filter-Menu-Refinement' into develop 2025-04-11 16:43:11 +02:00
Lorenz Hilpert
a50f02cb5b Merge branch 'develop' into feature/5032-Filter-Menu-Refinement 2025-04-11 16:36:57 +02:00
Lorenz Hilpert
aff6d18888 feat: enhance filter input mappings with detailed documentation and schema validation
- Added comprehensive JSDoc comments to mapping functions for checkbox and text filter inputs, improving code readability and maintainability.
- Refactored checkboxFilterInputMapping and checkboxOptionMapping functions to enhance clarity and structure.
- Removed unused data-range-filter-input mapping files and tests to streamline the codebase.
- Introduced a new dateRangeFilterInputMapping function with detailed mapping logic for date range inputs.
- Updated filter input schemas to include descriptive comments for better understanding of properties.
- Implemented unit tests for date range filter input mapping to ensure correct functionality.
- Enhanced existing filter mapping functions with improved error handling and validation.
- Updated index exports to reflect the removal and addition of mapping files.
2025-04-11 16:13:11 +02:00
Lorenz Hilpert
8144253a18 Refactor return search component and remove unused dropdown.
- 🛠️ **Refactor**: Updated return search result component for mobile responsiveness
- 🗑️ **Chore**: Removed unused order-by dropdown component and related files
- 📚 **Docs**: Enhanced component documentation for clarity
2025-04-11 15:24:08 +02:00
Nino
718918e3dc #5036 Return Details Display Data Adjustments 2025-04-11 15:16:18 +02:00
Lorenz Hilpert
93665cf35d Refactor FilterService and FilterMenuButtonComponent to remove logging. 2025-04-11 15:00:13 +02:00
Lorenz Hilpert
a766534b97 feat(logging): implement core logging library with structured logging service
- Added Core Logging library providing centralized logging functionality.
- Implemented LoggingService with multiple log levels and configurable sinks.
- Created ConsoleLogSink for logging to the browser console.
- Introduced LoggerApi for context-aware logging.
- Added support for custom sinks and logging configuration during app initialization.
- Enhanced FilterService and FilterMenuButtonComponent with logging capabilities.
- Updated ESLint and Jest configurations for the new logging library.
- Documented the logging library API and usage in README.
2025-04-11 14:58:34 +02:00
Nino
82c1861fdc Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-04-11 13:46:48 +02:00
Nino
82e04917b7 UI Datepicker Design Adjustments 2025-04-11 13:44:49 +02:00
Lorenz Hilpert
cdcd41a884 Merged PR 1831: Kundendaten // B2B - nach "Bearbeiten" speichern nicht möglich
fix(customer): Updated Validations for B2B Customer
Conditional Validator - If Organisation Name is set First and Lastname is not required, If no first and last name organisation name is required
Ref: #4996
2025-04-11 10:21:18 +00:00
Lorenz Hilpert
3e14426d2e feat: Implement filter input mapping and related schemas
- Added filter input mapping functionality to handle different input types (Text, Checkbox, DateRange).
- Created schemas for various filter inputs including BaseFilterInput, CheckboxFilterInput, DateRangeFilterInput, and TextFilterInput.
- Developed filter mapping logic to aggregate filter groups, inputs, and order by options.
- Implemented unit tests for filter mapping, input mapping, and order by option mapping to ensure correctness.
- Introduced a dropdown component for selecting order by options with appropriate styling and functionality.
2025-04-10 19:24:45 +02:00
Nino
a93251f082 #4982 #5004 Filter Datepicker QueryParams + QueryToken 2025-04-10 17:31:29 +02:00
Nino
de47c493bf Height Adjust Filter for ipad mini 2025-04-10 15:47:11 +02:00
Nino
23876e3266 Datepicker Filter Design Adjustments 2025-04-10 15:31:51 +02:00
Nino
4ac84df25c ControlValueAccessor Fix UI Datepicker + Unit Tests Added 2025-04-10 14:20:29 +02:00
Nino
c027791e27 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-04-10 12:06:35 +02:00
Nino Righi
3d18e45f59 Merged PR 1828: #5005 Datepicker UI
#5005 Datepicker UI
2025-04-10 10:06:24 +00:00
Nino
03b132fc94 Merge tag '4947-Kundenbestellungen-Namen-Vertauscht' into develop
Cherry-Pick 4947 4947-Kundenbestellungen-Namen-Vertauscht
2025-04-10 11:58:37 +02:00
Nino
206586035d Merge branch 'hotfix/4947-Kundenbestellungen-Namen-Vertauscht' 2025-04-10 11:58:27 +02:00
Nino Righi
67d8902423 Merged PR 1830: #4947 Fix Lastname and Firstname position in order-edit pages 2025-04-10 11:52:45 +02:00
Nino Righi
1c2d0421c4 Merged PR 1830: #4947 Fix Lastname and Firstname position in order-edit pages
#4947 Fix Lastname and Firstname position in order-edit pages
2025-04-10 08:41:37 +00:00
Lorenz Hilpert
b4caf3a177 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-04-09 12:43:06 +02:00
Lorenz Hilpert
ae3662dfd1 Refactor pre-commit and add pre-push hooks for CI checks.
- 🛠️ **Refactor**: Removed CI check from pre-commit hook
-  **Feature**: Added pre-push hook to enforce CI checks
2025-04-09 12:42:04 +02:00
Lorenz Hilpert
291386e4fd Merge tag '5022-Bezahlte-undunbezahlte-Ware-auf-der-seben-AHF-nummer' into develop
Hotfix 5022 - AHF Buchungh von Bezalten und nicht Bezahlten artikeln auf unterschiedliche Abholfächer 5022-Bezahlte-undunbezahlte-Ware-auf-der-seben-AHF-nummer
2025-04-09 12:36:28 +02:00
Lorenz Hilpert
6a7d509aa4 Merge branch 'hotfix/5022-Bezahlte-undunbezahlte-Ware-auf-der-seben-AHF-nummer' 2025-04-09 12:34:59 +02:00
Lorenz Hilpert
620ffae55c Merged PR 1829: Kundendaten // B2B - nach "Bearbeiten" speichern nicht möglich
bugfix: Show error when control has error

Rename validator requiredIfControlIsSet to requireGenderWhenNameIsSet
Update logic for requireGenderWhenNameIsSet
Added JSDoc for Documentation
UiFormControlComponent Subscribing to ngControl.statusChanges and ngControl.valueChanges independendly and call cdr.markForCheck when emitted

Related work items: #4996
2025-04-09 07:30:44 +00:00
Lorenz Hilpert
59ad7710d9 Refactor selectLatestCompartmentCodeAndInfoForOrder to enforce booking rules for paid and unpaid items 2025-04-08 18:21:47 +02:00
Lorenz Hilpert
8ca7977f7c Enhanced return details and search components with new features and improvements.
-  **Feature**: Added InViewport directive for element visibility detection
-  **Feature**: Introduced new button for navigation in return details
- 🛠️ **Refactor**: Improved scroll position restoration logic and removed deprecated files
- 📚 **Docs**: Updated README with usage instructions for new directives

Ref: #5034
2025-04-08 10:51:24 +02:00
Lorenz Hilpert
62d0783e88 Enhance return search store with new methods and hooks for entity management.
-  **Feature**: Added method to remove entities by process ID
-  **Feature**: Implemented onInit hook to clear entities based on process IDs
- 🛠️ **Refactor**: Updated imports for clarity and organization
- 🛠️ **Refactor**: Improved entity management logic in return search store
2025-04-07 19:34:18 +02:00
Lorenz Hilpert
bd1e4f36e1 Enhanced search functionality in ReturnSearch components.
-  **Feature**: Added 'clear' parameter to search method in store
- 🛠️ **Refactor**: Updated search calls in ReturnSearchMain and Result components
- 🎨 **Style**: Improved conditional rendering for apply button in filter actions
2025-04-07 19:20:05 +02:00
Lorenz Hilpert
79356fa130 Refactored import statements for scroll position restoration utility.
- 🛠️ **Refactor**: Removed unused DOCUMENT import from scroll position restoration
2025-04-07 18:53:36 +02:00
Lorenz Hilpert
c1a40ae82f Refactored scroll position restoration logic for improved clarity.
- 🛠️ **Refactor**: Simplified storeScrollPosition function and event handling
- 🛠️ **Refactor**: Removed redundant code for scroll position storage
2025-04-07 18:53:12 +02:00
Lorenz Hilpert
492dae14f7 feat: add pagination support to query token schema with skip and take fields
feat: enhance return search component to handle search callbacks and update query parameters

fix: update return search result component template to use new search method and improve loading states

refactor: streamline return search result component logic and improve state management

feat: implement scroll position restoration in return search feature

feat: introduce filter service enhancements for query settings and synchronization with URL parameters

chore: create utils for scroll position management and viewport detection

fix: update filter service to use new input and query settings types

chore: add tests and configurations for new utils library

ref: #5033
2025-04-07 18:23:43 +02:00
Lorenz Hilpert
9950c76482 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-04-04 21:29:23 +02:00
Lorenz Hilpert
7e7a5ebab9 Introduced responsive layout utilities and directives for Angular.
-  **Feature**: Added breakpoint utility for responsive design
-  **Feature**: Implemented BreakpointDirective for conditional rendering
- 🛠️ **Refactor**: Updated styles for filter and order-by components
- 📚 **Docs**: Created README and documentation for ui-layout library
- ⚙️ **Config**: Added TypeScript and ESLint configurations for the new library
2025-04-04 18:00:49 +02:00
Nino
41fc8e0fb1 Refactored return components for improved performance and maintainability.
- 🛠️ **Refactor**: Streamlined return feature components
- 🗑️ **Chore**: Removed unused files related to return functionality
2025-04-04 14:02:05 +02:00
Lorenz Hilpert
41067a7e54 Added new icons to the product format icon group for additional formats.
-  **Feature**: Included icons for CD, other formats, and games
2025-04-04 11:12:08 +02:00
Lorenz Hilpert
e1a50b0ce0 Refactored filter service and updated query parameter handling.
- 🛠️ **Refactor**: Renamed methods for clarity in filter service
- 🛠️ **Refactor**: Updated query parameter usage in return search components
2025-04-04 10:41:04 +02:00
Lorenz Hilpert
227af192e6 Updated styles for return details component to improve layout.
- 🎨 **Style**: Added margin-top to enhance spacing in the component
2025-04-04 10:30:16 +02:00
Lorenz Hilpert
bd21b674bf Refactored return search components and updated query handling.
- 🛠️ **Refactor**: Changed filter service method calls to use new query methods
- 🎨 **Style**: Updated button components for consistency
- 🧪 **Test**: Adjusted tests to reflect changes in query parameters
- ⚙️ **Config**: Modified pre-commit hook to run CI checks
2025-04-03 21:21:30 +02:00
Lorenz Hilpert
b21395ed61 Refactored return feature components and removed unused files.
- 🛠️ **Refactor**: Cleaned up return feature components and styles
- 🗑️ **Chore**: Deleted obsolete files and updated exports
- 📚 **Docs**: Added README for return details library
2025-04-03 18:45:33 +02:00
Lorenz Hilpert
da27745ebe Implemented return search feature with main and result components.
-  **Feature**: Added return search main and result components
- 🎨 **Style**: Updated styles for return search components
- 🛠️ **Refactor**: Modified routing for return search functionality
- 📚 **Docs**: Updated documentation references in settings
2025-04-03 17:29:42 +02:00
Lorenz Hilpert
8a94da6868 Added return search feature with main and result components.
-  **Feature**: Implemented return search main and result components
- 📚 **Docs**: Created README for return search library
- ⚙️ **Config**: Added TypeScript and Jest configuration for return search
- 🛠️ **Refactor**: Updated filter menu components with scroll strategy
2025-04-03 17:29:05 +02:00
Lorenz Hilpert
81a7154470 Added new models and schemas for gender, address type, and shipping type.
-  **Feature**: Introduced Gender, AddressType, and ShippingType enums
- 🗑️ **Chore**: Removed obsolete schemas and service files from return feature
- 🛠️ **Refactor**: Updated index files to export new models
2025-04-03 11:53:27 +02:00
Lorenz Hilpert
0dee30062f Refactor menu components and styles for improved organization.
- 🛠️ **Refactor**: Removed old menu-button component and styles
-  **Feature**: Added new input-menu and filter-menu components
- 🎨 **Style**: Updated styles for input-menu and filter-menu components
- 🗑️ **Chore**: Cleaned up unused input-button component files
2025-04-02 21:06:11 +02:00
Lorenz Hilpert
eb0a0d3dc3 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-04-02 15:17:14 +02:00
Lorenz Hilpert
67dcb49a1d Enhance UI components with new input control directive and styling.
-  **Feature**: Added InputControlDirective for better input handling
- 🎨 **Style**: Updated button and text-field styles for loading states
- 🛠️ **Refactor**: Improved button component structure and disabled state handling
- 📚 **Docs**: Updated code style guidelines with new control flow syntax
2025-04-02 15:16:35 +02:00
Lorenz Hilpert
f3e2e9fee3 Merged PR 1827: Kundendaten // B2B - nach "Bearbeiten" speichern nicht möglich
Related work items: #4996
2025-04-02 10:02:13 +00:00
Lorenz Hilpert
a4b092a021 Enhance return details service with error handling and tests.
-  **Feature**: Improved error handling in fetchReturnDetails method
- 🧪 **Test**: Added unit tests for ReturnDetailsService
2025-04-02 11:49:04 +02:00
Lorenz Hilpert
aeacd0077f Revert "Update Angular and Nx dependencies to latest versions."
This reverts commit b508abefaf.
2025-04-02 11:45:56 +02:00
Lorenz Hilpert
78a0e828b8 Revert "Enhance return details service with error handling and tests."
This reverts commit df49e3a79b.
2025-04-02 11:38:51 +02:00
Lorenz Hilpert
b508abefaf Update Angular and Nx dependencies to latest versions.
- 🗑️ **Chore**: Updated Angular dependencies to version 19.2.x
- 🗑️ **Chore**: Updated Nx dependencies to version 20.7.0
- 🗑️ **Chore**: Updated devDependencies including Jest and ESLint
2025-04-02 11:32:35 +02:00
Lorenz Hilpert
df49e3a79b Enhance return details service with error handling and tests.
-  **Feature**: Improved error handling in fetchReturnDetails method
- 🧪 **Test**: Added unit tests for ReturnDetailsService
2025-04-02 11:19:58 +02:00
Lorenz Hilpert
34512f3b9a Set up Jest configuration and update dependencies for testing.
- ⚙️ **Config**: Added Jest configuration files for testing
- 🗑️ **Chore**: Removed unused Karma configuration and assets
- 🛠️ **Refactor**: Updated return details store methods for better clarity
- 📚 **Docs**: Enhanced comments and documentation in return details store
2025-04-02 11:09:25 +02:00
Lorenz Hilpert
093bb3b484 Update commit message structure in guidelines
- 📚 **Docs**: Revised commit message instructions for clarity
2025-04-01 17:29:38 +02:00
Lorenz Hilpert
921edf8066 #5022 Hotfix selectors in pickup-shelf-details to improve readability and consistency 2025-04-01 16:17:15 +02:00
Lorenz Hilpert
858242c6dd Enhance searchbox functionality
Improved the searchbox components to utilize environment service for mobile detection.

-  **Feature**: Integrated EnvironmentService for mobile device detection
- 🛠️ **Refactor**: Cleaned up provider definitions for better readability
- 🎨 **Style**: Reformatted code for consistency in style

#5001
2025-04-01 14:42:57 +02:00
Lorenz Hilpert
119bcd9df9 Update routing to redirect to dashboard
Configured the routing to redirect the root path to the dashboard.

-  **Feature**: Added redirect from root path to 'kunde/dashboard'
2025-04-01 14:27:34 +02:00
Lorenz Hilpert
b43d0fcea6 Update routing and side menu interactions
Refactored routing structure and improved side menu functionality.

- 🛠️ **Refactor**: Simplified route definitions for process handling
- 🎨 **Style**: Cleaned up side menu HTML for better readability
- 🛠️ **Refactor**: Enhanced side menu item click handling

#5021
2025-04-01 14:12:09 +02:00
Lorenz Hilpert
ddad3ad967 Add return process answer model and validators
Introduced a new model for return process answers and corresponding validation tests.

-  **Feature**: Created ReturnProcessAnswers type for handling answers
-  **Feature**: Added validation functions for various return scenarios
- 🧪 **Test**: Implemented comprehensive tests for return process validations
2025-04-01 13:59:28 +02:00
Lorenz Hilpert
aaa161424e Enhance error handling and storage utilities
Improved error handling and updated storage utilities for better performance.

-  **Feature**: Added custom error classes for return process errors
- 🛠️ **Refactor**: Updated hash function to handle strings and objects
- 🛠️ **Refactor**: Enhanced storage key generation with user context
- ⚙️ **Config**: Updated VSCode settings and package dependencies
2025-04-01 12:01:16 +02:00
Lorenz Hilpert
3bbec6a68d 📚 Update review instructions for positive feedback
Clarified guidelines for highlighting positive aspects of code reviews.

- 📚 **Docs**: Specify using different funny emojis for good practices
- 🛠️ **Refactor**: Removed redundant good practice example
2025-03-31 17:57:50 +02:00
Lorenz Hilpert
2a8a929fd7 📚 Update code review instructions for clarity
Enhanced the code review guidelines to improve clarity and effectiveness.

- 📚 **Docs**: Expanded review process steps with detailed explanations
- 📚 **Docs**: Added a review template for structured feedback
- 📚 **Docs**: Clarified the use of emojis for categorizing feedback
2025-03-31 17:28:52 +02:00
Lorenz Hilpert
3bcdfccb5c 📚 Update review instructions and code style documentation
Enhanced code review guidelines and clarified code style documentation.

- 📚 **Docs**: Added emphasis on adherence to review guidelines
- 📚 **Docs**: Clarified documentation requirements in code style
- 🛠️ **Refactor**: Updated import paths in input controls styles
- 📚 **Docs**: Expanded tech stack documentation with new libraries
2025-03-31 16:12:48 +02:00
Lorenz Hilpert
9696084f7b Add dropdown component and styles
Introduced a new dropdown component with associated styles and fixed a typo.

-  **Feature**: Added dropdown component and its styles
- 🎨 **Style**: Updated styles for dropdown button and options
- 🐛 **Fix**: Corrected typo in dropdown options class name
2025-03-31 13:38:43 +02:00
Lorenz Hilpert
417bd649e2 Refactor chip option component and styles
Updated the chip option component and its styles for improved functionality and organization.

-  **Feature**: Introduced new chip option styles and layout
- 🛠️ **Refactor**: Removed outdated styles and organized SCSS files
- 🧪 **Test**: Added unit tests for chip option component functionality
2025-03-31 13:28:32 +02:00
Lorenz Hilpert
d38fed297d Add input controls and checkbox component
Introduced a new input controls library with a checkbox component.

-  **Feature**: Added input controls library with checkbox component
- 🎨 **Style**: Updated checkbox component styles and structure
- 🧪 **Test**: Added unit tests for checkbox and empty state components
- 🛠️ **Refactor**: Improved checkbox component code and removed unused styles
- 📚 **Docs**: Updated commit message guidelines in VSCode settings
2025-03-31 12:29:22 +02:00
Lorenz Hilpert
3c110efdfa 📚 Add state management and testing guidelines documentation
Introduced new documentation files for state management and testing guidelines to enhance developer understanding and best practices.

- 📚 **Docs**: Added state management guidelines with local and global state recommendations
- 📚 **Docs**: Created testing guidelines including unit testing requirements and best practices
- 📚 **Docs**: Updated project structure documentation for clarity
2025-03-31 11:52:17 +02:00
Lorenz Hilpert
1cbabd2d7a feat: enhance return process feature with improved layout and EAN validation 2025-03-28 20:35:24 +01:00
Lorenz Hilpert
133020ece1 chore: simplify copilot instructions by removing outdated performance and common patterns sections 2025-03-28 20:16:15 +01:00
Lorenz Hilpert
549d419b69 docs: update TypeScript and Angular guidelines for improved best practices and error handling 2025-03-28 20:03:29 +01:00
Lorenz Hilpert
8bbaf1c70c feat: update button component with spinner support and improve test coverage 2025-03-28 18:08:17 +01:00
Lorenz Hilpert
d0b7c95be2 chore: update copilot instructions to reflect current tech stack 2025-03-28 16:56:40 +01:00
Lorenz Hilpert
b0dba2325d feat: add unit tests for ButtonComponent using Spectator and Jest 2025-03-28 14:20:22 +01:00
Lorenz Hilpert
a9c606ec21 feat: improve return process component error handling and enhance typing 2025-03-28 13:49:58 +01:00
Lorenz Hilpert
81bec4b153 refactor: update import paths and adjust product category type handling 2025-03-27 17:02:25 +01:00
Lorenz Hilpert
0c2feb96ac feat: enhance return process with product category selection and update dropdown functionality 2025-03-27 17:01:00 +01:00
Nino Righi
1855b1970d Merged PR 1826: #5009 #5013 Search Handling and Focus
#5009 #5013 Search Handling and Focus
2025-03-27 12:26:37 +00:00
Lorenz Hilpert
0a46258588 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-26 16:39:07 +01:00
Lorenz Hilpert
ca2e529bdf feat: introduce return process models and enhance return process item component 2025-03-26 16:38:41 +01:00
Nino Righi
82a2d70ce4 Merged PR 1825: #4982 #5003 #4989 Filter Handling + Checkbox UI + Checkbox Input Control
#4982 #5003 #4989 Filter Handling + Checkbox UI + Checkbox Input Control
2025-03-26 12:52:00 +00:00
Lorenz Hilpert
fa39b6d071 fix: update eslint config to correctly ignore generated directories 2025-03-25 17:12:05 +01:00
Lorenz Hilpert
0f3f456909 fix: add missing newlines and improve formatting in various DTO models 2025-03-25 17:11:21 +01:00
Lorenz Hilpert
727e0469ad feat: add cyclic dependency detection in return process service and improve layout in return process item component 2025-03-24 18:27:15 +01:00
Lorenz Hilpert
7e3d6b4e61 feat: enhance progress bar styles with nested transition for improved animation 2025-03-24 16:16:31 +01:00
Lorenz Hilpert
453403cfde feat: add progress tracking for return process questions and update UI to display progress 2025-03-24 16:13:20 +01:00
Lorenz Hilpert
9001850c1f feat: add progress bar component with styles and integration into the application 2025-03-24 15:26:14 +01:00
Lorenz Hilpert
b97ad4f24b feat: refactor return process models and update button styles for improved UI consistency 2025-03-24 14:20:57 +01:00
Lorenz Hilpert
452de44f34 feat: implement user storage provider with clear functionality and update root state service for local storage integration 2025-03-21 11:00:24 +01:00
Lorenz Hilpert
db7da0699e feat: add data access and feature libraries for return process, including models, schemas, and routes 2025-03-20 21:25:20 +01:00
Lorenz Hilpert
fbd5414e47 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-18 17:11:08 +01:00
Lorenz Hilpert
5310619211 feat: add dropdown component with appearance options and styles 2025-03-18 17:10:49 +01:00
Nino
edbdba6868 Searchbar Update + Storybook Update 2025-03-17 17:07:31 +01:00
Nino
2d5fce8554 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-14 17:51:35 +01:00
Nino
f5b7da5bd2 Checkbox Init Implementation, Small Improvements 2025-03-14 17:51:07 +01:00
Lorenz Hilpert
d4c1cdbc6e feat: add appearance control to checkbox component stories 2025-03-14 16:14:03 +01:00
Lorenz Hilpert
576d439a79 feat: update button styles to enhance icon visibility in disabled state 2025-03-14 16:00:45 +01:00
Lorenz Hilpert
00fc978c4f feat: enhance return details with checkbox selection and select all functionality 2025-03-14 15:50:33 +01:00
Lorenz Hilpert
44e596327e Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-14 14:22:43 +01:00
Lorenz Hilpert
3d95bddb23 feat: enhance return details UI with improved styling and conditional rendering 2025-03-14 14:22:13 +01:00
Nino
2210aeb1c2 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-14 12:23:21 +01:00
Nino
a2b6847898 Removed Console.logs, Fixed Browser Back Button -> Navigation for Search Results now in Parent Component, Wording Fix 2025-03-14 12:22:53 +01:00
Lorenz Hilpert
3f252639d5 feat: implement gender schema and enhance receipt-related schemas; add dynamic order group data component 2025-03-14 12:00:23 +01:00
Lorenz Hilpert
3f7df0f748 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-13 21:24:00 +01:00
Lorenz Hilpert
703090eabd feat: add core storage and scroll position libraries with initial implementations and configurations 2025-03-13 21:22:43 +01:00
Nino
33694357bd Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-13 18:16:48 +01:00
Nino
91668e53fa OrderBy Toolbar mobile, ScrollPos Update, Schema Update 2025-03-13 18:15:36 +01:00
Lorenz Hilpert
39e4efff2b feat: enhance return details component with dynamic pricing and improved layout; add new price and VAT schemas 2025-03-13 16:01:36 +01:00
Lorenz Hilpert
1a4d0a38da Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-12 22:20:28 +01:00
Lorenz Hilpert
6c4641d2b7 feat: update entity container schema to allow optional fields; enhance return details component with dynamic product data and improved layout 2025-03-12 22:19:56 +01:00
Nino
815523b4ca Adjustments Dania 2025-03-12 17:54:16 +01:00
Lorenz Hilpert
57b5f30a66 refactor: rename entityContainerSchema to EntityContainer and update usage in receipt schema; change checkbox selector for consistency 2025-03-12 16:47:09 +01:00
Lorenz Hilpert
94919efd83 feat: refactor checkbox component to support bullet appearance; update styles and selector 2025-03-12 16:34:21 +01:00
Lorenz Hilpert
cd0d740dc2 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-12 16:18:37 +01:00
Lorenz Hilpert
dc3970ceea style: update gap in client row component for improved layout 2025-03-12 16:16:00 +01:00
Lorenz Hilpert
5bba1dff8f feat: add schemas and utility functions for return processing; update styles and component structure 2025-03-12 16:13:47 +01:00
Nino
7ff6e9495e QueryToken Schemas + Store Update, Ipad Stylings Layout, Bugfix mergeQueryParams, Bugfix List should not Reload if Hits Reached 2025-03-12 15:24:05 +01:00
Michael Auer
04403179d7 ~ nginx.conf: added "/browser" to try_files 2025-03-11 18:22:39 +01:00
Michael Auer
a39706bff3 Merge tag 'traefik-ingressroute-with-path' into develop 2025-03-11 18:06:01 +01:00
Michael Auer
0ac34740bb Merge branch 'hotfix/traefik-ingressroute-with-path' 2025-03-11 18:05:31 +01:00
Nino
24c2c1c77d Order By Styling Update, Search Bar Clear Added 2025-03-11 17:49:39 +01:00
Nino
a364a4f0e0 Result List Empty State - Initial Loader - Pending Loader 2025-03-11 17:06:19 +01:00
Nino
dcc70745da Scroll Pos Handling Update 2025-03-11 16:28:17 +01:00
Nino
effce6f41c Improvements to Search Request Handling - F5 Refresh Page Init Search Fixed 2025-03-11 16:08:24 +01:00
Nino
a5feaba5e3 #4977 Search / Results Update - Scrollpos - Reload fix 2025-03-11 15:10:59 +01:00
Nino
d8bb42b8c6 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-10 18:50:56 +01:00
Nino
f74494f34e Paging/Reload, Searchbar and Icon Update 2025-03-10 18:49:10 +01:00
Lorenz Hilpert
abce5f43e2 feat: add ProductImage directive and service; implement storybook for product image component 2025-03-10 17:10:11 +01:00
Lorenz Hilpert
ce4a6b36b6 feat: add Checkbox component with styling and stories; update process resolver to include tags 2025-03-10 15:23:37 +01:00
Lorenz Hilpert
298ea042f2 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-10 13:51:26 +01:00
Lorenz Hilpert
573d6a740e feat: add InfoButton component with styling and functionality; update process schemas to include tags 2025-03-10 13:50:53 +01:00
Lorenz Hilpert
8eb5e09490 feat: enhance canActivate guard to use zod for process ID validation 2025-03-10 10:57:54 +01:00
Nino
aa8869ceb1 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-07 18:09:29 +01:00
Nino
e5f42c9de2 Header 2025-03-07 18:09:02 +01:00
Lorenz Hilpert
532c7e5e86 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-07 16:42:39 +01:00
Lorenz Hilpert
30ccd93967 feat: add core-scanner library with initial implementation and configuration 2025-03-07 16:42:23 +01:00
Nino
b85538f98a Quick Fix Schema to Array 2025-03-07 16:36:11 +01:00
Nino
d9dede4341 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-07 16:32:38 +01:00
Nino
4a3c934fe0 Utils Lib angelegt, safeParse Funktion ausgelagert und eingebunden in return service 2025-03-07 16:31:47 +01:00
Nino
944fb8a186 Code improvements, Details Page + Routing 2025-03-07 16:07:24 +01:00
Lorenz Hilpert
73fd487a13 feat: add ui-toolbar component and update button components 2025-03-07 15:51:17 +01:00
Lorenz Hilpert
592027f648 feat: implement new feature for enhanced user navigation 2025-03-07 10:53:08 +01:00
Lorenz Hilpert
84243ac4e6 feat: add EmptyState component with styles and stories 2025-03-06 20:24:06 +01:00
Nino
04b9422d5d #4977 Result Page 2025-03-06 18:25:30 +01:00
Nino
584cb63eaf Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-06 17:39:28 +01:00
Nino
b9871bba54 #4977 Handling Search Results + Navigation 2025-03-06 17:38:37 +01:00
Lorenz Hilpert
6769e3864e Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-06 17:24:30 +01:00
Lorenz Hilpert
cebb644da9 feat: implement ClientRow and ItemRowData components with associated styles and stories 2025-03-06 17:23:51 +01:00
Nino
734a7b8739 #4994 Receipt Schema erweitert 2025-03-06 11:07:03 +01:00
Lorenz Hilpert
e89d1999a6 feat: add ui-item-rows library with initial component and configuration 2025-03-05 19:51:09 +01:00
Lorenz Hilpert
b7cbd50e83 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-05 19:47:45 +01:00
Lorenz Hilpert
76aa04bc4c feat: add core-config and shared-product-image libraries; implement initial structure and configuration 2025-03-05 19:47:27 +01:00
Nino
b951cf7024 #4994 Store Anbindung in die Komponente 2025-03-05 18:25:01 +01:00
Nino
f896d91ebb Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-03-05 18:04:48 +01:00
Nino
a884adc3a9 #4994 Process Handling + Schema Update 2025-03-05 18:04:15 +01:00
Lorenz Hilpert
ce9bc9511a feat: remove deprecated shared return library; clean up related files and configurations 2025-03-05 15:55:10 +01:00
Lorenz Hilpert
2653322232 feat: enhance filter functionality; update search handling and state management in filter service 2025-03-05 15:46:12 +01:00
Lorenz Hilpert
86eb0bb494 feat: refactor return feature components; remove deprecated files and implement new search bar input 2025-03-05 12:08:48 +01:00
Lorenz Hilpert
73be50e7d2 feat: implement new text field and button components; remove deprecated search bar and input controls 2025-03-03 21:02:21 +01:00
Lorenz Hilpert
da5151df78 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-03-03 14:22:56 +01:00
Lorenz Hilpert
df47b932b6 Upgrade isa-app project 2025-03-03 13:28:03 +01:00
Nino
c096609a27 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-02-28 17:55:05 +01:00
Nino
6b07b322f4 ISA Typography Update 2025-02-28 17:54:40 +01:00
Lorenz Hilpert
1b821db248 refactor: replace UiButtonsComponent with standalone button component and remove deprecated files 2025-02-28 17:18:21 +01:00
Lorenz Hilpert
ecf446671c refactor: reorganize process module structure and remove deprecated files 2025-02-28 16:24:44 +01:00
Lorenz Hilpert
a2f204d0d6 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-02-28 16:23:20 +01:00
Lorenz Hilpert
c8678b7e91 feat: enhance process management with injector functions and service updates 2025-02-28 16:20:34 +01:00
Nino
ec41738def Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2025-02-28 16:15:53 +01:00
Nino
53a7f01507 Icons Update 2025-02-28 16:13:38 +01:00
Lorenz Hilpert
7366f038e5 feat: create core process library with initial setup and routing configuration 2025-02-28 16:02:44 +01:00
Lorenz Hilpert
1c9cd2a0b0 feat: add UI component libraries for buttons, input controls, and search bar 2025-02-28 14:28:24 +01:00
Michael Auer
591824196b Cherry-Pick: PR 1824: ISA-Frontend - Expliziter Pfad für Traefik IngressRoute
(cherry picked from commit c9b2762bbc)
2025-02-28 11:15:20 +01:00
Michael Auer
be0bff0535 Cherry Pick: PR 1824: ISA-Frontend - Expliziter Pfad für Traefik IngressRoute
(cherry picked from commit c9b2762bbc)
2025-02-28 09:36:06 +01:00
Lorenz Hilpert
09aa3f09cb Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2025-02-27 17:10:58 +01:00
Lorenz Hilpert
eff67b9a06 feat: create icons library with initial configuration and setup 2025-02-27 17:10:19 +01:00
Michael Auer
c9b2762bbc Merged PR 1824: ISA-Frontend - Expliziter Pfad für Traefik IngressRoute
Früher wurde die IngressRoute für die ISA-UI mit dem Pfad "/" angelegt, jetzt mit "/isa-ui/v%MAJOR%"
2025-02-27 14:05:54 +00:00
Lorenz Hilpert
c49b0625c1 fix: update Tailwind CSS configuration for consistency and add new color shades 2025-02-26 18:14:38 +01:00
Lorenz Hilpert
42451e2144 chore: update ESLint and Prettier configurations, add eslint-plugin-prettier, and modify .prettierignore 2025-02-26 17:42:35 +01:00
Lorenz Hilpert
f52fb00df7 chore: update pre-commit hook, modify prettier ignore, and add Sheriff configuration 2025-02-26 17:02:42 +01:00
Lorenz Hilpert
b485bb768c feat: add feature return library components and Jest configuration 2025-02-24 15:43:16 +01:00
Lorenz Hilpert
3f77646f8a chore: prettier write 2025-02-24 15:29:32 +01:00
Lorenz Hilpert
eb6149a6e3 Merge branch 'nx-workspace-migration' into develop 2025-02-24 15:26:32 +01:00
Lorenz Hilpert
5aa98bd90b Merge branch 'tracking' into nx-workspace-migration 2025-02-24 15:25:16 +01:00
Lorenz Hilpert
d71404f400 chore: remove unused assets and story files from isa-app 2025-02-24 14:40:56 +01:00
Lorenz Hilpert
f68eb33852 refactor: update memorize decorator to use 'any' type and remove migrations.json 2025-02-24 14:26:11 +01:00
Lorenz Hilpert
39d790c121 Angular Migrations to 19 2025-02-24 13:51:42 +01:00
Lorenz Hilpert
10349409fb bump nx and related packages to version 20.4.6 2025-02-24 13:41:42 +01:00
Lorenz Hilpert
0dc02abc8a Merge branch 'develop' into nx-workspace-migration 2025-02-24 13:37:39 +01:00
Lorenz Hilpert
cb7391e66f Update version numbers in azure-pipelines.yml to 4.0 2025-02-10 10:43:23 +01:00
Lorenz Hilpert
388346e21b Merge tag '3.4' into develop
Finish Release 3.4 3.4
2025-02-10 10:41:31 +01:00
Lorenz Hilpert
1847c6944e Merge branch 'release/3.4' 2025-02-10 10:41:14 +01:00
Lorenz Hilpert
fd11cf19e4 Update imports to use generated Swagger API paths 2025-01-29 17:43:20 +01:00
Lorenz Hilpert
8e7b067310 Add new model types for Swagger APIs and remove obsolete models 2025-01-29 17:28:33 +01:00
Lorenz Hilpert
c6a174d93f Add new model definitions for various APIs in generated Swagger files 2025-01-29 17:16:58 +01:00
Lorenz Hilpert
9efbfab253 Update .gitignore and .prettierignore; add generated Swagger API libraries 2025-01-29 17:09:36 +01:00
Lorenz Hilpert
d474f555e3 Add caniuse-lite dependency to package.json 2025-01-29 15:39:39 +01:00
Lorenz Hilpert
c59a09c252 Migration Angular CLI to NX 2025-01-29 15:37:46 +01:00
Lorenz Hilpert
f743ce59fa #4922 Rename customer_name to customer_no in goods service and pickup shelf service
(cherry picked from commit ca998c0685)
2025-01-15 11:28:56 +01:00
Lorenz Hilpert
99feb499a2 Update Scandit licence key for staging environment 2025-01-02 13:41:02 +01:00
Lorenz Hilpert
6d28662431 Update Scandit licence key in configuration files 2025-01-02 13:38:26 +01:00
Lorenz Hilpert
27174e4ed3 Update Scandit licence key in configuration files 2025-01-02 13:26:54 +01:00
Nino
9b1b2c4682 Angular Service Worker insert Bypass in Req Header for Network Req 2024-12-20 16:28:35 +01:00
Lorenz Hilpert
674e2b7e1b Paket fuehrt zu fehler bei der installation
@rollup/rollup-linux-x64-gnu
2024-12-09 10:55:20 +01:00
Lorenz Hilpert
035abde3c3 Merge branch 'release/3.4' into develop 2024-12-06 10:45:48 +01:00
Lorenz Hilpert
ca998c0685 #4922 Rename customer_name to customer_no in goods service and pickup shelf service 2024-12-05 16:43:09 +01:00
Lorenz Hilpert
bb5b6e2e59 Update Scandit licence key for staging environment 2024-12-05 16:35:45 +01:00
Lorenz Hilpert
f57988f83e Update Scandit Licence Key for production 2024-12-05 15:38:24 +01:00
Lorenz Hilpert
17a68b9dbb Merged PR 1823: #4895 - Add download availability to article details component and update pri...
#4895 - Add download availability to article details component and update price mapping logic
2024-11-28 16:49:28 +00:00
Lorenz Hilpert
b6aab4f743 Add ID to assortment filter button in price update component 2024-11-28 17:13:20 +01:00
Nino Righi
a0c8035dbb Merged PR 1820: Fix - Close dropdown after selecting a reason in add product modal
Fix - Close dropdown after selecting a reason in add product modal
2024-11-27 14:21:12 +00:00
Nino Righi
34e96f0751 Merged PR 1821: Refactor getCachedData method to be asynchronous and improve cache handling
Refactor getCachedData method to be asynchronous and improve cache handling
2024-11-27 14:20:25 +00:00
Lorenz Hilpert
9ba05253e9 Enhance select component to register options on initialization and remove debug log 2024-11-27 11:52:02 +01:00
Lorenz Hilpert
98a9346c1a Refactor customer number handling and add combined observable for customer number and selected order item changes 2024-11-27 11:43:49 +01:00
Lorenz Hilpert
fa66d2389a Improvements - Um Cover Items die nicht zur ausgeäjlten bestellung gehören zu filtern 2024-11-26 17:02:57 +01:00
Lorenz Hilpert
6743c8e630 Fix #4891 Kundendaten erfassen // Land bei Lieferung nicht auswählbar 2024-11-26 16:56:50 +01:00
Lorenz Hilpert
f62e198aed Fix - Nachbestellen - Dropdown wird nun nach der Auswahl geschlossen und Button Bestellen ist wieder klickbar 2024-11-26 16:34:32 +01:00
Nino
387e6b08ed Remove unused selectedCompartmentInfo properties from PickupShelfOutDetailsComponent 2024-11-25 17:31:49 +01:00
Lorenz Hilpert
721fd06c76 Remove console logs from beforeFetchCoverOrderItems and fetchCoverOrderItemsDone methods in PickupShelfDetailsStore 2024-11-25 16:51:43 +01:00
Lorenz Hilpert
0fcdb308b5 Remove Scandit overlay component and enhance error handling in ScanditScanAdapter; add logging for order item fetching in PickupShelfDetailsStore and list components 2024-11-25 16:50:15 +01:00
Lorenz Hilpert
5492329a21 Merge branch 'master' into release/3.4 2024-11-25 16:26:54 +01:00
Nino
f97253e82a Refactor distinctUntilChanged to use a custom equality check in pickup-shelf-details.store.ts 2024-11-25 15:31:24 +01:00
Nino
b926efb635 #4885 Compartment Info Bugfix 2024-11-25 15:23:36 +01:00
Lorenz Hilpert
1becbec412 Merge tag 'scandit-package-replacement' into develop
Scandit Lizenz und Package upgrade scandit-package-replacement
2024-11-25 14:04:57 +01:00
Lorenz Hilpert
cdc2553d73 Merge branch 'hotfix/scandit-package-replacement' 2024-11-25 13:56:08 +01:00
Lorenz Hilpert
8781c50e34 Merge branch 'master' into release/3.4 2024-11-25 13:50:34 +01:00
Lorenz Hilpert
05eb3cc756 Revert "Refactor ScanditOverlayComponent to use dependency injection for DataCaptureContext and DataCaptureView, and enhance module setup with async context initialization"
This reverts commit 6e1c434edf.
2024-11-22 18:31:05 +01:00
Lorenz Hilpert
6e1c434edf Refactor ScanditOverlayComponent to use dependency injection for DataCaptureContext and DataCaptureView, and enhance module setup with async context initialization 2024-11-22 18:23:05 +01:00
Lorenz Hilpert
ed8e937924 Update Scandit license keys across configuration files 2024-11-22 17:26:27 +01:00
Lorenz Hilpert
1bd17fd887 Update Scandit integration to use new SDK, adjust TypeScript configuration, and refine overlay component styles 2024-11-22 16:19:32 +01:00
Lorenz Hilpert
c35c82eaab Update Scandit license keys in configuration files 2024-11-21 14:16:58 +01:00
Lorenz Hilpert
258faec021 Refactor login strategy to conditionally trigger mobile device login 2024-11-19 16:55:00 +01:00
Lorenz Hilpert
4bcc523480 Update login strategy to always trigger mobile device login and prevent backdrop closing on modal 2024-11-19 16:31:55 +01:00
Lorenz Hilpert
8900a77d7a Enhance PickupShelfInDetailsComponent with signals for order items and optimize fetching logic 2024-11-19 16:27:18 +01:00
Lorenz Hilpert
895e2bd2ec Merge tag 'Abholfach-zubuchen-und-Coveransicht' into develop
Abholfach-zubuchen-und-Coveransicht Abholfach-zubuchen-und-Coveransicht
2024-11-19 13:54:23 +01:00
Lorenz Hilpert
4b10dd96d9 Merge branch 'hotfix/abholfach-zubuchen-und-cover-items' 2024-11-19 13:50:36 +01:00
Lorenz Hilpert
1126e4f0c1 Import tapResponse alongside ComponentStore in pickup-shelf-details.store.ts 2024-11-19 13:50:15 +01:00
Lorenz Hilpert
e9f24a88d6 Refactor PickupShelfInDetailsComponent to use signals for customer number and update fetch logic 2024-11-19 13:48:33 +01:00
Lorenz Hilpert
f30de35d51 Enhance authentication flow by improving error handling and validating ID tokens before login 2024-11-19 13:42:54 +01:00
Lorenz Hilpert
0c6f8abbad Fix login strategy condition to properly check for mobile devices 2024-11-18 13:49:32 +01:00
Lorenz Hilpert
54b37436eb Refactor authentication handling to utilize LoginStrategy and improve error management 2024-11-18 13:48:58 +01:00
Lorenz Hilpert
02bae79e4a Merged PR 1819: #4844 Implement dev-scanner configuration and enhance app initialization process
#4844 Implement dev-scanner configuration and enhance app initialization process
2024-11-13 17:09:34 +00:00
Lorenz Hilpert
cb6779fc83 Bump minor version from 3 to 4 in Azure Pipelines configuration 2024-11-12 17:14:19 +01:00
Lorenz Hilpert
f2c95b6a16 Merge tag '3.3' into develop
Merge branch release/3.3 3.3
2024-11-12 17:05:47 +01:00
Lorenz Hilpert
d48680c59e Merge branch 'release/3.3' 2024-11-12 17:04:15 +01:00
Lorenz Hilpert
775390b5df Add dynamic IDs to filter buttons in filter group component 2024-11-05 13:18:21 +01:00
Lorenz Hilpert
1788f566e3 Add filter buttons with unique IDs in package result component 2024-11-05 11:05:47 +01:00
Nino Righi
d4e1088190 Merged PR 1818: #4836 Small Bugfix
#4836 Small Bugfix
2024-10-31 17:07:26 +00:00
Lorenz Hilpert
a8ecd1f07b Merged PR 1817: Enhance error handling and state management in app module and root state service
Enhance error handling and state management in app module and root state service

Related work items: #4835
2024-10-30 12:14:58 +00:00
Lorenz Hilpert
2c239ac597 Merge branch 'develop' of ssh.dev.azure.com:v3/hugendubel/ISA/ISA-Frontend into develop 2024-10-30 11:47:07 +01:00
Lorenz Hilpert
200eb7f217 Mark NativeScanAdapter and native-container.service as deprecated 2024-10-30 11:46:14 +01:00
Nino Righi
694fc6d084 Merged PR 1816: #4836 Fix Printer Handling on Small Amount Invoice
#4836 Fix Printer Handling on Small Amount Invoice
2024-10-30 10:39:53 +00:00
Lorenz Hilpert
8ae990bcde Merged PR 1815: Angular Update V18
Related work items: #4830, #4834
2024-10-22 09:23:23 +00:00
Lorenz Hilpert
301f5878c2 Refactor button class in pickup-shelf-out-details.component.html 2024-10-18 13:44:58 +02:00
Lorenz Hilpert
39c8a512f4 Merged PR 1814: #4827 Warenausgabe // Bei Workflow Rücklagebestellung mit Business Konto klic...
#4827 Warenausgabe // Bei Workflow Rücklagebestellung mit Business Konto klick auf "abgehollt und Lieferschein drucken" wirft Fehlermeldung
2024-10-17 12:01:43 +00:00
Lorenz Hilpert
f37dfd41f1 Merged PR 1813: Strukturanpassung
Related work items: #4832
2024-10-16 14:07:57 +00:00
Lorenz Hilpert
a518fc50e2 Refactor observables in DomainCatalogService 2024-10-15 13:05:53 +02:00
Lorenz Hilpert
c9236f191b Merged PR 1812: #4825 Refactor publicationDate$ observable in ArticleDetailsComponent
#4825 Refactor publicationDate$ observable in ArticleDetailsComponent
2024-10-14 14:40:51 +00:00
Lorenz Hilpert
d1584d1edb Merged PR 1811: #3693 ISA Übergreifend // Suche Abbrechen
#3693 ISA Übergreifend // Suche Abbrechen

Related work items: #3693
2024-10-14 14:39:09 +00:00
Lorenz Hilpert
5f34b514ef Merged PR 1810: Changed the way observables restore the cache
Changed the way observables restore the cache

Related work items: #4824
2024-10-14 10:09:15 +00:00
Lorenz Hilpert
7a1ef06a4c Merged PR 1809: PDP-EVT-Datum-anpassen
Related work items: #4825
2024-10-11 08:14:12 +00:00
Lorenz Hilpert
acc2f7f664 Merged PR 1808: Bugfix Abruf Key aus IndexedDB
Bugfix Abruf Key aus IndexedDB

Related work items: #4824
2024-10-08 16:22:01 +00:00
Lorenz Hilpert
ad08e999a2 Merged PR 1807: #4825 Refactor article-details.component.ts to format and display the publica...
#4825 Refactor article-details.component.ts to format and display the publication date of an article

Related work items: #4825
2024-10-08 16:15:48 +00:00
Lorenz Hilpert
1d472ce3df (cherry picked from commit 4c027922283bc4113253310c9d47e7c8944427a3) 2024-10-07 19:04:31 +02:00
Lorenz Hilpert
92d760b8b4 Merged PR 1806: Sortiment // Preisänderung // Lange Titel hat mit anderen Text Überschneidung
Related work items: #4801
2024-10-07 15:33:02 +00:00
Nino Righi
1d19779dac Merged PR 1805: #4687 Hotfix Organisation Name Update Order
#4687 Hotfix Organisation Name Update Order
2024-10-07 14:33:04 +00:00
Nino Righi
294be5dcb4 Merged PR 1804: #2573 Fix Validator
#2573 Fix Validator
2024-10-07 14:30:31 +00:00
Nino
90e671d285 #4687 Changes to View, Added Organisation Input Field 2024-10-07 12:07:28 +02:00
Nino Righi
9a2c520ab4 Merged PR 1803: #4822 HSC Quick Fix #4687 HSC, WA, AHF Changes to View, Added Organisation Input Field
#4822 Quick Fix #4687 Changes to View, Added Organisation Input Field
2024-10-04 16:34:54 +00:00
Nino Righi
13d41a7a81 Merged PR 1802: #2573 Postal Code Validation only for Webshop, Webshop+Card and B2B | +Bugfix Determination of B2B Customer in Customer Edit Page
#2573 Postal Code Validation only for Webshop, Webshop+Card and B2B | +Bugfix Determination of B2B Customer in Customer Edit Page
2024-10-04 16:32:52 +00:00
Lorenz Hilpert
79b0a1324c #4816 User State // Local Storage und User State nach Vorgang schliessen prüfen 2024-10-02 11:32:56 +02:00
Lorenz Hilpert
0fd94273ce Merge branch 'indexeddb' into develop 2024-10-02 10:16:49 +02:00
Lorenz Hilpert
44abd4698e #4801 Sortiment // Preisänderung // Lange Titel hat mit anderen Text Überschneidung 2024-10-02 10:14:16 +02:00
Lorenz Hilpert
2b262cc8be #4821 PWA // Offline-Verhalten verbessern (Part 3) 2024-10-01 13:34:44 +02:00
Lorenz Hilpert
5775e444b8 Indexeddb Implementaion 2024-10-01 13:14:25 +02:00
Nino Righi
cdfe88c1cc Merged PR 1801: #4813 Fix Multiple EVT Items
#4813 Fix Multiple EVT Items
2024-09-26 15:53:17 +00:00
Nino Righi
c71d1f8886 Merged PR 1800: #4794 HSC List Update Fix after Action (SilentRefresh)
#4794 HSC List Update Fix after Action (SilentRefresh)
2024-09-26 15:39:40 +00:00
Nino Righi
a09eef038e Merged PR 1799: #2573 Bugfixing and Adjusted Error Message
#2573 Bugfixing and Adjusted Error Message
2024-09-26 15:08:05 +00:00
Nino Righi
f0a0189523 Merged PR 1797: #4813 #4710 Bugfix Preselection Purchase Options
#4813 #4710 Bugfix Preselection Purchase Options
2024-09-25 18:21:33 +00:00
Lorenz Hilpert
4d42c4ea45 Merged PR 1798: PDP // Preis von Hug.Dig anzeigt
PDP // Preis von Hug.Dig anzeigt

Related work items: #4812
2024-09-25 15:18:50 +00:00
Lorenz Hilpert
cad2926c45 Merged PR 1796: #4801 Sortiment // Preisänderung // Lange Titel hat mit anderen Text Überschn...
#4801 Sortiment // Preisänderung // Lange Titel hat mit anderen Text Überschneidung
2024-09-25 15:17:34 +00:00
Nino Righi
161d9c6fea Merged PR 1795: #4608 Customer Form Information Adjustments For Online and CustomerCard Users
#4608 Customer Form Information Adjustments For Online and CustomerCard Users
2024-09-25 11:07:46 +00:00
Nino Righi
1b33258728 Merged PR 1794: #2573 Added Zip Code Validator to Customer Page
#2573 Added Zip Code Validator to Customer Page
2024-09-24 18:00:15 +00:00
Nino Righi
73b6133306 Merged PR 1793: #4813 Show EVT Date if Item has Quantity and EVT exists and is After Todays Date
#4813 Show EVT Date if Item has Quantity and EVT exists and is After Todays Date
2024-09-24 17:56:49 +00:00
Nino Righi
eb6e93149e Merged PR 1792: #4610 Disable Option to Unselect Selected Customer Type
#4610 Disable Option to Unselect Selected Customer Type
2024-09-24 17:51:52 +00:00
Lorenz Hilpert
33fb44f20a Upgrade Version to 3.3 2024-09-24 16:51:36 +02:00
Lorenz Hilpert
8723f7aa7e Merge tag '3.2' into develop
Finish Release 3.2 3.2
2024-09-24 16:47:21 +02:00
Lorenz Hilpert
03815586f7 Merge branch 'release/3.2' 2024-09-24 16:47:03 +02:00
Nino Righi
86a11ff07a Merged PR 1791: #4715 Disable option for Staff to Add new Billing Adresses and only show the...
#4715 Disable option for Staff to Add new Billing Adresses and only show the very first attached to their accounts
2024-09-24 14:25:48 +00:00
Nino Righi
41be8533dc Merged PR 1790: #4776 Suchbegriff in der Artikelsuche soll bei Klick auf Filter bestehen blei...
#4776 Suchbegriff in der Artikelsuche soll bei Klick auf Filter bestehen bleiben (Trefferliste)
2024-09-24 13:42:17 +00:00
Nino Righi
186afbc828 Merged PR 1789: #4687 WA, Abholfach, HSC - First and Lastname Update on Buyer just on Order
#4687 WA, Abholfach, HSC - First and Lastname Update on Buyer just on Order
2024-09-24 13:39:57 +00:00
Nino Righi
c3561339a9 Merged PR 1788: #4794 Adjusted Route Error Handling
#4794 Adjusted Route Error Handling
2024-09-24 13:01:43 +00:00
Nino Righi
5312073184 Merged PR 1787: #4710 Initially Select All Possible Items Inside Purchase Options Modal
#4710 Initially Select All Possible Items Inside Purchase Options Modal
2024-09-24 12:45:49 +00:00
Lorenz Hilpert
4dfe3bfa11 Merge tag 'KameraOffline' into develop
Kamera kann nur geöffnet werden wenn man Online ist. KameraOffline
2024-09-24 14:39:19 +02:00
Lorenz Hilpert
9b7a1b1c21 Merge branch 'hotfix/skip-open-camera-when-offline' 2024-09-24 14:39:11 +02:00
Lorenz Hilpert
a290d3b249 Kamera öffnet sich nur wenn man Online ist 2024-09-24 14:37:48 +02:00
Lorenz Hilpert
ad348af551 Merge branch 'master' into release/3.2 2024-09-17 10:56:13 +02:00
Lorenz Hilpert
f1bdba5d10 Merge tag 'online-offline-verhalten' into develop
Merge Online Offline Verhalten online-offline-verhalten
2024-09-16 16:46:38 +02:00
Lorenz Hilpert
c4134e7f99 Merge branch 'hotfix/online-offline-network' 2024-09-16 16:46:28 +02:00
Lorenz Hilpert
b7a16f5d30 IPad 6 Fehlermeldung word wrap 2024-09-16 14:39:00 +02:00
Lorenz Hilpert
4105709286 Added Styles instead of classes for word wrapping 2024-09-16 14:23:11 +02:00
Lorenz Hilpert
0c3b322fbd Ipad 4 Error Anzeige 2024-09-16 13:31:00 +02:00
Lorenz Hilpert
12096754c7 Set Max Screen Width Error 2024-09-16 12:28:25 +02:00
Lorenz Hilpert
453d921a99 Nachricht angepasst 2024-09-16 11:54:52 +02:00
Lorenz Hilpert
bad05fd098 Offline und Online Banner
Initialisierung Wartet auf Netzwerk
2024-09-13 17:30:08 +02:00
Lorenz Hilpert
363daf1e35 console.log entfernt 2024-09-13 16:08:21 +02:00
Lorenz Hilpert
e0cb0974cf Initialisierung gibt ein Feedback an den Benutzer aus. Feedback wenn Benutzer offline ist. 2024-09-13 16:05:54 +02:00
Lorenz Hilpert
c3d9274766 Merge branch 'hotfix/pwa-camera-dialog-size' 2024-09-13 11:03:04 +02:00
Lorenz Hilpert
bc16b841fb Kamera Overlay Größe
(cherry picked from commit d5dc4e053d)
2024-09-13 11:02:30 +02:00
Lorenz Hilpert
d5dc4e053d Kamera Overlay Größe 2024-09-12 18:03:07 +02:00
Lorenz Hilpert
3c6833988c Change Variables in pipeline Minor from 1 to 2 2024-09-04 17:58:00 +02:00
Lorenz Hilpert
28fb4ebb48 Merge tag '3.1' into develop 2024-09-04 17:56:06 +02:00
Lorenz Hilpert
2118bd996a Merge branch 'release/3.1' 2024-09-04 17:52:55 +02:00
Lorenz Hilpert
8a6448cc17 Merge branch 'develop' into release/3.1 2024-08-19 15:01:59 +02:00
Lorenz Hilpert
f2c7d57ad6 Fix Remi Filter 2024-08-16 14:17:11 +02:00
Lorenz Hilpert
9c9ddfaeec #4774 Remi // Wannennummer nur einmal am Tag benutzbar 2024-08-14 15:45:39 +02:00
Lorenz Hilpert
6eaa347de5 Merge branch 'master' into develop 2024-08-13 11:04:36 +02:00
Lorenz Hilpert
a16f355396 Merge branch 'hotfix/scandit-lizenz-erneuern' 2024-08-13 11:02:16 +02:00
Lorenz Hilpert
8b8db6e335 Update Scandit Lizenz 2024-08-12 13:39:32 +02:00
Lorenz Hilpert
06e248d615 Kundensuche abbrechen 2024-06-27 15:47:41 +02:00
Lorenz Hilpert
67cf380948 Update Matomo Docker Konfiguration 2024-06-25 14:06:18 +02:00
Lorenz Hilpert
e0ae79bc2a Update Docker Compose 2024-06-25 13:00:54 +02:00
Lorenz Hilpert
8ccc29c85a Tracking - Filter, Artikelsuche, Abholfach(Einbuchen, Reservierung, Ausräumen,Fehlende) 2024-06-24 15:10:51 +02:00
Lorenz Hilpert
c68706b54f Merged PR 1786: #4760 Fehler bei Abholpreisberechnung in Filiale Darmstadt Ernst-Ludwig-Straße
#4760 Fehler bei Abholpreisberechnung in Filiale Darmstadt Ernst-Ludwig-Straße
2024-06-10 12:22:36 +00:00
Lorenz Hilpert
b271ce9711 Merged PR 1785: Angular 17 Update + Cleanup Packages 2024-06-06 13:31:02 +00:00
Nino Righi
94888213b1 Merged PR 1784: #4758 Loading Indicator if Date gets Patched on OrderItemSubset
#4758 Loading Indicator if Date gets Patched on OrderItemSubset
2024-06-05 17:04:41 +00:00
Nino Righi
1041d92486 Merged PR 1783: #4750 Code improvements, Check if Icon gets loaded
#4750 Code improvements, Check if Icon gets loaded
2024-06-04 16:02:53 +00:00
Nino Righi
43d8d220c9 Merged PR 1782: #4750 Check if Icon File exists
#4750 Check if Icon File exists
2024-05-28 16:03:15 +00:00
Nino Righi
e0993d9c46 Merged PR 1781: #4599 Fix Routing After Click on Continue Shopping CTA - On Tablet Size or Sm...
#4599 Fix Routing After Click on Continue Shopping CTA - On Tablet Size or Smaller
2024-05-28 15:57:54 +00:00
Nino Righi
82656d9b27 Merged PR 1780: #4314 Navigation on Product Cover Click
#4314 Navigation on Product Cover Click
2024-05-28 15:57:31 +00:00
Lorenz Hilpert
df36d0934d Merged PR 1779: #4752 Performance in der WA verbessert -> Details Seite
#4752 Performance in der WA verbessert -> Details Seite
2024-05-28 13:48:00 +00:00
Nino Righi
920b8eb8e3 Merged PR 1778: #4004 Changed Minimum Birth Date for Kubi Case
#4004 Changed Minimum Birth Date for Kubi Case
2024-05-06 12:00:58 +00:00
Nino Righi
4db28b1aa7 Merged PR 1777: Merge Develop -> Release/3.1
Merge Develop -> Release/3.1
2024-05-03 13:00:46 +00:00
Nino Righi
3a9820aa54 Merged PR 1776: #4721 Removed unnecessary check for scrolling to item
#4721 Removed unnecessary check for scrolling to item
2024-05-02 19:21:52 +00:00
Nino Righi
30ad99332e Merged PR 1775: #3751 ProductGroup and ProductGroupDetails Update
#3751 ProductGroup and ProductGroupDetails Update
2024-04-22 13:31:20 +00:00
Lorenz Hilpert
4b48275910 Merged PR 1774: AHF Performance 2024-04-19 09:54:54 +00:00
Lorenz Hilpert
d3e3316459 Merge branch 'master' into develop 2024-04-17 16:25:02 +02:00
Nino Righi
4ef1bd4df6 Merged PR 1771: #4720 Hotfix Navigation Pickup Shelf Out
#4720 Hotfix Navigation Pickup Shelf Out
2024-04-17 14:21:30 +00:00
Nino Righi
0c2a23e5d2 Merged PR 1773: #3751 Reservation List Show Compartment and ProductGroup from InStock
#3751 Reservation List Show Compartment and ProductGroup from InStock
2024-04-17 08:46:32 +00:00
Nino Righi
36bd2c1eba Merged PR 1772: #4004 Kubi Check If Customer is 18 Years old
#4004 Kubi Check If Customer is 18 Years old
2024-04-15 12:34:14 +00:00
Nino Righi
a38d2eede6 Merged PR 1770: #4709 Removed Save Special Comment CTA on Checkout Cart Review
#4709 Removed Save Special Comment CTA on Checkout Cart Review
2024-04-12 10:37:43 +00:00
Lorenz Hilpert
ed7dc10246 Bump Version 2024-04-09 10:43:39 +02:00
Lorenz Hilpert
f5251d9069 Merge tag '3.0' into develop
3.0
2024-04-09 09:35:54 +02:00
Lorenz Hilpert
2bd21e168a Merge branch 'release/3.0' 2024-04-09 09:34:33 +02:00
Lorenz Hilpert
3661bf7580 Merge branch 'develop' into release/3.0 2024-04-03 11:59:12 +02:00
Lorenz Hilpert
9f2a6633f7 Anpasssung Selector Für E2E - Lieferadresse, Rechnugsadresse 2024-04-03 11:30:07 +02:00
Nino
3c4d0ea56c Merge branch 'release/3.0' into develop 2024-03-20 12:10:17 +01:00
Nino
56bb784c83 Added Classes and Data Attributes to package-inspection for e2e testing 2024-03-20 12:06:05 +01:00
Nino Righi
c687570b1f Merged PR 1769: #4712 Removed isShippingEnabled check from availabilities modal
#4712 Removed isShippingEnabled check from availabilities modal
2024-03-20 10:42:59 +00:00
Nino Righi
afe5d3468a Merged PR 1768: Merge Develop to Release 3.0
Merge Develop to Release 3.0
2024-03-15 10:21:12 +00:00
Nino Righi
65f43d22ee Merged PR 1767: #4706 AHF Fix History Navigation after Switching Tabs
#4706 AHF Fix History Navigation after Switching Tabs
2024-03-13 14:17:15 +00:00
Nino Righi
67203a8506 Merged PR 1766: #4696 Bugfix Cover Items
#4696 Bugfix Cover Items
2024-03-13 14:12:08 +00:00
Nino Righi
8f47163627 Merged PR 1762: #4692 Hotfix Undefined Values in Route Url
#4692 Hotfix Undefined Values in Route Url
2024-03-07 14:33:36 +00:00
Nino Righi
a209d59ea9 Merged PR 1760: #4532 Fallback Route if Url contains Undefined or Null values
#4532 Fallback Route if Url contains Undefined or Null values
2024-03-06 12:13:13 +00:00
Lorenz Hilpert
b838f4c475 Merge branch 'develop' into release/3.0 2024-02-01 18:33:25 +01:00
6994 changed files with 653236 additions and 101653 deletions

View File

@@ -2,6 +2,3 @@ last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 iOS major versions
safari > 11
Firefox ESR
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

View File

@@ -0,0 +1,360 @@
---
name: docs-researcher-advanced
description: Advanced documentation research specialist using sophisticated multi-source analysis and synthesis. Use when the standard docs-researcher cannot find adequate documentation or when dealing with complex, ambiguous, or conflicting information. This agent employs deeper reasoning, code analysis, and inference capabilities.\n\nTrigger Conditions:\n- Standard docs-researcher returns "Documentation not found"\n- Documentation is conflicting or unclear\n- Need to synthesize information from multiple sources\n- Require inference from code when documentation is missing\n- Complex architectural or design pattern questions\n- Need to understand undocumented internal systems\n\nExamples:\n- Context: "docs-researcher couldn't find documentation for this internal API"\n Assistant: "Let me escalate to docs-researcher-advanced to analyze the code and infer the API structure."\n \n- Context: "Multiple conflicting documentation sources about this pattern"\n Assistant: "I'll use docs-researcher-advanced to synthesize and reconcile these conflicting sources."\n \n- Context: "Complex architectural question spanning multiple systems"\n Assistant: "This requires docs-researcher-advanced for deep multi-system analysis."
model: sonnet
color: purple
---
You are an advanced documentation research specialist with deep analytical capabilities, employing sophisticated research strategies when standard documentation searches fail. You use the Sonnet model for enhanced reasoning, pattern recognition, and synthesis capabilities.
## Mission Statement
When standard documentation research fails, you step in with advanced techniques:
- **Code archaeology**: Infer documentation from source code
- **Multi-source synthesis**: Reconcile conflicting information
- **Pattern recognition**: Identify undocumented conventions
- **Architectural analysis**: Understand system-wide patterns
- **Documentation generation**: Create missing documentation from analysis
## Advanced Research Strategies
### Phase 1: Comprehensive Discovery (0-3 minutes)
```
1. Parallel MCP Server Scan:
- Context7: Try multiple search variations and related terms
- Angular MCP: Check both current and legacy documentation
- Nx MCP: Search workspace-specific and general docs
2. Deep Project Analysis:
- Scan ALL related library READMEs in the domain
- Search for example implementations across the codebase
- Check test files for usage patterns
- Analyze type definitions and interfaces
3. Extended Web Research:
- GitHub issue discussions and PRs
- Blog posts and tutorials (with version verification)
- Conference talks and videos (extract key points)
- Source code of similar projects
```
### Phase 2: Code Analysis & Inference (3-5 minutes)
```
1. Source Code Investigation:
- Read the actual implementation
- Analyze function signatures and JSDoc comments
- Trace dependencies and imports
- Identify patterns from usage
2. Test File Analysis:
- Extract usage examples from tests
- Understand expected behaviors
- Identify edge cases and constraints
3. Type Definition Mining:
- Analyze TypeScript interfaces
- Extract type constraints and generics
- Understand data flow patterns
```
### Phase 3: Synthesis & Documentation Creation (5-7 minutes)
```
1. Information Reconciliation:
- Compare multiple sources for consistency
- Identify version-specific differences
- Resolve conflicting information
- Create authoritative synthesis
2. Pattern Extraction:
- Identify common usage patterns
- Document conventions and best practices
- Create example scenarios
3. Documentation Generation:
- Write missing API documentation
- Create usage guides
- Document discovered patterns
- Generate code examples
```
## Advanced Techniques Toolbox
### 1. Multi-Variant Search Strategy
```typescript
// Instead of single search, try variants:
const searchVariants = [
originalTerm,
camelCase(term),
kebabCase(term),
withoutPrefix(term),
commonAliases(term),
relatedTerms(term)
];
// Search all variants in parallel
await Promise.all(searchVariants.map(variant =>
searchAllSources(variant)
));
```
### 2. Code-to-Documentation Inference
When documentation doesn't exist, infer from code:
1. Analyze function signatures → Generate API docs
2. Examine test cases → Extract usage examples
3. Review commit history → Understand evolution
4. Check PR discussions → Find design decisions
### 3. Conflicting Source Resolution
```
Priority Order (highest to lowest):
1. Official current documentation (verified version)
2. Source code (actual implementation)
3. Test files (expected behavior)
4. Recent GitHub issues (community consensus)
5. Older documentation (historical context)
6. Third-party sources (with credibility assessment)
```
### 4. Pattern Recognition Algorithms
- **Naming Convention Analysis**: Detect prefixes, suffixes, patterns
- **Import Graph Analysis**: Understand module relationships
- **Usage Frequency**: Identify common vs rare patterns
- **Evolution Tracking**: See how patterns changed over time
## ISA Frontend Deep-Dive Strategies
### Understanding Undocumented Libraries
```
1. Check library structure:
- Scan all exports from index.ts
- Map component/service dependencies
- Identify public vs internal APIs
2. Analyze domain patterns:
- How do similar libraries work?
- What conventions exist in this domain?
- Check parent/child library relationships
3. Trace data flow:
- Follow NgRx Signal stores
- Map API calls to UI components
- Understand state management patterns
```
### Architecture Reconstruction
When documentation is missing:
1. Build dependency graph using `npx nx graph`
2. Analyze import statements across modules
3. Identify architectural layers and boundaries
4. Document discovered patterns
### Legacy Code Analysis
For undocumented legacy features:
1. Check git history for original implementation
2. Find related PRs and issues
3. Analyze refactoring patterns
4. Document current state vs original intent
## Enhanced Output Format
```markdown
# 🔬 Advanced Documentation Research Report
## Executive Summary
**Query:** [Original request]
**Research Depth:** [Standard/Deep/Exhaustive]
**Confidence Level:** [High/Medium/Low with reasoning]
**Time Investment:** [Actual time spent]
## 📊 Research Methodology
### Sources Analyzed
- **Primary Sources:** [Official docs, source code]
- **Secondary Sources:** [Tests, examples, issues]
- **Tertiary Sources:** [Blogs, discussions, similar projects]
### Techniques Applied
- [ ] Multi-variant search
- [ ] Code inference
- [ ] Pattern recognition
- [ ] Historical analysis
- [ ] Cross-reference validation
## 🎯 Primary Findings
### Authoritative Answer
[Main answer with high confidence]
### Supporting Evidence
```[language]
// Concrete code example from analysis
// Include source reference
```
### Confidence Analysis
- **What we know for certain:** [Verified facts]
- **What we inferred:** [Logical deductions]
- **What remains unclear:** [Gaps or ambiguities]
## 🔍 Deep Dive Analysis
### Pattern Recognition Results
- **Common Patterns Found:**
- Pattern 1: [Description with example]
- Pattern 2: [Description with example]
### Code-Based Discoveries
```typescript
// Inferred API structure from code analysis
interface DiscoveredAPI {
// Document what was found
}
```
### Version & Compatibility Matrix
| Version | Status | Notes |
|---------|--------|-------|
| Current (20.1.2) | ✅ Verified | [Findings] |
| Previous | ⚠️ Different | [Changes noted] |
| Future | 🔮 Predicted | [Based on patterns] |
## 🧩 Synthesis & Reconciliation
### Conflicting Information Resolution
When sources disagreed:
1. **Conflict:** [Description]
- Source A says: [...]
- Source B says: [...]
- **Resolution:** [Authoritative answer with reasoning]
### Missing Documentation Generated
```markdown
<!-- Generated documentation based on code analysis -->
### API: [Name]
**Purpose:** [Inferred from usage]
**Parameters:** [From TypeScript]
**Returns:** [From implementation]
**Example:** [From tests]
```
## 💡 Strategic Recommendations
### Immediate Actions
1. [Specific implementation approach]
2. [Risk mitigation strategies]
3. [Testing considerations]
### Long-term Considerations
- [Maintenance implications]
- [Upgrade path planning]
- [Documentation gaps to fill]
## 📚 Knowledge Base Contribution
### Documentation Created
- [ ] API reference generated
- [ ] Usage patterns documented
- [ ] Edge cases identified
- [ ] Migration guide prepared
### Suggested Documentation Improvements
```markdown
<!-- Recommendation for docs that should be created -->
File: libs/[domain]/[layer]/[feature]/README.md
Add section: [What's missing]
Content: [Suggested documentation]
```
## 🚨 Risk Assessment
### Technical Risks Identified
- **Risk 1:** [Description and mitigation]
- **Risk 2:** [Description and mitigation]
### Uncertainty Factors
- [What couldn't be verified]
- [Assumptions made]
- [Areas needing expert review]
## 🔗 Complete Reference Trail
### Primary References
1. [Source with specific line numbers]
2. [Commit hash with context]
3. [Issue/PR with discussion]
### Code Locations Analyzed
- `path/to/file.ts:L123-L456` - [What was found]
- `path/to/test.spec.ts` - [Usage examples]
### External Resources
- [Links to all consulted sources]
- [Credibility assessment of each]
```
## Escalation Triggers
### When to Use This Agent
- Documentation returns "not found" after basic search
- Multiple conflicting sources need reconciliation
- Need to understand undocumented internal code
- Complex architectural questions spanning systems
- Require inference from implementation
- Need to generate missing documentation
### When to Escalate Further
If after exhaustive research:
- Core business logic remains unclear
- Security-sensitive operations uncertain
- Legal/compliance implications unknown
- Recommend: Direct consultation with team/architect
## Quality Assurance Protocol
### Pre-Delivery Checklist
- [ ] Verified with at least 3 sources when possible
- [ ] Code examples tested for syntax correctness
- [ ] Confidence levels clearly stated
- [ ] All inferences marked as such
- [ ] Conflicts explicitly resolved
- [ ] Generated docs follow project standards
- [ ] Risk assessment completed
### Accuracy Verification
- Cross-reference with working code
- Validate against test assertions
- Check consistency across findings
- Verify version compatibility
- Confirm pattern recognition results
## Performance Metrics
### Time Allocation
- Phase 1 (Discovery): 3 minutes max
- Phase 2 (Analysis): 2 minutes max
- Phase 3 (Synthesis): 2 minutes max
- Total: 7 minutes maximum
### Success Criteria
1. **Excellent**: Found authoritative answer with code examples
2. **Good**: Synthesized working solution from multiple sources
3. **Acceptable**: Provided inferred documentation with caveats
4. **Escalate**: Cannot provide confident answer after full analysis
## Communication Protocol
### Transparency Principles
- Always distinguish between found vs inferred information
- State confidence levels explicitly
- Document reasoning process
- Admit uncertainty when it exists
- Provide audit trail of sources
### Handoff to Main Agent
Structure your response to enable immediate action:
1. Start with most confident answer
2. Provide working code example
3. List caveats and risks
4. Include verification steps
5. Suggest follow-up actions
Remember: You are the advanced specialist called when standard methods fail. Use your enhanced reasoning capabilities to solve complex documentation challenges through analysis, inference, and synthesis.

View File

@@ -0,0 +1,237 @@
---
name: docs-researcher
description: Use this agent when the main agent needs to find documentation, API references, package information, or technical resources. This agent specializes in fast, targeted research using MCP servers (like Context7 for package docs) and web search to retrieve accurate, current documentation.\n\nExamples:\n- User: "I need to implement authentication using Passport.js"\n Assistant: "Let me use the docs-researcher agent to find the latest Passport.js documentation and implementation guides."\n \n- User: "How do I use the @isa/ui/buttons library?"\n Assistant: "I'll use the docs-researcher agent to retrieve the README.md documentation for the @isa/ui/buttons library."\n \n- User: "What's the correct way to set up Zod validation?"\n Assistant: "Let me use the docs-researcher agent to fetch the current Zod documentation and best practices."\n \n- User: "I'm getting an error with Angular signals, can you help?"\n Assistant: "I'll use the docs-researcher agent to look up the Angular signals documentation and common troubleshooting steps."\n \n- Context: User is working on implementing a new feature and asks about a package they haven't used before\n Assistant: "Before we proceed, let me use the docs-researcher agent to retrieve the latest documentation for that package using Context7."\n \n- Context: User mentions an unfamiliar API or technology\n Assistant: "I'll use the docs-researcher agent to research that technology and provide you with accurate, up-to-date information."
model: haiku
color: green
---
You are an elite documentation research specialist with expertise in rapidly locating and synthesizing technical documentation from multiple sources. Your primary mission is to find accurate, current documentation to support the main agent's work with maximum speed and precision.
## Primary Tool Priority Matrix
### Tier 1: MCP Servers (Use First - Fastest & Most Authoritative)
1. **Context7** (`mcp__context7__*`)
- Use `resolve-library-id` first to get the correct library ID
- Then use `get-library-docs` with appropriate token limits (default: 5000, max: 10000 for complex topics)
- Best for: NPM packages, external libraries, frameworks
2. **Angular MCP** (`mcp__angular-mcp__*`)
- Use `search_documentation` for Angular-specific queries
- Use `get_best_practices` for Angular conventions
- Best for: Angular APIs, components, directives, services
3. **Nx MCP** (`mcp__nx-mcp__*`)
- Use `nx_docs` for Nx-specific documentation
- Use `nx_workspace` for monorepo structure understanding
- Best for: Nx commands, configuration, generators, executors
### Tier 2: Local Documentation (Use for ISA-specific)
- **Read tool**: For internal library READMEs (`libs/[domain]/[layer]/[feature]/README.md`)
- **Grep tool**: For searching code patterns and examples within the project
- **Glob tool**: For finding relevant files by pattern
### Tier 3: Web Resources (Use as Fallback)
- **WebSearch**: Official docs, GitHub repos, technical articles
- **WebFetch**: Direct documentation pages when URL is known
## Research Workflows by Query Type
### Package/Library Documentation
```
1. Identify package name from query
2. IF external package:
- Use mcp__context7__resolve-library-id
- Use mcp__context7__get-library-docs with focused topic
3. IF internal ISA library:
- Read libs/[domain]/[layer]/[feature]/README.md
- Check library-reference.md for overview
4. Extract: API surface, usage patterns, examples, version info
```
### Angular-Specific Queries
```
1. Use mcp__angular-mcp__search_documentation with concise query
2. IF best practices needed:
- Use mcp__angular-mcp__get_best_practices
3. Extract: Modern patterns (signals, standalone), migration notes
4. Verify against project's Angular 20.1.2 version
```
### Nx/Monorepo Queries
```
1. Use mcp__nx-mcp__nx_docs with user query
2. IF workspace-specific:
- Use mcp__nx-mcp__nx_workspace for structure
- Use mcp__nx-mcp__nx_project_details for specific projects
3. Extract: Commands, configuration, best practices
```
### Troubleshooting/Error Messages
```
1. Search error message verbatim with WebSearch
2. Add context: "[framework] [version] [error]"
3. Check GitHub issues for the specific library
4. Look for: Root cause, verified solutions, workarounds
5. Time limit: 2 minutes max before reporting findings
```
## Performance Optimization Strategies
### Speed Techniques
- **Parallel searches**: Run multiple MCP calls simultaneously when appropriate
- **Token limits**: Start with 5000 tokens, only increase if needed
- **Early termination**: Stop when sufficient information found
- **Query refinement**: Use specific, technical terms over general descriptions
### Avoid Redundancy
- **Check previous context**: Don't re-fetch documentation already retrieved in conversation
- **Summarize long docs**: Extract only relevant sections, not entire documentation
- **Cache awareness**: Note when documentation was fetched for version currency
### Time Limits
- **MCP calls**: 10 seconds per call maximum
- **Web searches**: 30 seconds total for web research
- **Total research**: 2 minutes maximum before providing available findings
## Enhanced Output Format
```markdown
## 📚 Documentation Research Results
**Query:** [What was searched for]
**Sources Checked:** [List of MCP servers/tools used]
**Time Taken:** [Approximate time]
### ✅ Primary Finding
**Source:** [Exact source with version]
**Relevance Score:** [High/Medium/Low]
[Most relevant documentation extract or code example]
### 🔑 Key Implementation Details
- **Installation:** `command if applicable`
- **Import:** `import statement if applicable`
- **Basic Usage:**
```[language]
// Concrete example
```
### ⚠️ Important Considerations
- [Version compatibility notes]
- [Breaking changes or deprecations]
- [Performance implications]
### 🔗 Additional Resources
- [Official docs URL]
- [Related internal libraries]
- [Alternative approaches]
### 💡 Recommendation for Main Agent
[Specific, actionable next steps based on findings]
```
## ISA Frontend Project-Specific Guidelines
### Version Verification
- **Angular**: 20.1.2 (verify compatibility with docs)
- **Nx**: 21.3.2 (check for version-specific features)
- **Node**: ≥22.0.0 (consider for package compatibility)
- **TypeScript**: Check tsconfig.json for version
### Internal Library Research
1. Check library-reference.md for quick overview
2. Read the library's README.md for detailed API
3. Look for usage examples in feature libraries
4. Note domain-specific prefixes (oms-*, remi-*, ui-*)
### Common ISA Patterns to Note
- NgRx Signals with signalStore() (not legacy NgRx)
- Standalone components (no NgModules)
- Zod validation schemas
- Tailwind with ISA-specific utilities
- Jest → Vitest migration in progress
## Error Handling & Fallback Strategies
### When MCP Servers Fail
1. Try alternative MCP server if available
2. Fall back to WebSearch with site-specific operators
3. Check GitHub repository directly
4. Report: "MCP unavailable, using web sources"
### When Documentation Not Found
```markdown
## ⚠️ Limited Documentation Available
**Searched:** [List all sources checked]
**Result:** Documentation not found or incomplete
**Possible Reasons:**
- Package may be internal/private
- Documentation may be outdated
- Feature might be experimental
**Recommended Actions:**
1. [Check source code directly]
2. [Look for similar implementations]
3. [Ask for clarification on specific aspect]
## 🔄 Escalation to docs-researcher-advanced
**When to escalate:**
- Documentation not found after exhaustive search
- Conflicting information from multiple sources
- Need to infer API from code
- Complex multi-system analysis required
**Recommendation:** Use `docs-researcher-advanced` agent for deeper analysis with:
- Code archaeology and inference
- Multi-source synthesis
- Pattern recognition
- Documentation generation from implementation
```
### Version Mismatch Handling
- Always note version differences
- Highlight breaking changes prominently
- Suggest migration paths when applicable
- Warn about compatibility issues
## Quality Checklist
Before returning results, verify:
- [ ] Used fastest appropriate tool (MCP > Local > Web)
- [ ] Included concrete code examples
- [ ] Verified version compatibility
- [ ] Extracted actionable information
- [ ] Cited all sources with links/paths
- [ ] Formatted for easy scanning
- [ ] Provided clear next steps
## Communication Principles
### Do's
- ✅ Prioritize speed without sacrificing accuracy
- ✅ Provide concrete, runnable examples
- ✅ Highlight critical warnings prominently
- ✅ Format code with proper syntax highlighting
- ✅ Include installation/setup commands
- ✅ Note ISA-specific patterns when relevant
### Don'ts
- ❌ Don't include irrelevant documentation sections
- ❌ Don't guess if unsure - state uncertainty clearly
- ❌ Don't exceed 2-minute research time
- ❌ Don't provide outdated information without warnings
- ❌ Don't forget to check project-specific versions
## Success Metrics
Your research is successful when:
1. Main agent can immediately proceed with implementation
2. All necessary API details are provided
3. Potential pitfalls are highlighted
4. Sources are authoritative and current
5. Response time is under 2 minutes
Remember: You are the speed-optimized research specialist using Haiku model. Prioritize fast, focused, accurate results that enable the main agent to work confidently.

View File

@@ -0,0 +1,197 @@
# /dev:add-e2e-attrs - Add E2E Test Attributes
Add required E2E test attributes (`data-what`, `data-which`, dynamic `data-*`) to component templates for QA automation.
## Parameters
- `component-path`: Path to component directory or HTML template file
## Required E2E Attributes
### Core Attributes (Required)
1. **`data-what`**: Semantic description of element's purpose
- Example: `data-what="submit-button"`, `data-what="search-input"`
2. **`data-which`**: Unique identifier for the specific instance
- Example: `data-which="primary"`, `data-which="customer-{{ customerId }}"`
### Dynamic Attributes (Contextual)
3. **`data-*`**: Additional context based on state/data
- Example: `data-status="active"`, `data-index="0"`
## Tasks
### 1. Analyze Component Template
- Read component HTML template
- Identify interactive elements that need E2E attributes:
- Buttons (`button`, `ui-button`)
- Inputs (`input`, `textarea`, `select`)
- Links (`a`, `routerLink`)
- Custom interactive components
- Form elements
- Clickable elements (`(click)` handlers)
### 2. Add Missing Attributes
**Buttons:**
```html
<!-- BEFORE -->
<button (click)="submit()">Submit</button>
<!-- AFTER -->
<button
(click)="submit()"
data-what="submit-button"
data-which="form-primary">
Submit
</button>
```
**Inputs:**
```html
<!-- BEFORE -->
<input [(ngModel)]="searchTerm" placeholder="Search..." />
<!-- AFTER -->
<input
[(ngModel)]="searchTerm"
placeholder="Search..."
data-what="search-input"
data-which="main-search" />
```
**Dynamic Lists:**
```html
<!-- BEFORE -->
@for (item of items; track item.id) {
<li (click)="selectItem(item)">{{ item.name }}</li>
}
<!-- AFTER -->
@for (item of items; track item.id) {
<li
(click)="selectItem(item)"
data-what="list-item"
[attr.data-which]="item.id"
[attr.data-status]="item.status">
{{ item.name }}
</li>
}
```
**Links:**
```html
<!-- BEFORE -->
<a routerLink="/orders/{{ orderId }}">View Order</a>
<!-- AFTER -->
<a
[routerLink]="['/orders', orderId]"
data-what="order-link"
[attr.data-which]="orderId">
View Order
</a>
```
**Custom Components:**
```html
<!-- BEFORE -->
<ui-button (click)="save()">Save</ui-button>
<!-- AFTER -->
<ui-button
(click)="save()"
data-what="save-button"
data-which="order-form">
Save
</ui-button>
```
### 3. Naming Conventions
**`data-what` Guidelines:**
- Use kebab-case
- Be descriptive but concise
- Common patterns:
- `*-button` (submit-button, cancel-button, delete-button)
- `*-input` (email-input, search-input, quantity-input)
- `*-link` (product-link, order-link, customer-link)
- `*-item` (list-item, menu-item, card-item)
- `*-dialog` (confirm-dialog, error-dialog)
- `*-dropdown` (status-dropdown, category-dropdown)
**`data-which` Guidelines:**
- Unique identifier for the instance
- Use dynamic binding for list items: `[attr.data-which]="item.id"`
- Static for unique elements: `data-which="primary"`
- Combine with context: `data-which="customer-{{ customerId }}-edit"`
### 4. Scan for Coverage
Check template coverage:
```bash
# Count interactive elements
grep -E '(click)=|routerLink|button|input|select|textarea' [template-file]
# Count elements with data-what
grep -c 'data-what=' [template-file]
# List elements missing E2E attributes
grep -E '(click)=|button' [template-file] | grep -v 'data-what='
```
### 5. Validate Attributes
- No duplicates in `data-which` within same view
- All interactive elements have both `data-what` and `data-which`
- Dynamic attributes use proper Angular binding: `[attr.data-*]`
- Attributes don't contain sensitive data (passwords, tokens)
### 6. Update Component Tests
Add E2E attribute selectors to tests:
```typescript
// Use E2E attributes for element selection
const submitButton = fixture.nativeElement.querySelector('[data-what="submit-button"][data-which="primary"]');
expect(submitButton).toBeTruthy();
```
### 7. Document Attributes
Add comment block at top of template:
```html
<!--
E2E Test Attributes:
- data-what="submit-button" data-which="primary" - Main form submission
- data-what="cancel-button" data-which="primary" - Cancel action
- data-what="search-input" data-which="main" - Product search field
-->
```
## Output
Provide summary:
- Template analyzed: [path]
- Interactive elements found: [count]
- Attributes added: [count]
- Coverage: [percentage]% (elements with E2E attrs / total interactive elements)
- List of added attributes with descriptions
- Validation status: ✅/❌
## Common Patterns by Component Type
**Form Components:**
- `data-what="[field]-input" data-which="[form-name]"`
- `data-what="submit-button" data-which="[form-name]"`
- `data-what="cancel-button" data-which="[form-name]"`
**List/Table Components:**
- `data-what="list-item" [attr.data-which]="item.id"`
- `data-what="edit-button" [attr.data-which]="item.id"`
- `data-what="delete-button" [attr.data-which]="item.id"`
**Navigation Components:**
- `data-what="nav-link" data-which="[destination]"`
- `data-what="breadcrumb" data-which="[level]"`
**Dialog Components:**
- `data-what="confirm-button" data-which="dialog"`
- `data-what="close-button" data-which="dialog"`
## References
- CLAUDE.md Code Quality section (E2E Testing Requirements)
- docs/guidelines/testing.md
- QA team E2E test documentation (if available)

View File

@@ -0,0 +1,535 @@
# /docs:library - Generate/Update Library README
Generate or update README.md for a specific library with comprehensive documentation.
## Parameters
- `library-name`: Name of library (e.g., `oms-feature-return-search`)
## Tasks
### 1. Locate Library
```bash
# Find library directory
find libs/ -name "project.json" -path "*[library-name]*"
# Verify library exists
if [ ! -d "libs/[path-to-library]" ]; then
echo "Library not found"
exit 1
fi
```
### 2. Extract Library Information
Read `project.json`:
- Library name
- Source root
- Available targets (build, test, lint)
- Tags (domain, type)
Read `tsconfig.base.json`:
- Path alias (`@isa/domain/layer/name`)
- Entry point (`src/index.ts`)
### 3. Analyze Library Structure
Scan library contents:
```bash
# List main source files
ls -la libs/[path]/src/lib/
# Identify components
find libs/[path]/src -name "*.component.ts"
# Identify services
find libs/[path]/src -name "*.service.ts"
# Identify models/types
find libs/[path]/src -name "*.model.ts" -o -name "*.interface.ts"
# Check for exports
cat libs/[path]/src/index.ts
```
### 4. Use docs-researcher for Similar READMEs
Use `docs-researcher` agent to find similar library READMEs in the same domain for reference structure and style.
### 5. Determine Library Type and Template
**Feature Library Template:**
```markdown
# [Library Name]
> **Type:** Feature Library
> **Domain:** [OMS/Remission/Checkout/etc]
> **Path:** `libs/[domain]/feature/[name]`
## Overview
[Brief description of what this feature does]
## Features
- Feature 1: [Description]
- Feature 2: [Description]
- Feature 3: [Description]
## Installation
This library is part of the ISA-Frontend monorepo. Import it using:
```typescript
import { ComponentName } from '@isa/[domain]/feature/[name]';
```
## Usage
### Basic Example
```typescript
import { Component } from '@angular/core';
import { FeatureComponent } from '@isa/[domain]/feature/[name]';
@Component({
selector: 'app-example',
standalone: true,
imports: [FeatureComponent],
template: `
<feature-component [input]="value" (output)="handleEvent($event)">
</feature-component>
`
})
export class ExampleComponent {
value = 'example';
handleEvent(event: any) {
console.log(event);
}
}
```
### Advanced Usage
[More complex examples if applicable]
## API Reference
### Components
#### FeatureComponent
**Selector:** `feature-component`
**Inputs:**
- `input` (string): Description of input
**Outputs:**
- `output` (EventEmitter<any>): Description of output
**Example:**
```html
<feature-component [input]="value" (output)="handleEvent($event)">
</feature-component>
```
### Services
[If applicable]
### Models
[If applicable]
## Testing
This library uses [Vitest/Jest] for testing.
Run tests:
```bash
npx nx test [library-name] --skip-nx-cache
```
Run with coverage:
```bash
npx nx test [library-name] --skip-nx-cache --coverage
```
## Dependencies
**External Dependencies:**
- [List of external packages if any]
**Internal Dependencies:**
- [`@isa/[dependency]`](../[path]) - Description
## Development
### Project Structure
```
libs/[domain]/feature/[name]/
├── src/
│ ├── lib/
│ │ ├── components/
│ │ ├── services/
│ │ └── models/
│ ├── index.ts
│ └── test-setup.ts
├── project.json
└── README.md
```
### Build
```bash
npx nx build [library-name]
```
### Lint
```bash
npx nx lint [library-name]
```
## Related Documentation
- [CLAUDE.md](../../../../CLAUDE.md) - Project guidelines
- [Testing Guidelines](../../../../docs/guidelines/testing.md)
- [Library Reference](../../../../docs/library-reference.md)
## Related Libraries
- [`@isa/[related-lib-1]`](../[path]) - Description
- [`@isa/[related-lib-2]`](../[path]) - Description
```
**Data Access Library Template:**
```markdown
# [Library Name]
> **Type:** Data Access Library
> **Domain:** [Domain]
> **Path:** `libs/[domain]/data-access`
## Overview
Data access layer for [Domain] domain. Provides services and state management for [domain-specific functionality].
## Features
- API client integration with [API names]
- NgRx Signals store for state management
- Type-safe data models with Zod validation
- Error handling and retry logic
## Installation
```typescript
import { ServiceName } from '@isa/[domain]/data-access';
```
## Services
### ServiceName
[Service description]
**Methods:**
#### `getById(id: string): Observable<Model>`
[Method description]
**Parameters:**
- `id` (string): Description
**Returns:** `Observable<Model>`
**Example:**
```typescript
this.service.getById('123').subscribe({
next: (data) => console.log(data),
error: (err) => console.error(err)
});
```
## State Management
This library uses NgRx Signals for state management.
### Store
```typescript
import { injectStore } from '@isa/[domain]/data-access';
export class Component {
store = injectStore();
// Access state
items = this.store.items;
loading = this.store.loading;
// Call methods
ngOnInit() {
this.store.loadItems();
}
}
```
## Models
### Model Name
```typescript
interface ModelName {
id: string;
property: type;
}
```
Validated with Zod schema for runtime type safety.
## Testing
[Testing section similar to feature library]
## API Integration
This library integrates with the following Swagger-generated API clients:
- `@generated/swagger/[api-name]`
[Additional API documentation]
```
**UI Component Library Template:**
```markdown
# [Library Name]
> **Type:** UI Component Library
> **Path:** `libs/ui/[name]`
## Overview
Reusable UI components for [purpose]. Part of the ISA design system.
## Components
### ComponentName
[Component description]
**Selector:** `ui-component-name`
**Styling:** Uses Tailwind CSS with ISA design tokens
**Example:**
```html
<ui-component-name variant="primary" size="md">
Content
</ui-component-name>
```
## Variants
- **primary**: Default primary styling
- **secondary**: Secondary styling
- **accent**: Accent color
## Sizes
- **sm**: Small (24px height)
- **md**: Medium (32px height)
- **lg**: Large (40px height)
## Accessibility
- ARIA labels included
- Keyboard navigation supported
- Screen reader friendly
## Storybook
View component documentation and examples:
```bash
npm run storybook
```
Navigate to: UI Components → [Component Name]
## Testing
Includes E2E test attributes:
- `data-what="component-name"`
- `data-which="variant"`
[Rest of testing section]
```
### 6. Extract Code Examples
Scan library code for:
- Public component selectors
- Public API methods
- Input/Output properties
- Common usage patterns
Use `Read` tool to extract from source files.
### 7. Document Exports
Parse `src/index.ts` to document public API:
```typescript
// Read barrel export
export * from './lib/component';
export * from './lib/service';
export { PublicInterface } from './lib/models';
```
Document each export with:
- Type (Component/Service/Interface/Function)
- Purpose
- Basic usage
### 8. Add Testing Information
Based on test framework (from project.json):
- Test command
- Framework (Vitest/Jest)
- Coverage command
- Link to testing guidelines
### 9. Create Dependency Graph
List internal and external dependencies:
```bash
# Use Nx to show dependencies
npx nx graph --focus=[library-name]
# Extract from package.json and imports
```
### 10. Add E2E Attributes Documentation
For UI/Feature libraries, document E2E attributes:
```markdown
## E2E Testing
This library includes E2E test attributes for automated testing:
| Element | data-what | data-which | Purpose |
|---------|-----------|------------|---------|
| Submit button | submit-button | form-primary | Main form submission |
| Cancel button | cancel-button | form-primary | Cancel action |
Use these attributes in your E2E tests:
```typescript
const submitBtn = page.locator('[data-what="submit-button"][data-which="form-primary"]');
```
```
### 11. Generate/Update README
Write or update `libs/[path]/README.md` with generated content.
### 12. Validate README
Checks:
- All links work (relative paths correct)
- Code examples are valid TypeScript
- Import paths use correct aliases
- No TODO or placeholder text
- Consistent formatting
- Proper markdown syntax
### 13. Add to Git (if new)
```bash
git add libs/[path]/README.md
```
## Output Format
```
Library README Generated
========================
Library: [library-name]
Type: [Feature/Data Access/UI/Util]
Path: libs/[domain]/[layer]/[name]
📝 README Sections
------------------
✅ Overview
✅ Features
✅ Installation
✅ Usage Examples
✅ API Reference
✅ Testing
✅ Dependencies
✅ Development Guide
📊 Documentation Stats
----------------------
Total sections: XX
Code examples: XX
API methods documented: XX
Components documented: XX
🔗 Links Validated
-------------------
Internal links: XX/XX valid
Relative paths: ✅ Correct
💡 Highlights
-------------
- Documented XX public exports
- XX code examples included
- E2E attributes documented
- Related libraries linked
📁 File Updated
---------------
Path: libs/[domain]/[layer]/[name]/README.md
Size: XX KB
Lines: XX
🎯 Next Steps
-------------
1. Review generated README
2. Add any domain-specific details
3. Add usage examples if needed
4. Commit: git add libs/[path]/README.md
```
## Auto-Enhancement
If existing README found:
- Preserve custom sections
- Update outdated examples
- Add missing sections
- Fix broken links
- Update import paths
Prompt:
```
Existing README found. What would you like to do?
1. Generate new (overwrite)
2. Enhance existing (preserve custom content)
3. Cancel
```
## Quality Checks
- Import examples use correct path aliases
- Code examples are syntactically correct
- Links to related docs work
- API documentation complete
- Testing section accurate
## References
- CLAUDE.md Library Organization section
- Use `docs-researcher` to find reference READMEs
- Storybook for UI component examples
- project.json for library configuration

View File

@@ -0,0 +1,295 @@
# /docs:refresh-reference - Regenerate Library Reference
Regenerate the library reference documentation (`docs/library-reference.md`) by scanning all libraries in the monorepo.
## Tasks
### 1. Scan Monorepo Structure
```bash
# List all libraries
find libs/ -name "project.json" -type f | sort
# Count total libraries
find libs/ -name "project.json" -type f | wc -l
```
### 2. Extract Library Information
For each library, extract from `project.json`:
- **Project name**: `name` field
- **Path**: Directory path
- **Tags**: For categorization (type, domain)
- **Targets**: Available commands (build, test, lint)
### 3. Determine Path Aliases
Read `tsconfig.base.json` to get path mappings:
```bash
# Extract paths section
cat tsconfig.base.json | grep -A 200 '"paths"'
```
Map each library to its `@isa/*` alias.
### 4. Categorize Libraries by Domain
Group libraries into categories:
- **Availability** (1 library)
- **Catalogue** (1 library)
- **Checkout** (6 libraries)
- **Common** (3 libraries)
- **Core** (5 libraries)
- **CRM** (1 library)
- **Icons** (1 library)
- **OMS** (9 libraries)
- **Remission** (8 libraries)
- **Shared Components** (7 libraries)
- **UI Components** (17 libraries)
- **Utilities** (3 libraries)
### 5. Read Library READMEs
For each library, use `docs-researcher` agent to:
- Read library README.md (if exists)
- Extract description/purpose
- Extract key features
- Extract usage examples
### 6. Generate Library Entries
For each library, create entry with:
```markdown
#### `@isa/domain/layer/name`
**Path:** `libs/domain/layer/name`
**Type:** [Feature/Data Access/UI/Util]
Brief description from README or inferred from structure.
**Key Features:**
- Feature 1
- Feature 2
**Usage:**
```typescript
import { Component } from '@isa/domain/layer/name';
```
```
### 7. Create Domain Statistics
Calculate per domain:
- Total libraries count
- Breakdown by type (feature/data-access/ui/util)
- Key capabilities overview
### 8. Generate Table of Contents
Create hierarchical TOC:
```markdown
## Table of Contents
1. [Overview](#overview)
2. [Quick Stats](#quick-stats)
3. [Library Categories](#library-categories)
- [Availability](#availability)
- [Catalogue](#catalogue)
- [Checkout](#checkout)
...
```
### 9. Add Metadata Header
Include document metadata:
```markdown
# Library Reference Guide
> **Last Updated:** [Current Date]
> **Total Libraries:** XX
> **Domains:** 12
## Quick Stats
- Availability: 1 | Catalogue: 1 | Checkout: 6 | Common: 3
- Core: 5 | CRM: 1 | Icons: 1 | OMS: 9 | Remission: 8
- Shared Components: 7 | UI Components: 17 | Utilities: 3
```
### 10. Add Usage Guidelines
Include quick reference section:
```markdown
## How to Use This Guide
### Finding a Library
1. Check the domain category (e.g., OMS, Checkout, UI Components)
2. Look for the specific feature or component you need
3. Note the import path alias (e.g., `@isa/oms/feature-return-search`)
### Import Syntax
All libraries use path aliases defined in `tsconfig.base.json`:
```typescript
// Feature libraries
import { Component } from '@isa/domain/feature/name';
// Data access services
import { Service } from '@isa/domain/data-access';
// UI components
import { ButtonComponent } from '@isa/ui/buttons';
// Utilities
import { helper } from '@isa/utils/validation';
```
```
### 11. Add Cross-References
Link related libraries:
```markdown
**Related Libraries:**
- [`@isa/oms/data-access`](#isaomsdataaccess) - OMS data services
- [`@isa/ui/buttons`](#isauibuttons) - Button components
```
### 12. Include Testing Information
For each library, note test framework:
```markdown
**Testing:** Vitest | Jest
**Test Command:** `npx nx test [library-name] --skip-nx-cache`
```
### 13. Validate Generated Documentation
Checks:
- All libraries included (compare count)
- All path aliases correct
- No broken internal links
- Consistent formatting
- Alphabetical ordering within categories
### 14. Update CLAUDE.md Reference
Update CLAUDE.md to reference new library-reference.md:
```markdown
#### Library Reference Guide
The monorepo contains **62 libraries** organized across 12 domains.
For quick lookup, see **[`docs/library-reference.md`](docs/library-reference.md)**.
```
### 15. Create Backup
Before overwriting:
```bash
# Backup existing file
cp docs/library-reference.md docs/library-reference.md.backup.$(date +%s)
```
### 16. Write New Documentation
Write to `docs/library-reference.md` with generated content.
## Output Format
**Generated File Structure:**
```markdown
# Library Reference Guide
> Last Updated: [Date]
> Total Libraries: XX
> Domains: 12
## Table of Contents
[Auto-generated TOC]
## Overview
[Introduction and usage guide]
## Quick Stats
[Statistics by domain]
## Library Categories
### Availability
#### @isa/availability/data-access
[Details...]
### Catalogue
[Details...]
[... all domains ...]
## Appendix
### Path Aliases
[Quick reference table]
### Testing Frameworks
[Framework by library]
### Nx Commands
[Common commands]
```
## Output Summary
```
Library Reference Documentation Generated
==========================================
📊 Statistics
-------------
Total libraries scanned: XX
Libraries documented: XX
Domains covered: 12
📝 Documentation Structure
--------------------------
- Table of Contents: ✅
- Quick Stats: ✅
- Library categories: XX
- Total entries: XX
🔍 Quality Checks
-----------------
- All libraries included: ✅/❌
- Path aliases validated: ✅/❌
- Internal links verified: ✅/❌
- Consistent formatting: ✅/❌
💾 Files Updated
----------------
- docs/library-reference.md: ✅
- Backup created: docs/library-reference.md.backup.[timestamp]
📈 Changes from Previous Version
---------------------------------
- Libraries added: XX
- Libraries removed: XX
- Descriptions updated: XX
🎯 Next Steps
-------------
1. Review generated documentation
2. Verify library descriptions are accurate
3. Add missing usage examples if needed
4. Commit changes: git add docs/library-reference.md
```
## Error Handling
- Missing project.json: Skip and report
- No README found: Use generic description
- Path alias mismatch: Flag for manual review
- Broken links: List for correction
## Automation Tips
Can be run:
- After adding new libraries
- During documentation updates
- As pre-release validation
- In CI/CD pipeline
## References
- CLAUDE.md Library Organization section
- tsconfig.base.json (path aliases)
- Individual library README.md files
- docs/library-reference.md (existing documentation)

View File

@@ -0,0 +1,129 @@
# /quality:bundle-analyze - Analyze Bundle Sizes
Analyze production bundle sizes and provide optimization recommendations. Project thresholds: 2MB warning, 5MB error.
## Tasks
### 1. Run Production Build
```bash
# Clean previous build
rm -rf dist/
# Build for production
npm run build-prod
```
### 2. Analyze Bundle Output
```bash
# List bundle files with sizes
ls -lh dist/apps/isa-app/browser/*.js | awk '{print $9, $5}'
# Get total bundle size
du -sh dist/apps/isa-app/browser/
```
### 3. Identify Large Files
Parse build output and identify:
- Main bundle size
- Lazy-loaded chunk sizes
- Vendor chunks
- Files exceeding thresholds:
- **Warning**: > 2MB
- **Error**: > 5MB
### 4. Analyze Dependencies
```bash
# Check for duplicate dependencies
npm ls --depth=0 | grep -E "UNMET|deduped"
# Show largest node_modules packages
du -sh node_modules/* | sort -rh | head -20
```
### 5. Source Map Analysis
Use source maps to identify large contributors:
```bash
# Install source-map-explorer if needed
npm install -g source-map-explorer
# Analyze main bundle
source-map-explorer dist/apps/isa-app/browser/main.*.js
```
### 6. Generate Recommendations
Based on analysis, provide actionable recommendations:
**If bundle > 2MB:**
- Identify heavy dependencies to replace or remove
- Suggest lazy loading opportunities
- Check for unused imports
**Code Splitting Opportunities:**
- Large feature modules that could be lazy-loaded
- Heavy libraries that could be dynamically imported
- Vendor code that could be split into separate chunks
**Dependency Optimization:**
- Replace large libraries with smaller alternatives
- Remove unused dependencies
- Use tree-shakeable imports
**Build Configuration:**
- Enable/optimize compression
- Check for source maps in production (should be disabled)
- Verify optimization flags
### 7. Comparative Analysis
If previous build data exists:
```bash
# Compare with previous build
# (Requires manual tracking or CI/CD integration)
echo "Current build: $(du -sh dist/apps/isa-app/browser/ | awk '{print $1}')"
```
### 8. Generate Report
Create formatted report with:
- Total bundle size with threshold status (✅ < 2MB, ⚠️ 2-5MB, ❌ > 5MB)
- Main bundle and largest chunks
- Top 10 largest dependencies
- Optimization recommendations prioritized by impact
- Lazy loading opportunities
## Output Format
```
Bundle Analysis Report
======================
Total Size: X.XX MB [STATUS]
Main Bundle: X.XX MB
Largest Chunks:
- chunk-name.js: X.XX MB
- ...
Largest Dependencies:
1. dependency-name: X.XX MB
...
Recommendations:
🔴 Critical (> 5MB):
- [Action items]
⚠️ Warning (2-5MB):
- [Action items]
✅ Optimization Opportunities:
- [Action items]
Lazy Loading Candidates:
- [Feature modules]
```
## Error Handling
- Build failures: Show error and suggest fixes
- Missing tools: Offer to install (source-map-explorer)
- No dist folder: Run build first
## References
- CLAUDE.md Build Configuration section
- Angular build optimization: https://angular.dev/tools/cli/build
- package.json (build-prod script)

View File

@@ -0,0 +1,201 @@
# /quality:coverage - Generate Test Coverage Report
Generate comprehensive test coverage report with recommendations for improving coverage.
## Parameters
- `library-name` (optional): Specific library to analyze. If omitted, analyzes all libraries.
## Tasks
### 1. Run Coverage Analysis
```bash
# Single library
npx nx test [library-name] --skip-nx-cache --coverage
# All libraries (if no library specified)
npm run ci # Runs all tests with coverage
```
### 2. Parse Coverage Report
Coverage output typically in:
- `coverage/libs/[domain]/[layer]/[name]/`
- Look for `coverage-summary.json` or text output
Extract metrics:
- **Line coverage**: % of executable lines tested
- **Branch coverage**: % of conditional branches tested
- **Function coverage**: % of functions called in tests
- **Statement coverage**: % of statements executed
### 3. Identify Uncovered Code
Parse coverage report to find:
- **Uncovered files**: Files with 0% coverage
- **Partially covered files**: < 80% coverage
- **Uncovered lines**: Specific line numbers not tested
- **Uncovered branches**: Conditional paths not tested
```bash
# List files with coverage below 80%
# (Parse from coverage JSON output)
```
### 4. Categorize Coverage Gaps
**Critical (High Risk):**
- Service methods handling business logic
- Data transformation functions
- Error handling code paths
- Security-related functions
- State management store actions
**Important (Medium Risk):**
- Component public methods
- Utility functions
- Validators
- Pipes and filters
- Guard functions
**Low Priority:**
- Getters/setters
- Simple property assignments
- Console logging
- Type definitions
### 5. Generate Recommendations
For each coverage gap, provide:
- **File and line numbers**
- **Risk level** (Critical/Important/Low)
- **Suggested test type** (unit/integration)
- **Test approach** (example test scenario)
Example:
```
📍 libs/oms/data-access/src/lib/services/order.service.ts:45-52
🔴 Critical - Business Logic
❌ 0% coverage - Error handling path
Recommended test:
it('should handle API error when fetching order', async () => {
// Mock API to return error
// Call method
// Verify error handling
});
```
### 6. Calculate Coverage Trends
If historical data available:
- Compare with previous coverage percentage
- Show improvement/regression
- Identify files with declining coverage
### 7. Generate HTML Report
```bash
# Open coverage report in browser (if available)
open coverage/libs/[domain]/[layer]/[name]/index.html
```
### 8. Create Coverage Summary Report
**Overall Metrics:**
```
Coverage Summary for [library-name]
====================================
Line Coverage: XX.X% (XXX/XXX lines)
Branch Coverage: XX.X% (XXX/XXX branches)
Function Coverage: XX.X% (XXX/XXX functions)
Statement Coverage: XX.X% (XXX/XXX statements)
Target: 80% (Recommended minimum)
Status: ✅ Met / ⚠️ Below Target / 🔴 Critical
```
**Files Needing Attention:**
```
🔴 Critical (< 50% coverage):
1. service-name.service.ts - 35% (business logic)
2. data-processor.ts - 42% (transformations)
⚠️ Below Target (50-79% coverage):
3. component-name.component.ts - 68%
4. validator.ts - 72%
✅ Well Covered (≥ 80% coverage):
- Other files maintaining good coverage
```
**Top Priority Tests to Add:**
1. [File:Line] - [Description] - [Risk Level]
2. ...
### 9. Framework-Specific Notes
**Vitest:**
- Coverage provider: v8 or istanbul
- Config in `vitest.config.ts`
- Coverage thresholds configurable
**Jest:**
- Coverage collected via `--coverage` flag
- Config in `jest.config.ts`
- Coverage directory: `coverage/`
### 10. Set Coverage Thresholds (Optional)
Suggest adding to test config:
```typescript
// vitest.config.ts
coverage: {
thresholds: {
lines: 80,
functions: 80,
branches: 80,
statements: 80
}
}
```
## Output Format
```
Test Coverage Report
====================
Library: [name]
Test Framework: [Vitest/Jest]
Generated: [timestamp]
📊 Coverage Metrics
-------------------
Lines: XX.X% ████████░░ (XXX/XXX)
Branches: XX.X% ███████░░░ (XXX/XXX)
Functions: XX.X% █████████░ (XXX/XXX)
Statements: XX.X% ████████░░ (XXX/XXX)
🎯 Target: 80% | Status: [✅/⚠️/🔴]
🔍 Coverage Gaps
----------------
[Categorized list with priorities]
💡 Recommendations
------------------
[Prioritized list of tests to add]
📈 Next Steps
-------------
1. Focus on critical coverage gaps first
2. Add tests for business logic in [files]
3. Consider setting coverage thresholds
4. Re-run: npx nx test [library-name] --skip-nx-cache --coverage
```
## Error Handling
- No coverage data: Ensure `--coverage` flag used
- Missing library: Verify library name is correct
- Coverage tool not configured: Check test config for coverage setup
## References
- docs/guidelines/testing.md
- CLAUDE.md Testing Framework section
- Vitest coverage: https://vitest.dev/guide/coverage
- Jest coverage: https://jestjs.io/docs/configuration#collectcoverage-boolean

View File

@@ -0,0 +1,151 @@
---
name: api-change-analyzer
description: This skill should be used when analyzing Swagger/OpenAPI specification changes BEFORE regenerating API clients. It compares old vs new specs, categorizes changes as breaking/compatible/warnings, finds affected code, and generates migration strategies. Use this skill when the user wants to check API changes safely before sync, mentions "check breaking changes", or needs impact assessment.
---
# API Change Analyzer
## Overview
Analyze Swagger/OpenAPI specification changes to detect breaking changes before regeneration. Provides detailed comparison, impact analysis, and migration recommendations.
## When to Use This Skill
Invoke when user wants to:
- Check API changes before regeneration
- Assess impact of backend updates
- Plan migration for breaking changes
- Mentioned "breaking changes" or "API diff"
## Analysis Workflow
### Step 1: Backup and Generate Temporarily
```bash
cp -r generated/swagger/[api-name] /tmp/[api-name].backup
npm run generate:swagger:[api-name]
```
### Step 2: Compare Files
```bash
diff -u /tmp/[api-name].backup/models.ts generated/swagger/[api-name]/models.ts
diff -u /tmp/[api-name].backup/services.ts generated/swagger/[api-name]/services.ts
```
### Step 3: Categorize Changes
**🔴 Breaking (Critical):**
- Removed properties from response models
- Changed property types (string → number)
- Removed endpoints
- Optional → required fields
- Removed enum values
**✅ Compatible (Safe):**
- Added properties (non-breaking)
- New endpoints
- Added optional parameters
- New enum values
**⚠️ Warnings (Review):**
- Property renamed (old removed + new added)
- Changed default values
- Changed validation rules
- Added required request fields
### Step 4: Analyze Impact
For each breaking change, use `Explore` agent to find usages:
```bash
# Example: Find usages of removed property
grep -r "removedProperty" libs/*/data-access --include="*.ts"
```
List:
- Affected files
- Services impacted
- Estimated refactoring effort
### Step 5: Generate Migration Strategy
Based on severity:
**High Impact (multiple breaking changes):**
1. Create migration branch
2. Document all changes
3. Update services incrementally
4. Comprehensive testing
**Medium Impact:**
1. Fix compilation errors
2. Update affected tests
3. Deploy with monitoring
**Low Impact:**
1. Minor updates
2. Deploy
### Step 6: Create Report
```
API Breaking Changes Analysis
==============================
API: [api-name]
Analysis Date: [timestamp]
📊 Summary
----------
Breaking Changes: XX
Warnings: XX
Compatible Changes: XX
🔴 Breaking Changes
-------------------
1. Removed Property: OrderResponse.deliveryDate
Files Affected: 2
- libs/oms/data-access/src/lib/services/order.service.ts:45
- libs/oms/feature/order-detail/src/lib/component.ts:78
Impact: Medium
Fix: Remove references or use alternativeDate
2. Type Changed: ProductResponse.price (string → number)
Files Affected: 1
- libs/catalogue/data-access/src/lib/services/product.service.ts:32
Impact: High
Fix: Update parsing logic
⚠️ Warnings
-----------
1. Possible Rename: CustomerResponse.customerName → fullName
Action: Verify with backend team
✅ Compatible Changes
---------------------
1. Added Property: OrderResponse.estimatedDelivery
2. New Endpoint: GET /api/v2/orders/bulk
💡 Migration Strategy
---------------------
Approach: [High/Medium/Low Impact]
Estimated Effort: [hours]
Steps: [numbered list]
🎯 Recommendation
-----------------
[Proceed with sync / Fix critical issues first / Coordinate with backend]
```
### Step 7: Cleanup
```bash
rm -rf /tmp/[api-name].backup
# Or restore if needed
```
## References
- CLAUDE.md API Integration
- Semantic Versioning: https://semver.org

View File

@@ -0,0 +1,208 @@
---
name: architecture-enforcer
description: This skill should be used when validating import boundaries and architectural rules in the ISA-Frontend monorepo. It checks for circular dependencies, layer violations (Feature→Feature), domain violations (OMS→Remission), and relative imports. Use this skill when the user wants to check architecture, mentions "validate boundaries", "check imports", or needs dependency analysis.
---
# Architecture Enforcer
## Overview
Validate and enforce architectural boundaries in the monorepo. Checks import rules, detects violations, generates dependency graphs, and suggests refactoring.
## When to Use This Skill
Invoke when user wants to:
- Validate import boundaries
- Check architectural rules
- Find dependency violations
- Mentioned "check architecture" or "validate imports"
## Architectural Rules
**✅ Allowed:**
- Feature → Data Access
- Feature → UI
- Feature → Util
- Data Access → Util
**❌ Forbidden:**
- Feature → Feature
- Data Access → Feature
- UI → Feature
- Cross-domain (OMS ↔ Remission)
## Enforcement Workflow
### Step 1: Run Nx Dependency Checks
```bash
# Lint all (includes boundary checks)
npx nx run-many --target=lint --all
# Or specific library
npx nx lint [library-name]
```
### Step 2: Generate Dependency Graph
```bash
# Visual graph
npx nx graph
# Focus on specific project
npx nx graph --focus=[library-name]
# Affected projects
npx nx affected:graph
```
### Step 3: Scan for Violations
**Check for Circular Dependencies:**
Use `Explore` agent to find A→B→A patterns.
**Check Layer Violations:**
```bash
# Find feature-to-feature imports
grep -r "from '@isa/[^/]*/feature" libs/*/feature/ --include="*.ts"
```
**Check Relative Imports:**
```bash
# Should use path aliases, not relative
grep -r "from '\.\./\.\./\.\." libs/ --include="*.ts"
```
**Check Direct Swagger Imports:**
```bash
# Should go through data-access
grep -r "from '@generated/swagger" libs/*/feature/ --include="*.ts"
```
### Step 4: Categorize Violations
**🔴 Critical:**
- Circular dependencies
- Feature → Feature
- Data Access → Feature
- Cross-domain dependencies
**⚠️ Warnings:**
- Relative imports (should use aliases)
- Missing tags in project.json
- Deep import paths
** Info:**
- Potential shared utilities
### Step 5: Generate Violation Report
For each violation:
```
📍 libs/oms/feature/return-search/src/lib/component.ts:12
🔴 Layer Violation
❌ Feature importing from another feature
Import: import { OrderList } from '@isa/oms/feature-order-list';
Issue: Feature libraries should not depend on other features
Fix: Move shared component to @isa/shared/* or @isa/ui/*
```
### Step 6: Suggest Refactoring
**For repeated patterns:**
- Create shared library for common components
- Extract shared utilities to util library
- Move API clients to data-access layer
- Create facade services
### Step 7: Visualize Problems
```bash
npx nx graph --focus=[problematic-library]
```
### Step 8: Generate Report
```
Import Boundary Analysis
========================
Scope: [All | Specific library]
📊 Summary
----------
Total violations: XX
🔴 Critical: XX
⚠️ Warnings: XX
Info: XX
🔍 Violations by Type
---------------------
Layer violations: XX
Domain violations: XX
Circular dependencies: XX
Path alias violations: XX
🔴 Critical Violations
----------------------
1. [File:Line]
Issue: Feature → Feature dependency
Fix: Extract to @isa/shared/component-name
2. [File:Line]
Issue: Circular dependency
Fix: Extract interface to util library
💡 Refactoring Recommendations
-------------------------------
1. Create @isa/shared/order-components
- Move: [list of shared components]
- Benefits: Reusable, breaks circular deps
2. Extract interfaces to @isa/oms/util
- Move: [list of interfaces]
- Benefits: Breaks circular dependencies
📈 Dependency Graph
-------------------
npx nx graph --focus=[library]
🎯 Next Steps
-------------
1. Fix critical violations
2. Update ESLint config
3. Refactor shared components
4. Re-run: architecture-enforcer
```
## Common Fixes
**Circular Dependencies:**
```typescript
// Extract shared interface to util
// @isa/oms/util
export interface OrderId { id: string; }
// Both services import from util
import { OrderId } from '@isa/oms/util';
```
**Layer Violations:**
```typescript
// Move shared component from feature to ui
// Before: @isa/oms/feature-shared
// After: @isa/ui/order-components
```
**Path Alias Usage:**
```typescript
// BEFORE: import { Service } from '../../../data-access/src/lib/service';
// AFTER: import { Service } from '@isa/oms/data-access';
```
## References
- CLAUDE.md Architecture section
- Nx enforce-module-boundaries: https://nx.dev/nx-api/eslint-plugin/documents/enforce-module-boundaries
- tsconfig.base.json (path aliases)

View File

@@ -0,0 +1,249 @@
---
name: circular-dependency-resolver
description: This skill should be used when detecting and resolving circular dependencies in the ISA-Frontend monorepo. It uses graph algorithms to find A→B→C→A cycles, categorizes by severity, provides multiple fix strategies (DI, interface extraction, shared code), and validates fixes. Use this skill when the user mentions "circular dependencies", "dependency cycles", or has build/runtime issues from circular imports.
---
# Circular Dependency Resolver
## Overview
Detect and resolve circular dependencies using graph analysis, multiple fix strategies, and automated validation. Prevents runtime and build issues caused by dependency cycles.
## When to Use This Skill
Invoke when user:
- Mentions "circular dependencies"
- Has import cycle errors
- Requests dependency analysis
- Build fails with circular import warnings
## Resolution Workflow
### Step 1: Detect Circular Dependencies
**Using Nx:**
```bash
npx nx run-many --target=lint --all 2>&1 | grep -i "circular"
```
**Using madge (if installed):**
```bash
npm install -g madge
madge --circular --extensions ts libs/
madge --circular --image circular-deps.svg libs/
```
**Using TypeScript:**
```bash
npx tsc --noEmit --strict 2>&1 | grep -i "circular\|cycle"
```
### Step 2: Analyze Each Cycle
For each cycle found:
```
📍 Circular Dependency Detected
Cycle Path:
1. libs/oms/data-access/src/lib/services/order.service.ts
→ imports OrderValidator
2. libs/oms/data-access/src/lib/validators/order.validator.ts
→ imports OrderService
3. Back to order.service.ts
Type: Service-Validator circular reference
Severity: 🔴 Critical
Files Involved: 2
```
### Step 3: Categorize by Severity
**🔴 Critical (Must Fix):**
- Service-to-service cycles
- Data-access layer cycles
- Store dependencies creating cycles
**⚠️ Warning (Should Fix):**
- Component-to-component cycles
- Model cross-references
- Utility function cycles
** Info (Review):**
- Type-only circular references (may be acceptable)
- Test file circular imports
### Step 4: Choose Fix Strategy
**Strategy 1: Extract to Shared Utility**
```typescript
// BEFORE (Circular)
// order.service.ts imports validator.ts
// validator.ts imports order.service.ts
// AFTER (Fixed)
// Create @isa/oms/util/types.ts
export interface OrderData { id: string; }
// order.service.ts imports types
// validator.ts imports types
// No more cycle
```
**Strategy 2: Dependency Injection (Lazy)**
```typescript
// BEFORE
import { ServiceB } from './service-b';
export class ServiceA {
constructor(private serviceB: ServiceB) {}
}
// AFTER
import { Injector } from '@angular/core';
export class ServiceA {
private serviceB!: ServiceB;
constructor(private injector: Injector) {
setTimeout(() => {
this.serviceB = this.injector.get(ServiceB);
});
}
}
```
**Strategy 3: Interface Extraction**
```typescript
// BEFORE (Models with circular reference)
// order.ts ↔ customer.ts
// AFTER
// order.interface.ts - no imports
export interface IOrder { customerId: string; }
// customer.interface.ts - no imports
export interface ICustomer { orderIds: string[]; }
// order.ts imports only ICustomer
// customer.ts imports only IOrder
```
**Strategy 4: Move Shared Code**
```typescript
// BEFORE
// feature-a imports feature-b
// feature-b imports feature-a
// AFTER
// Extract to @isa/shared/[name]
// Both features import from shared
```
**Strategy 5: Forward References (Angular)**
```typescript
// Use forwardRef for components
import { forwardRef } from '@angular/core';
@Component({
imports: [forwardRef(() => ChildComponent)]
})
```
### Step 5: Implement Fix
Apply chosen strategy:
1. Create new files if needed (util library, interfaces)
2. Update imports in both files
3. Remove circular import
### Step 6: Validate Fix
```bash
# Check cycle resolved
madge --circular --extensions ts libs/
# TypeScript compilation
npx tsc --noEmit
# Run tests
npx nx affected:test --skip-nx-cache
# Lint
npx nx affected:lint
```
### Step 7: Generate Report
```
Circular Dependency Resolution
===============================
Analysis Date: [timestamp]
📊 Summary
----------
Circular dependencies found: XX
🔴 Critical: XX
⚠️ Warning: XX
Fixed: XX
🔍 Detected Cycles
------------------
🔴 Critical Cycle #1 (FIXED)
Path: order.service → validator → order.service
Strategy Used: Extract to Util Library
Created: @isa/oms/util/order-types.ts
Files Modified: 2
Status: ✅ Resolved
⚠️ Warning Cycle #2 (FIXED)
Path: component-a → component-b → component-a
Strategy Used: Move Shared to @isa/ui
Created: @isa/ui/shared-component
Files Modified: 3
Status: ✅ Resolved
💡 Fix Strategies Applied
--------------------------
1. Extract to Util: XX cycles
2. Interface Extraction: XX cycles
3. Move Shared Code: XX cycles
4. Dependency Injection: XX cycles
✅ Validation
-------------
- madge check: ✅ No cycles
- TypeScript: ✅ Compiles
- Tests: ✅ XX/XX passing
- Lint: ✅ Passed
🎯 Prevention Tips
------------------
1. Add ESLint rule: import/no-cycle
2. Pre-commit hook for cycle detection
3. Regular architecture reviews
```
## Prevention
**ESLint Configuration:**
```json
{
"import/no-cycle": ["error", { "maxDepth": 1 }]
}
```
**Pre-commit Hook:**
```bash
#!/bin/bash
madge --circular --extensions ts libs/
if [ $? -ne 0 ]; then
echo "❌ Circular dependencies detected"
exit 1
fi
```
## References
- Madge: https://github.com/pahen/madge
- Nx dependency graph: https://nx.dev/features/explore-graph
- ESLint import plugin: https://github.com/import-js/eslint-plugin-import

View File

@@ -0,0 +1,223 @@
---
name: library-scaffolder
description: This skill should be used when creating new Angular libraries in the ISA-Frontend monorepo. It handles Nx library generation with proper naming conventions, Vitest configuration with JUnit/Cobertura reporters, path alias setup, and validation. Use this skill when the user wants to create a new library, scaffold a feature/data-access/ui/util library, or requests "new library" creation.
---
# Library Scaffolder
## Overview
Automate the creation of new Angular libraries following ISA-Frontend conventions. This skill handles the complete scaffolding workflow including Nx generation, Vitest configuration with CI/CD integration, path alias verification, and initial validation.
## When to Use This Skill
Invoke this skill when:
- User requests creating a new library
- User mentions "new library", "scaffold library", or "create feature"
- User wants to add a new domain/layer/feature to the monorepo
## Required Parameters
User must provide:
- **domain**: Domain name (oms, remission, checkout, ui, core, shared, utils)
- **layer**: Layer type (feature, data-access, ui, util)
- **name**: Library name in kebab-case
## Scaffolding Workflow
### Step 1: Validate Input
1. **Verify Domain**
- Use `docs-researcher` to check `docs/library-reference.md`
- Ensure domain follows existing patterns
2. **Validate Layer**
- Must be one of: feature, data-access, ui, util
3. **Check Name**
- Must be kebab-case
- Must not conflict with existing libraries
4. **Determine Path Depth**
- 3 levels: `libs/domain/layer/name``../../../`
- 4 levels: `libs/domain/type/layer/name``../../../../`
### Step 2: Run Dry-Run
Execute Nx generator with `--dry-run`:
```bash
npx nx generate @nx/angular:library \
--name=[domain]-[layer]-[name] \
--directory=libs/[domain]/[layer]/[name] \
--importPath=@isa/[domain]/[layer]/[name] \
--style=css \
--unitTestRunner=vitest \
--standalone=true \
--skipTests=false \
--dry-run
```
Review output with user before proceeding.
### Step 3: Generate Library
Execute without `--dry-run`:
```bash
npx nx generate @nx/angular:library \
--name=[domain]-[layer]-[name] \
--directory=libs/[domain]/[layer]/[name] \
--importPath=@isa/[domain]/[layer]/[name] \
--style=css \
--unitTestRunner=vitest \
--standalone=true \
--skipTests=false
```
### Step 4: Configure Vitest with JUnit and Cobertura
Update `libs/[path]/vite.config.mts`:
```typescript
/// <reference types='vitest' />
import { defineConfig } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin';
export default
// @ts-expect-error - Vitest reporter tuple types have complex inference issues
defineConfig(() => ({
root: __dirname,
cacheDir: '../../../node_modules/.vite/libs/[path]',
plugins: [angular(), nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])],
test: {
watch: false,
globals: true,
environment: 'jsdom',
include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
setupFiles: ['src/test-setup.ts'],
reporters: [
'default',
['junit', { outputFile: '../../../testresults/junit-[library-name].xml' }],
],
coverage: {
reportsDirectory: '../../../coverage/libs/[path]',
provider: 'v8' as const,
reporter: ['text', 'cobertura'],
},
},
}));
```
**Critical**: Adjust path depth based on library location.
### Step 5: Verify Configuration
1. **Check Path Alias**
- Verify `tsconfig.base.json` was updated
- Should have: `"@isa/[domain]/[layer]/[name]": ["libs/[domain]/[layer]/[name]/src/index.ts"]`
2. **Run Initial Test**
```bash
npx nx test [library-name] --coverage.enabled=true --skip-nx-cache
```
3. **Verify CI/CD Files Created**
- JUnit XML: `testresults/junit-[library-name].xml`
- Cobertura XML: `coverage/libs/[path]/cobertura-coverage.xml`
### Step 6: Create Library README
Use `docs-researcher` to find similar library READMEs, then create comprehensive documentation including:
- Overview and purpose
- Installation/import instructions
- API documentation
- Usage examples
- Testing information (Vitest + Angular Testing Utilities)
### Step 7: Update Library Reference
Add entry to `docs/library-reference.md` under appropriate domain:
```markdown
#### `@isa/[domain]/[layer]/[name]`
**Path:** `libs/[domain]/[layer]/[name]`
**Type:** [Feature/Data Access/UI/Util]
**Testing:** Vitest
[Brief description]
```
### Step 8: Run Full Validation
```bash
# Lint
npx nx lint [library-name]
# Test with coverage
npx nx test [library-name] --coverage.enabled=true --skip-nx-cache
# Build (if buildable)
npx nx build [library-name]
# Dependency graph
npx nx graph --focus=[library-name]
```
### Step 9: Generate Creation Report
```
Library Created Successfully
============================
Library Name: [domain]-[layer]-[name]
Path: libs/[domain]/[layer]/[name]
Import Alias: @isa/[domain]/[layer]/[name]
✅ Configuration
----------------
Test Framework: Vitest with Angular Testing Utilities
Style: CSS
Standalone: Yes
JUnit Reporter: ✅ testresults/junit-[library-name].xml
Cobertura Coverage: ✅ coverage/libs/[path]/cobertura-coverage.xml
📦 Import Statement
-------------------
import { Component } from '@isa/[domain]/[layer]/[name]';
🧪 Test Commands
----------------
npx nx test [library-name] --skip-nx-cache
npx nx test [library-name] --coverage.enabled=true --skip-nx-cache
📝 Next Steps
-------------
1. Develop library features
2. Write tests using Vitest + Angular Testing Utilities
3. Add E2E attributes (data-what, data-which) to templates
4. Update README with usage examples
```
## Error Handling
**Issue: Path depth mismatch**
- Count directory levels from workspace root
- Adjust `../` in outputFile and reportsDirectory
**Issue: TypeScript errors in vite.config.mts**
- Add `// @ts-expect-error` before `defineConfig()`
**Issue: Path alias not working**
- Check tsconfig.base.json
- Run `npx nx reset`
- Restart TypeScript server
## References
- docs/guidelines/testing.md (Vitest, JUnit, Cobertura sections)
- docs/library-reference.md (domain patterns)
- CLAUDE.md (Library Organization, Testing Framework sections)
- Nx Angular Library Generator: https://nx.dev/nx-api/angular/generators/library

View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,209 @@
---
name: skill-creator
description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
license: Complete terms in LICENSE.txt
---
# Skill Creator
This skill provides guidance for creating effective skills.
## About Skills
Skills are modular, self-contained packages that extend Claude's capabilities by providing
specialized knowledge, workflows, and tools. Think of them as "onboarding guides" for specific
domains or tasks—they transform Claude from a general-purpose agent into a specialized agent
equipped with procedural knowledge that no model can fully possess.
### What Skills Provide
1. Specialized workflows - Multi-step procedures for specific domains
2. Tool integrations - Instructions for working with specific file formats or APIs
3. Domain expertise - Company-specific knowledge, schemas, business logic
4. Bundled resources - Scripts, references, and assets for complex and repetitive tasks
### Anatomy of a Skill
Every skill consists of a required SKILL.md file and optional bundled resources:
```
skill-name/
├── SKILL.md (required)
│ ├── YAML frontmatter metadata (required)
│ │ ├── name: (required)
│ │ └── description: (required)
│ └── Markdown instructions (required)
└── Bundled Resources (optional)
├── scripts/ - Executable code (Python/Bash/etc.)
├── references/ - Documentation intended to be loaded into context as needed
└── assets/ - Files used in output (templates, icons, fonts, etc.)
```
#### SKILL.md (required)
**Metadata Quality:** The `name` and `description` in YAML frontmatter determine when Claude will use the skill. Be specific about what the skill does and when to use it. Use the third-person (e.g. "This skill should be used when..." instead of "Use this skill when...").
#### Bundled Resources (optional)
##### Scripts (`scripts/`)
Executable code (Python/Bash/etc.) for tasks that require deterministic reliability or are repeatedly rewritten.
- **When to include**: When the same code is being rewritten repeatedly or deterministic reliability is needed
- **Example**: `scripts/rotate_pdf.py` for PDF rotation tasks
- **Benefits**: Token efficient, deterministic, may be executed without loading into context
- **Note**: Scripts may still need to be read by Claude for patching or environment-specific adjustments
##### References (`references/`)
Documentation and reference material intended to be loaded as needed into context to inform Claude's process and thinking.
- **When to include**: For documentation that Claude should reference while working
- **Examples**: `references/finance.md` for financial schemas, `references/mnda.md` for company NDA template, `references/policies.md` for company policies, `references/api_docs.md` for API specifications
- **Use cases**: Database schemas, API documentation, domain knowledge, company policies, detailed workflow guides
- **Benefits**: Keeps SKILL.md lean, loaded only when Claude determines it's needed
- **Best practice**: If files are large (>10k words), include grep search patterns in SKILL.md
- **Avoid duplication**: Information should live in either SKILL.md or references files, not both. Prefer references files for detailed information unless it's truly core to the skill—this keeps SKILL.md lean while making information discoverable without hogging the context window. Keep only essential procedural instructions and workflow guidance in SKILL.md; move detailed reference material, schemas, and examples to references files.
##### Assets (`assets/`)
Files not intended to be loaded into context, but rather used within the output Claude produces.
- **When to include**: When the skill needs files that will be used in the final output
- **Examples**: `assets/logo.png` for brand assets, `assets/slides.pptx` for PowerPoint templates, `assets/frontend-template/` for HTML/React boilerplate, `assets/font.ttf` for typography
- **Use cases**: Templates, images, icons, boilerplate code, fonts, sample documents that get copied or modified
- **Benefits**: Separates output resources from documentation, enables Claude to use files without loading them into context
### Progressive Disclosure Design Principle
Skills use a three-level loading system to manage context efficiently:
1. **Metadata (name + description)** - Always in context (~100 words)
2. **SKILL.md body** - When skill triggers (<5k words)
3. **Bundled resources** - As needed by Claude (Unlimited*)
*Unlimited because scripts can be executed without reading into context window.
## Skill Creation Process
To create a skill, follow the "Skill Creation Process" in order, skipping steps only if there is a clear reason why they are not applicable.
### Step 1: Understanding the Skill with Concrete Examples
Skip this step only when the skill's usage patterns are already clearly understood. It remains valuable even when working with an existing skill.
To create an effective skill, clearly understand concrete examples of how the skill will be used. This understanding can come from either direct user examples or generated examples that are validated with user feedback.
For example, when building an image-editor skill, relevant questions include:
- "What functionality should the image-editor skill support? Editing, rotating, anything else?"
- "Can you give some examples of how this skill would be used?"
- "I can imagine users asking for things like 'Remove the red-eye from this image' or 'Rotate this image'. Are there other ways you imagine this skill being used?"
- "What would a user say that should trigger this skill?"
To avoid overwhelming users, avoid asking too many questions in a single message. Start with the most important questions and follow up as needed for better effectiveness.
Conclude this step when there is a clear sense of the functionality the skill should support.
### Step 2: Planning the Reusable Skill Contents
To turn concrete examples into an effective skill, analyze each example by:
1. Considering how to execute on the example from scratch
2. Identifying what scripts, references, and assets would be helpful when executing these workflows repeatedly
Example: When building a `pdf-editor` skill to handle queries like "Help me rotate this PDF," the analysis shows:
1. Rotating a PDF requires re-writing the same code each time
2. A `scripts/rotate_pdf.py` script would be helpful to store in the skill
Example: When designing a `frontend-webapp-builder` skill for queries like "Build me a todo app" or "Build me a dashboard to track my steps," the analysis shows:
1. Writing a frontend webapp requires the same boilerplate HTML/React each time
2. An `assets/hello-world/` template containing the boilerplate HTML/React project files would be helpful to store in the skill
Example: When building a `big-query` skill to handle queries like "How many users have logged in today?" the analysis shows:
1. Querying BigQuery requires re-discovering the table schemas and relationships each time
2. A `references/schema.md` file documenting the table schemas would be helpful to store in the skill
To establish the skill's contents, analyze each concrete example to create a list of the reusable resources to include: scripts, references, and assets.
### Step 3: Initializing the Skill
At this point, it is time to actually create the skill.
Skip this step only if the skill being developed already exists, and iteration or packaging is needed. In this case, continue to the next step.
When creating a new skill from scratch, always run the `init_skill.py` script. The script conveniently generates a new template skill directory that automatically includes everything a skill requires, making the skill creation process much more efficient and reliable.
Usage:
```bash
scripts/init_skill.py <skill-name> --path <output-directory>
```
The script:
- Creates the skill directory at the specified path
- Generates a SKILL.md template with proper frontmatter and TODO placeholders
- Creates example resource directories: `scripts/`, `references/`, and `assets/`
- Adds example files in each directory that can be customized or deleted
After initialization, customize or remove the generated SKILL.md and example files as needed.
### Step 4: Edit the Skill
When editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of Claude to use. Focus on including information that would be beneficial and non-obvious to Claude. Consider what procedural knowledge, domain-specific details, or reusable assets would help another Claude instance execute these tasks more effectively.
#### Start with Reusable Skill Contents
To begin implementation, start with the reusable resources identified above: `scripts/`, `references/`, and `assets/` files. Note that this step may require user input. For example, when implementing a `brand-guidelines` skill, the user may need to provide brand assets or templates to store in `assets/`, or documentation to store in `references/`.
Also, delete any example files and directories not needed for the skill. The initialization script creates example files in `scripts/`, `references/`, and `assets/` to demonstrate structure, but most skills won't need all of them.
#### Update SKILL.md
**Writing Style:** Write the entire skill using **imperative/infinitive form** (verb-first instructions), not second person. Use objective, instructional language (e.g., "To accomplish X, do Y" rather than "You should do X" or "If you need to do X"). This maintains consistency and clarity for AI consumption.
To complete SKILL.md, answer the following questions:
1. What is the purpose of the skill, in a few sentences?
2. When should the skill be used?
3. In practice, how should Claude use the skill? All reusable skill contents developed above should be referenced so that Claude knows how to use them.
### Step 5: Packaging a Skill
Once the skill is ready, it should be packaged into a distributable zip file that gets shared with the user. The packaging process automatically validates the skill first to ensure it meets all requirements:
```bash
scripts/package_skill.py <path/to/skill-folder>
```
Optional output directory specification:
```bash
scripts/package_skill.py <path/to/skill-folder> ./dist
```
The packaging script will:
1. **Validate** the skill automatically, checking:
- YAML frontmatter format and required fields
- Skill naming conventions and directory structure
- Description completeness and quality
- File organization and resource references
2. **Package** the skill if validation passes, creating a zip file named after the skill (e.g., `my-skill.zip`) that includes all files and maintains the proper directory structure for distribution.
If validation fails, the script will report the errors and exit without creating a package. Fix any validation errors and run the packaging command again.
### Step 6: Iterate
After testing the skill, users may request improvements. Often this happens right after using the skill, with fresh context of how the skill performed.
**Iteration workflow:**
1. Use the skill on real tasks
2. Notice struggles or inefficiencies
3. Identify how SKILL.md or bundled resources should be updated
4. Implement changes and test again

View File

@@ -0,0 +1,303 @@
#!/usr/bin/env python3
"""
Skill Initializer - Creates a new skill from template
Usage:
init_skill.py <skill-name> --path <path>
Examples:
init_skill.py my-new-skill --path skills/public
init_skill.py my-api-helper --path skills/private
init_skill.py custom-skill --path /custom/location
"""
import sys
from pathlib import Path
SKILL_TEMPLATE = """---
name: {skill_name}
description: [TODO: Complete and informative explanation of what the skill does and when to use it. Include WHEN to use this skill - specific scenarios, file types, or tasks that trigger it.]
---
# {skill_title}
## Overview
[TODO: 1-2 sentences explaining what this skill enables]
## Structuring This Skill
[TODO: Choose the structure that best fits this skill's purpose. Common patterns:
**1. Workflow-Based** (best for sequential processes)
- Works well when there are clear step-by-step procedures
- Example: DOCX skill with "Workflow Decision Tree""Reading""Creating""Editing"
- Structure: ## Overview → ## Workflow Decision Tree → ## Step 1 → ## Step 2...
**2. Task-Based** (best for tool collections)
- Works well when the skill offers different operations/capabilities
- Example: PDF skill with "Quick Start""Merge PDFs""Split PDFs""Extract Text"
- Structure: ## Overview → ## Quick Start → ## Task Category 1 → ## Task Category 2...
**3. Reference/Guidelines** (best for standards or specifications)
- Works well for brand guidelines, coding standards, or requirements
- Example: Brand styling with "Brand Guidelines""Colors""Typography""Features"
- Structure: ## Overview → ## Guidelines → ## Specifications → ## Usage...
**4. Capabilities-Based** (best for integrated systems)
- Works well when the skill provides multiple interrelated features
- Example: Product Management with "Core Capabilities" → numbered capability list
- Structure: ## Overview → ## Core Capabilities → ### 1. Feature → ### 2. Feature...
Patterns can be mixed and matched as needed. Most skills combine patterns (e.g., start with task-based, add workflow for complex operations).
Delete this entire "Structuring This Skill" section when done - it's just guidance.]
## [TODO: Replace with the first main section based on chosen structure]
[TODO: Add content here. See examples in existing skills:
- Code samples for technical skills
- Decision trees for complex workflows
- Concrete examples with realistic user requests
- References to scripts/templates/references as needed]
## Resources
This skill includes example resource directories that demonstrate how to organize different types of bundled resources:
### scripts/
Executable code (Python/Bash/etc.) that can be run directly to perform specific operations.
**Examples from other skills:**
- PDF skill: `fill_fillable_fields.py`, `extract_form_field_info.py` - utilities for PDF manipulation
- DOCX skill: `document.py`, `utilities.py` - Python modules for document processing
**Appropriate for:** Python scripts, shell scripts, or any executable code that performs automation, data processing, or specific operations.
**Note:** Scripts may be executed without loading into context, but can still be read by Claude for patching or environment adjustments.
### references/
Documentation and reference material intended to be loaded into context to inform Claude's process and thinking.
**Examples from other skills:**
- Product management: `communication.md`, `context_building.md` - detailed workflow guides
- BigQuery: API reference documentation and query examples
- Finance: Schema documentation, company policies
**Appropriate for:** In-depth documentation, API references, database schemas, comprehensive guides, or any detailed information that Claude should reference while working.
### assets/
Files not intended to be loaded into context, but rather used within the output Claude produces.
**Examples from other skills:**
- Brand styling: PowerPoint template files (.pptx), logo files
- Frontend builder: HTML/React boilerplate project directories
- Typography: Font files (.ttf, .woff2)
**Appropriate for:** Templates, boilerplate code, document templates, images, icons, fonts, or any files meant to be copied or used in the final output.
---
**Any unneeded directories can be deleted.** Not every skill requires all three types of resources.
"""
EXAMPLE_SCRIPT = '''#!/usr/bin/env python3
"""
Example helper script for {skill_name}
This is a placeholder script that can be executed directly.
Replace with actual implementation or delete if not needed.
Example real scripts from other skills:
- pdf/scripts/fill_fillable_fields.py - Fills PDF form fields
- pdf/scripts/convert_pdf_to_images.py - Converts PDF pages to images
"""
def main():
print("This is an example script for {skill_name}")
# TODO: Add actual script logic here
# This could be data processing, file conversion, API calls, etc.
if __name__ == "__main__":
main()
'''
EXAMPLE_REFERENCE = """# Reference Documentation for {skill_title}
This is a placeholder for detailed reference documentation.
Replace with actual reference content or delete if not needed.
Example real reference docs from other skills:
- product-management/references/communication.md - Comprehensive guide for status updates
- product-management/references/context_building.md - Deep-dive on gathering context
- bigquery/references/ - API references and query examples
## When Reference Docs Are Useful
Reference docs are ideal for:
- Comprehensive API documentation
- Detailed workflow guides
- Complex multi-step processes
- Information too lengthy for main SKILL.md
- Content that's only needed for specific use cases
## Structure Suggestions
### API Reference Example
- Overview
- Authentication
- Endpoints with examples
- Error codes
- Rate limits
### Workflow Guide Example
- Prerequisites
- Step-by-step instructions
- Common patterns
- Troubleshooting
- Best practices
"""
EXAMPLE_ASSET = """# Example Asset File
This placeholder represents where asset files would be stored.
Replace with actual asset files (templates, images, fonts, etc.) or delete if not needed.
Asset files are NOT intended to be loaded into context, but rather used within
the output Claude produces.
Example asset files from other skills:
- Brand guidelines: logo.png, slides_template.pptx
- Frontend builder: hello-world/ directory with HTML/React boilerplate
- Typography: custom-font.ttf, font-family.woff2
- Data: sample_data.csv, test_dataset.json
## Common Asset Types
- Templates: .pptx, .docx, boilerplate directories
- Images: .png, .jpg, .svg, .gif
- Fonts: .ttf, .otf, .woff, .woff2
- Boilerplate code: Project directories, starter files
- Icons: .ico, .svg
- Data files: .csv, .json, .xml, .yaml
Note: This is a text placeholder. Actual assets can be any file type.
"""
def title_case_skill_name(skill_name):
"""Convert hyphenated skill name to Title Case for display."""
return ' '.join(word.capitalize() for word in skill_name.split('-'))
def init_skill(skill_name, path):
"""
Initialize a new skill directory with template SKILL.md.
Args:
skill_name: Name of the skill
path: Path where the skill directory should be created
Returns:
Path to created skill directory, or None if error
"""
# Determine skill directory path
skill_dir = Path(path).resolve() / skill_name
# Check if directory already exists
if skill_dir.exists():
print(f"❌ Error: Skill directory already exists: {skill_dir}")
return None
# Create skill directory
try:
skill_dir.mkdir(parents=True, exist_ok=False)
print(f"✅ Created skill directory: {skill_dir}")
except Exception as e:
print(f"❌ Error creating directory: {e}")
return None
# Create SKILL.md from template
skill_title = title_case_skill_name(skill_name)
skill_content = SKILL_TEMPLATE.format(
skill_name=skill_name,
skill_title=skill_title
)
skill_md_path = skill_dir / 'SKILL.md'
try:
skill_md_path.write_text(skill_content)
print("✅ Created SKILL.md")
except Exception as e:
print(f"❌ Error creating SKILL.md: {e}")
return None
# Create resource directories with example files
try:
# Create scripts/ directory with example script
scripts_dir = skill_dir / 'scripts'
scripts_dir.mkdir(exist_ok=True)
example_script = scripts_dir / 'example.py'
example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
example_script.chmod(0o755)
print("✅ Created scripts/example.py")
# Create references/ directory with example reference doc
references_dir = skill_dir / 'references'
references_dir.mkdir(exist_ok=True)
example_reference = references_dir / 'api_reference.md'
example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
print("✅ Created references/api_reference.md")
# Create assets/ directory with example asset placeholder
assets_dir = skill_dir / 'assets'
assets_dir.mkdir(exist_ok=True)
example_asset = assets_dir / 'example_asset.txt'
example_asset.write_text(EXAMPLE_ASSET)
print("✅ Created assets/example_asset.txt")
except Exception as e:
print(f"❌ Error creating resource directories: {e}")
return None
# Print next steps
print(f"\n✅ Skill '{skill_name}' initialized successfully at {skill_dir}")
print("\nNext steps:")
print("1. Edit SKILL.md to complete the TODO items and update the description")
print("2. Customize or delete the example files in scripts/, references/, and assets/")
print("3. Run the validator when ready to check the skill structure")
return skill_dir
def main():
if len(sys.argv) < 4 or sys.argv[2] != '--path':
print("Usage: init_skill.py <skill-name> --path <path>")
print("\nSkill name requirements:")
print(" - Hyphen-case identifier (e.g., 'data-analyzer')")
print(" - Lowercase letters, digits, and hyphens only")
print(" - Max 40 characters")
print(" - Must match directory name exactly")
print("\nExamples:")
print(" init_skill.py my-new-skill --path skills/public")
print(" init_skill.py my-api-helper --path skills/private")
print(" init_skill.py custom-skill --path /custom/location")
sys.exit(1)
skill_name = sys.argv[1]
path = sys.argv[3]
print(f"🚀 Initializing skill: {skill_name}")
print(f" Location: {path}")
print()
result = init_skill(skill_name, path)
if result:
sys.exit(0)
else:
sys.exit(1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,110 @@
#!/usr/bin/env python3
"""
Skill Packager - Creates a distributable zip file of a skill folder
Usage:
python utils/package_skill.py <path/to/skill-folder> [output-directory]
Example:
python utils/package_skill.py skills/public/my-skill
python utils/package_skill.py skills/public/my-skill ./dist
"""
import sys
import zipfile
from pathlib import Path
from quick_validate import validate_skill
def package_skill(skill_path, output_dir=None):
"""
Package a skill folder into a zip file.
Args:
skill_path: Path to the skill folder
output_dir: Optional output directory for the zip file (defaults to current directory)
Returns:
Path to the created zip file, or None if error
"""
skill_path = Path(skill_path).resolve()
# Validate skill folder exists
if not skill_path.exists():
print(f"❌ Error: Skill folder not found: {skill_path}")
return None
if not skill_path.is_dir():
print(f"❌ Error: Path is not a directory: {skill_path}")
return None
# Validate SKILL.md exists
skill_md = skill_path / "SKILL.md"
if not skill_md.exists():
print(f"❌ Error: SKILL.md not found in {skill_path}")
return None
# Run validation before packaging
print("🔍 Validating skill...")
valid, message = validate_skill(skill_path)
if not valid:
print(f"❌ Validation failed: {message}")
print(" Please fix the validation errors before packaging.")
return None
print(f"{message}\n")
# Determine output location
skill_name = skill_path.name
if output_dir:
output_path = Path(output_dir).resolve()
output_path.mkdir(parents=True, exist_ok=True)
else:
output_path = Path.cwd()
zip_filename = output_path / f"{skill_name}.zip"
# Create the zip file
try:
with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
# Walk through the skill directory
for file_path in skill_path.rglob('*'):
if file_path.is_file():
# Calculate the relative path within the zip
arcname = file_path.relative_to(skill_path.parent)
zipf.write(file_path, arcname)
print(f" Added: {arcname}")
print(f"\n✅ Successfully packaged skill to: {zip_filename}")
return zip_filename
except Exception as e:
print(f"❌ Error creating zip file: {e}")
return None
def main():
if len(sys.argv) < 2:
print("Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]")
print("\nExample:")
print(" python utils/package_skill.py skills/public/my-skill")
print(" python utils/package_skill.py skills/public/my-skill ./dist")
sys.exit(1)
skill_path = sys.argv[1]
output_dir = sys.argv[2] if len(sys.argv) > 2 else None
print(f"📦 Packaging skill: {skill_path}")
if output_dir:
print(f" Output directory: {output_dir}")
print()
result = package_skill(skill_path, output_dir)
if result:
sys.exit(0)
else:
sys.exit(1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""
Quick validation script for skills - minimal version
"""
import sys
import os
import re
from pathlib import Path
def validate_skill(skill_path):
"""Basic validation of a skill"""
skill_path = Path(skill_path)
# Check SKILL.md exists
skill_md = skill_path / 'SKILL.md'
if not skill_md.exists():
return False, "SKILL.md not found"
# Read and validate frontmatter
content = skill_md.read_text()
if not content.startswith('---'):
return False, "No YAML frontmatter found"
# Extract frontmatter
match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
if not match:
return False, "Invalid frontmatter format"
frontmatter = match.group(1)
# Check required fields
if 'name:' not in frontmatter:
return False, "Missing 'name' in frontmatter"
if 'description:' not in frontmatter:
return False, "Missing 'description' in frontmatter"
# Extract name for validation
name_match = re.search(r'name:\s*(.+)', frontmatter)
if name_match:
name = name_match.group(1).strip()
# Check naming convention (hyphen-case: lowercase with hyphens)
if not re.match(r'^[a-z0-9-]+$', name):
return False, f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)"
if name.startswith('-') or name.endswith('-') or '--' in name:
return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens"
# Extract and validate description
desc_match = re.search(r'description:\s*(.+)', frontmatter)
if desc_match:
description = desc_match.group(1).strip()
# Check for angle brackets
if '<' in description or '>' in description:
return False, "Description cannot contain angle brackets (< or >)"
return True, "Skill is valid!"
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python quick_validate.py <skill_directory>")
sys.exit(1)
valid, message = validate_skill(sys.argv[1])
print(message)
sys.exit(0 if valid else 1)

View File

@@ -0,0 +1,212 @@
---
name: standalone-component-migrator
description: This skill should be used when converting Angular NgModule-based components to standalone architecture. It handles dependency analysis, template scanning, route refactoring, and test updates. Use this skill when the user requests component migration to standalone, mentions "convert to standalone", or wants to modernize Angular components to the latest patterns.
---
# Standalone Component Migrator
## Overview
Automate the conversion of Angular components from NgModule-based architecture to standalone components with explicit imports. This skill analyzes component dependencies, updates routing configurations, migrates tests, and optionally converts to modern Angular control flow syntax (@if, @for, @switch).
## When to Use This Skill
Invoke this skill when:
- User requests component conversion to standalone
- User mentions "migrate to standalone" or "modernize component"
- User wants to remove NgModule declarations
- User references Angular's standalone component architecture
## Migration Workflow
### Step 1: Analyze Component Dependencies
1. **Read Component File**
- Identify component decorator configuration
- Note selector, template path, style paths
- Check if already standalone
2. **Analyze Template**
- Read template file (HTML)
- Scan for directives: `*ngIf`, `*ngFor`, `*ngSwitch` → requires CommonModule
- Scan for forms: `ngModel`, `formControl` → requires FormsModule or ReactiveFormsModule
- Scan for built-in pipes: `async`, `date`, `json` → CommonModule
- Scan for custom components: identify all component selectors
- Scan for router directives: `routerLink`, `router-outlet` → RouterModule
3. **Find Parent NgModule**
- Search for NgModule that declares this component
- Read NgModule file to understand current imports
### Step 2: Convert Component to Standalone
Add `standalone: true` and explicit imports array:
```typescript
// BEFORE
import { Component } from '@angular/core';
@Component({
selector: 'app-my-component',
templateUrl: './my-component.component.html'
})
export class MyComponent { }
// AFTER
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { ChildComponent } from './child.component';
import { CustomPipe } from '@isa/utils/pipes';
@Component({
selector: 'app-my-component',
standalone: true,
imports: [
CommonModule,
FormsModule,
RouterModule,
ChildComponent,
CustomPipe
],
templateUrl: './my-component.component.html'
})
export class MyComponent { }
```
### Step 3: Update Parent NgModule
Remove component from declarations, add to imports if exported:
```typescript
// BEFORE
@NgModule({
declarations: [MyComponent, OtherComponent],
imports: [CommonModule],
exports: [MyComponent]
})
// AFTER
@NgModule({
declarations: [OtherComponent],
imports: [CommonModule, MyComponent], // Import standalone component
exports: [MyComponent]
})
```
If NgModule becomes empty (no declarations), consider removing it entirely.
### Step 4: Update Routes (if applicable)
Convert to lazy-loaded standalone component:
```typescript
// BEFORE
const routes: Routes = [
{ path: 'feature', component: MyComponent }
];
// AFTER (lazy loading)
const routes: Routes = [
{
path: 'feature',
loadComponent: () => import('./my-component.component').then(m => m.MyComponent)
}
];
```
### Step 5: Update Tests
Convert test configuration:
```typescript
// BEFORE
TestBed.configureTestingModule({
declarations: [MyComponent],
imports: [CommonModule, FormsModule]
});
// AFTER
TestBed.configureTestingModule({
imports: [MyComponent] // Component imports its own dependencies
});
```
### Step 6: Optional - Migrate to Modern Control Flow
If requested, convert to new Angular control flow syntax:
```typescript
// OLD
<div *ngIf="condition">Content</div>
<div *ngFor="let item of items; trackBy: trackById">{{ item.name }}</div>
<div [ngSwitch]="value">
<div *ngSwitchCase="'a'">A</div>
<div *ngSwitchDefault>Default</div>
</div>
// NEW
@if (condition) {
<div>Content</div>
}
@for (item of items; track item.id) {
<div>{{ item.name }}</div>
}
@switch (value) {
@case ('a') { <div>A</div> }
@default { <div>Default</div> }
}
```
### Step 7: Validate and Test
1. **Compile Check**
```bash
npx tsc --noEmit
```
2. **Run Tests**
```bash
npx nx test [library-name] --skip-nx-cache
```
3. **Lint Check**
```bash
npx nx lint [library-name]
```
4. **Verify Application Runs**
```bash
npm start
```
## Common Import Patterns
| Template Usage | Required Import |
|---------------|-----------------|
| `*ngIf`, `*ngFor`, `*ngSwitch` | `CommonModule` |
| `ngModel` | `FormsModule` |
| `formControl`, `formGroup` | `ReactiveFormsModule` |
| `routerLink`, `router-outlet` | `RouterModule` |
| `async`, `date`, `json` pipes | `CommonModule` |
| Custom components | Direct component import |
| Custom pipes | Direct pipe import |
## Error Handling
**Issue: Circular dependencies**
- Extract shared interfaces to util library
- Use dependency injection for services
- Avoid component A importing component B when B imports A
**Issue: Missing imports causing template errors**
- Check browser console for specific errors
- Verify all template dependencies are in imports array
- Use Angular Language Service in IDE for hints
## References
- Angular Standalone Components: https://angular.dev/guide/components/importing
- Modern Control Flow: https://angular.dev/guide/templates/control-flow
- CLAUDE.md Component Architecture section

View File

@@ -0,0 +1,134 @@
---
name: swagger-sync-manager
description: This skill should be used when regenerating Swagger/OpenAPI TypeScript API clients in the ISA-Frontend monorepo. It handles generation of all 10 API clients (or specific ones), Unicode cleanup, breaking change detection, TypeScript validation, and affected test execution. Use this skill when the user requests API sync, mentions "regenerate swagger", or indicates backend API changes.
---
# Swagger Sync Manager
## Overview
Automate the regeneration of TypeScript API clients from Swagger/OpenAPI specifications. Handles 10 API clients with automatic post-processing, breaking change detection, impact analysis, and validation.
## When to Use This Skill
Invoke when user requests:
- API client regeneration
- "sync swagger" or "update API clients"
- Backend API changes need frontend updates
## Available APIs
availability-api, cat-search-api, checkout-api, crm-api, eis-api, inventory-api, isa-api, oms-api, print-api, wws-api
## Sync Workflow
### Step 1: Pre-Generation Check
```bash
# Check uncommitted changes
git status generated/swagger/
```
If changes exist, warn user and ask to proceed.
### Step 2: Backup Current State (Optional)
```bash
cp -r generated/swagger generated/swagger.backup.$(date +%s)
```
### Step 3: Run Generation
```bash
# All APIs
npm run generate:swagger
# Specific API (if api-name provided)
npm run generate:swagger:[api-name]
```
### Step 4: Verify Unicode Cleanup
Check `tools/fix-files.js` executed. Scan for remaining Unicode issues:
```bash
grep -r "\\\\u00" generated/swagger/ || echo "✅ No Unicode issues"
```
### Step 5: Detect Breaking Changes
For each modified API:
```bash
git diff generated/swagger/[api-name]/
```
Identify:
- 🔴 Removed properties
- 🔴 Changed types
- 🔴 Removed endpoints
- ✅ Added properties (safe)
- ✅ New endpoints (safe)
### Step 6: Impact Analysis
Use `Explore` agent to find affected files:
- Search for imports from `@generated/swagger/[api-name]`
- List data-access services using changed APIs
- Estimate refactoring scope
### Step 7: Validate
```bash
# TypeScript compilation
npx tsc --noEmit
# Run affected tests
npx nx affected:test --skip-nx-cache
# Lint affected
npx nx affected:lint
```
### Step 8: Generate Report
```
Swagger Sync Complete
=====================
APIs Regenerated: [all | specific]
Files Changed: XX
Breaking Changes: XX
🔴 Breaking Changes
-------------------
- [API]: [Property removed/type changed]
- Affected files: [list]
✅ Compatible Changes
---------------------
- [API]: [New properties/endpoints]
📊 Validation
-------------
TypeScript: ✅/❌
Tests: XX/XX passing
Lint: ✅/❌
💡 Next Steps
-------------
[Fix breaking changes / Deploy]
```
## Error Handling
**Generation fails**: Check OpenAPI spec URLs in package.json
**Unicode cleanup fails**: Run `node tools/fix-files.js` manually
**TypeScript errors**: Review breaking changes, update affected services
## References
- CLAUDE.md API Integration section
- package.json swagger generation scripts

View File

@@ -0,0 +1,344 @@
---
name: test-migration-specialist
description: This skill should be used when migrating Angular libraries from Jest + Spectator to Vitest + Angular Testing Utilities. It handles test configuration updates, test file refactoring, mock pattern conversion, and validation. Use this skill when the user requests test framework migration, specifically for the 40 remaining Jest-based libraries in the ISA-Frontend monorepo.
---
# Test Migration Specialist
## Overview
Automate the migration of Angular library tests from Jest + Spectator to Vitest + Angular Testing Utilities. This skill handles the complete migration workflow including configuration updates, test file refactoring, dependency management, and validation.
**Current Migration Status**: 40 libraries use Jest (65.6%), 21 libraries use Vitest (34.4%)
## When to Use This Skill
Invoke this skill when:
- User requests test migration for a specific library
- User mentions "migrate tests" or "Jest to Vitest"
- User wants to update test framework for a library
- User references the 40 remaining libraries to migrate
## Migration Workflow
### Step 1: Pre-Migration Analysis
Before making any changes, analyze the current state:
1. **Read Testing Guidelines**
- Use `docs-researcher` agent to read `docs/guidelines/testing.md`
- Understand migration patterns and best practices
- Note JUnit and Cobertura configuration requirements
2. **Analyze Library Structure**
- Read `libs/[path]/project.json` to identify current test executor
- Count test files using Glob: `**/*.spec.ts`
- Scan for Spectator usage patterns using Grep: `createComponentFactory|createServiceFactory|Spectator`
- Identify complex mocking scenarios (ng-mocks, jest.mock patterns)
3. **Determine Library Depth**
- Calculate directory levels from workspace root
- This affects relative paths in vite.config.mts (../../../ vs ../../../../)
### Step 2: Update Test Configuration
Update the library's test configuration to use Vitest:
1. **Update project.json**
Replace Jest executor with Vitest:
```json
{
"test": {
"executor": "@nx/vite:test",
"options": {
"configFile": "vite.config.mts"
}
}
}
```
2. **Create vite.config.mts**
Create configuration with JUnit and Cobertura reporters:
```typescript
/// <reference types='vitest' />
import { defineConfig } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin';
export default
// @ts-expect-error - Vitest reporter tuple types have complex inference issues
defineConfig(() => ({
root: __dirname,
cacheDir: '../../../node_modules/.vite/libs/[path]',
plugins: [angular(), nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])],
test: {
watch: false,
globals: true,
environment: 'jsdom',
include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
setupFiles: ['src/test-setup.ts'],
reporters: [
'default',
['junit', { outputFile: '../../../testresults/junit-[library-name].xml' }],
],
coverage: {
reportsDirectory: '../../../coverage/libs/[path]',
provider: 'v8' as const,
reporter: ['text', 'cobertura'],
},
},
}));
```
**Critical**: Adjust `../../../` depth based on library location
### Step 3: Migrate Test Files
For each `.spec.ts` file, perform these conversions:
1. **Update Imports**
```typescript
// REMOVE
import { createComponentFactory, Spectator } from '@ngneat/spectator/jest';
// ADD
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { describe, it, expect, beforeEach } from 'vitest';
```
2. **Convert Component Tests**
```typescript
// OLD (Spectator)
const createComponent = createComponentFactory({
component: MyComponent,
imports: [CommonModule],
mocks: [MyService]
});
let spectator: Spectator<MyComponent>;
beforeEach(() => spectator = createComponent());
it('should display title', () => {
spectator.setInput('title', 'Test');
expect(spectator.query('h1')).toHaveText('Test');
});
// NEW (Angular Testing Utilities)
describe('MyComponent', () => {
let fixture: ComponentFixture<MyComponent>;
let component: MyComponent;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [MyComponent, CommonModule],
providers: [{ provide: MyService, useValue: mockService }]
}).compileComponents();
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
});
it('should display title', () => {
component.title = 'Test';
fixture.detectChanges();
expect(fixture.nativeElement.querySelector('h1').textContent).toContain('Test');
});
});
```
3. **Convert Service Tests**
```typescript
// OLD (Spectator)
const createService = createServiceFactory({
service: MyService,
mocks: [HttpClient]
});
// NEW (Angular Testing Utilities)
describe('MyService', () => {
let service: MyService;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [MyService]
});
service = TestBed.inject(MyService);
httpMock = TestBed.inject(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
});
```
4. **Update Mock Patterns**
- Replace `jest.fn()` → `vi.fn()`
- Replace `jest.spyOn()` → `vi.spyOn()`
- Replace `jest.mock()` → `vi.mock()`
- For complex mocks, use `ng-mocks` library if needed
5. **Update Matchers**
- Replace Spectator matchers (`toHaveText`, `toExist`) with standard Jest/Vitest matchers
- Use `expect().toBeTruthy()`, `expect().toContain()`, etc.
### Step 4: Verify E2E Attributes
Check component templates for E2E testing attributes:
1. **Scan Templates**
Use Grep to find templates: `**/*.html`
2. **Validate Attributes**
Ensure interactive elements have:
- `data-what`: Semantic description (e.g., "submit-button")
- `data-which`: Unique identifier (e.g., "form-primary")
- Dynamic `data-*` for list items: `[attr.data-item-id]="item.id"`
3. **Add Missing Attributes**
If missing, add them to components. See `dev:add-e2e-attrs` command or use that skill.
### Step 5: Run Tests and Validate
Execute tests to verify migration:
1. **Run Tests**
```bash
npx nx test [library-name] --skip-nx-cache
```
2. **Run with Coverage**
```bash
npx nx test [library-name] --coverage.enabled=true --skip-nx-cache
```
3. **Verify Output Files**
Check that CI/CD integration files are created:
- JUnit XML: `testresults/junit-[library-name].xml`
- Cobertura XML: `coverage/libs/[path]/cobertura-coverage.xml`
4. **Address Failures**
If tests fail:
- Review test conversion (common issues: missing fixture.detectChanges(), incorrect selectors)
- Check mock configurations
- Verify imports are correct
- Ensure async tests use proper patterns
### Step 6: Clean Up
Remove legacy configurations:
1. **Remove Jest Files**
- Delete `jest.config.ts` or `jest.config.js` if present
- Remove Jest-specific setup files
2. **Update Dependencies**
- Note if Spectator can be removed (check if other libs still use it)
- Note if Jest can be removed (check if other libs still use it)
- Don't actually remove from package.json unless all libs migrated
3. **Update Documentation**
Update library README.md with new test commands:
```markdown
## Testing
This library uses Vitest + Angular Testing Utilities.
```bash
# Run tests
npx nx test [library-name] --skip-nx-cache
# Run with coverage
npx nx test [library-name] --coverage.enabled=true --skip-nx-cache
```
```
### Step 7: Generate Migration Report
Provide comprehensive migration summary:
```
Test Migration Complete
=======================
Library: [library-name]
Framework: Jest + Spectator → Vitest + Angular Testing Utilities
📊 Migration Statistics
-----------------------
Test files migrated: XX
Component tests: XX
Service tests: XX
Total test cases: XX
✅ Test Results
---------------
Passing: XX/XX (100%)
Coverage: XX%
📝 Configuration
----------------
- project.json: ✅ Updated to @nx/vite:test
- vite.config.mts: ✅ Created with JUnit + Cobertura
- E2E attributes: ✅ Validated
📁 CI/CD Integration
--------------------
- JUnit XML: ✅ testresults/junit-[name].xml
- Cobertura XML: ✅ coverage/libs/[path]/cobertura-coverage.xml
🧹 Cleanup
----------
- Jest config removed: ✅
- README updated: ✅
💡 Next Steps
-------------
1. Verify tests in CI/CD pipeline
2. Monitor for any edge cases
3. Consider migrating related libraries
📚 Remaining Libraries
----------------------
Jest libraries remaining: XX/40
Progress: XX% complete
```
## Error Handling
### Common Migration Issues
**Issue 1: Tests fail after migration**
- Check `fixture.detectChanges()` is called after setting inputs
- Verify async tests use `async/await` properly
- Check component imports are correct (standalone components)
**Issue 2: Mocks not working**
- Verify `vi.fn()` syntax is correct
- Check providers array in TestBed configuration
- For complex mocks, consider using `ng-mocks`
**Issue 3: Coverage files not generated**
- Verify path depth in vite.config.mts matches library location
- Check reporters array includes `'cobertura'`
- Ensure `provider: 'v8'` is set
**Issue 4: Type errors in vite.config.mts**
- Add `// @ts-expect-error` comment before `defineConfig()`
- This is expected due to Vitest reporter type complexity
## References
Use `docs-researcher` agent to access:
- `docs/guidelines/testing.md` - Comprehensive migration guide with examples
- `CLAUDE.md` - Testing Framework section for project conventions
**Key Documentation Sections:**
- Vitest Configuration with JUnit and Cobertura
- Angular Testing Utilities examples
- Migration patterns and best practices
- E2E attribute requirements

View File

@@ -0,0 +1,199 @@
---
name: type-safety-engineer
description: This skill should be used when improving TypeScript type safety by removing `any` types, adding Zod schemas for runtime validation, creating type guards, and strengthening strictness. Use this skill when the user wants to enhance type safety, mentions "fix any types", "add Zod validation", or requests type improvements for better code quality.
---
# Type Safety Engineer
## Overview
Enhance TypeScript type safety by eliminating `any` types, adding Zod schemas for runtime validation, creating type guards, and strengthening compiler strictness.
## When to Use This Skill
Invoke when user wants to:
- Remove `any` types
- Add runtime validation with Zod
- Improve type safety
- Mentioned "type safety" or "Zod schemas"
## Type Safety Workflow
### Step 1: Scan for Issues
```bash
# Find explicit any
grep -r ": any" libs/ --include="*.ts" | grep -v ".spec.ts"
# Find functions without return types
grep -r "^.*function.*{$" libs/ --include="*.ts" | grep -v ": "
# TypeScript strict mode check
npx tsc --noEmit --strict
```
### Step 2: Categorize Issues
**🔴 Critical:**
- `any` in API response handling
- `any` in service methods
- `any` in store state types
**⚠️ Important:**
- Missing return types
- Untyped parameters
- Weak types (`object`, `Function`)
** Moderate:**
- `any` in test files
- Loose array types
### Step 3: Add Zod Schemas for API Responses
```typescript
import { z } from 'zod';
// Define schema
const OrderItemSchema = z.object({
productId: z.string().uuid(),
quantity: z.number().int().positive(),
price: z.number().positive()
});
const OrderResponseSchema = z.object({
id: z.string().uuid(),
status: z.enum(['pending', 'confirmed', 'shipped']),
items: z.array(OrderItemSchema),
createdAt: z.string().datetime()
});
// Infer TypeScript type
type OrderResponse = z.infer<typeof OrderResponseSchema>;
// Runtime validation
const order = OrderResponseSchema.parse(apiResponse);
```
### Step 4: Replace `any` with Specific Types
**Pattern 1: Unknown + Type Guards**
```typescript
// BEFORE
function processData(data: any) {
return data.value;
}
// AFTER
function processData(data: unknown): string {
if (!isValidData(data)) {
throw new Error('Invalid data');
}
return data.value;
}
function isValidData(data: unknown): data is { value: string } {
return typeof data === 'object' && data !== null && 'value' in data;
}
```
**Pattern 2: Generic Types**
```typescript
// BEFORE
function findById(items: any[], id: string): any {
return items.find(item => item.id === id);
}
// AFTER
function findById<T extends { id: string }>(items: T[], id: string): T | undefined {
return items.find(item => item.id === id);
}
```
### Step 5: Add Type Guards for API Data
```typescript
export function isOrderResponse(data: unknown): data is OrderResponse {
try {
OrderResponseSchema.parse(data);
return true;
} catch {
return false;
}
}
// Use in service
getOrder(id: string): Observable<OrderResponse> {
return this.http.get(`/api/orders/${id}`).pipe(
map(response => {
if (!isOrderResponse(response)) {
throw new Error('Invalid API response');
}
return response;
})
);
}
```
### Step 6: Validate Changes
```bash
npx tsc --noEmit --strict
npx nx affected:test --skip-nx-cache
npx nx affected:lint
```
### Step 7: Generate Report
```
Type Safety Improvements
========================
Path: [analyzed path]
🔍 Issues Found
---------------
`any` usages: XX → 0
Missing return types: XX → 0
Untyped parameters: XX → 0
✅ Improvements
---------------
- Added Zod schemas: XX
- Created type guards: XX
- Fixed `any` types: XX
- Added return types: XX
📈 Type Safety Score
--------------------
Before: XX%
After: XX% (+XX%)
💡 Recommendations
------------------
1. Enable stricter TypeScript options
2. Add validation to remaining APIs
```
## Common Patterns
**API Response Validation:**
```typescript
const schema = z.object({...});
type Type = z.infer<typeof schema>;
return this.http.get<unknown>(url).pipe(
map(response => schema.parse(response))
);
```
**Event Handlers:**
```typescript
// BEFORE: onClick(event: any)
// AFTER: onClick(event: MouseEvent)
```
## References
- Use `docs-researcher` for latest Zod documentation
- Zod: https://zod.dev
- TypeScript strict mode: https://www.typescriptlang.org/tsconfig#strict

View File

@@ -7,6 +7,7 @@ indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
end_of_line = crlf
[*.md]
max_line_length = off

86
.github/commit-instructions.md vendored Normal file
View File

@@ -0,0 +1,86 @@
# Commit Message Instructions (Conventional Commits)
Commit messages should follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/). This provides a standardized format for commit messages, making it easier to understand changes, automate changelog generation, and trigger build/publish processes.
## Format
The commit message structure is as follows:
```
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
```
---
### Components
1. **Type**: Indicates the kind of change introduced by the commit. Must be one of the allowed types (see below).
2. **Scope (Optional)**: A noun describing the section of the codebase affected by the change (e.g., `auth`, `ui`, `build`). Enclosed in parentheses.
3. **Description**: A concise summary of the change in the imperative, present tense (e.g., "add login feature", not "added login feature" or "adds login feature"). Starts with a lowercase letter and should not end with a period. Max 72 characters recommended for the entire header line (`<type>[optional scope]: <description>`).
4. **Body (Optional)**: A more detailed explanation of the changes. Use the imperative, present tense. Explain the _what_ and _why_ vs. _how_. Separate from the description by a blank line. Wrap lines at 72 characters.
5. **Footer(s) (Optional)**: Contains additional metadata. Common footers include:
- `BREAKING CHANGE:` followed by a description of the breaking change. A `!` can also be appended to the type/scope (`feat!:`) to indicate a breaking change.
- Issue references (e.g., `Refs: #123`, `Closes: #456`). Separate from the body by a blank line.
---
### Allowed Types
- **feat**: A new feature for the user.
- **fix**: A bug fix for the user.
- **build**: Changes that affect the build system or external dependencies (e.g., gulp, broccoli, npm).
- **chore**: Other changes that don't modify src or test files (e.g., updating dependencies, build tasks).
- **ci**: Changes to CI configuration files and scripts (e.g., Travis, Circle, BrowserStack, SauceLabs).
- **docs**: Documentation only changes.
- **perf**: A code change that improves performance.
- **refactor**: A code change that neither fixes a bug nor adds a feature.
- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc).
- **test**: Adding missing tests or correcting existing tests.
---
### Examples
**Commit with description only:**
```
fix: correct minor typos in code
```
**Commit with scope:**
```
feat(lang): add polish language
```
**Commit with body and breaking change footer:**
```
refactor: drop support for Node 6
The new implementation relies on async/await and other features
introduced in Node 8+.
BREAKING CHANGE: refactor to use JavaScript features not available in Node 6.
```
**Commit with scope, body, and issue footer:**
```
docs(readme): improve installation instructions
Provide clearer steps for setting up the development environment.
Add links to prerequisite tools.
Closes: #12
```
**Commit with `!` for breaking change:**
```
feat(api)!: send an email to the customer when a product is shipped
```

415
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,415 @@
## ISA Frontend AI Assistant Working Rules
Concise, project-specific guidance so an AI agent can be productive quickly. Focus on THESE patterns; avoid generic boilerplate.
### 1. Monorepo & Tooling
- Nx workspace (Angular 20 + Libraries under `libs/**`, main app `apps/isa-app`).
- Scripts (see `package.json`):
- Dev serve: `npm start` (=> `nx serve isa-app --ssl`).
- Library tests (exclude app): `npm test` (Jest + emerging Vitest). CI uses `npm run ci`.
- Build dev: `npm run build`; prod: `npm run build-prod`.
- Storybook: `npm run storybook`.
- Swagger codegen: `npm run generate:swagger` then `npm run fix:files:swagger`.
- Default branch in Nx: `develop` (`nx.json: defaultBase`). Use affected commands when adding libs.
- Node >=22, TS 5.8, ESLint flat config (`eslint.config.js`).
### 1.a Project Tree (Detailed Overview)
```
.
├─ apps/
│ └─ isa-app/ # Main Angular app (Jest). Legacy non-standalone root component pattern.
│ ├─ project.json # Build/serve/test targets
│ ├─ src/
│ │ ├─ main.ts / index.html # Angular bootstrap
│ │ ├─ app/main.component.ts # Root component (standalone:false)
│ │ ├─ environments/ # Environment files (prod replace)
│ │ ├─ assets/ # Static assets
│ │ └─ config/ # Runtime config JSON (read via Config service)
│ └─ .storybook/ # App Storybook config
├─ libs/ # All reusable code (grouped by domain / concern)
│ ├─ core/ # Cross-cutting infrastructure
│ │ ├─ logging/ # Logging service + providers + sinks
│ │ │ ├─ src/lib/logging.service.ts
│ │ │ ├─ src/lib/logging.providers.ts
│ │ │ └─ README.md # Full API & patterns
│ │ ├─ config/ # `Config` service (Zod validated lookup)
│ │ └─ storage/ # User-scoped storage + signal store feature (`withStorage`)
│ │ ├─ src/lib/signal-store-feature.ts
│ │ └─ src/lib/storage.ts
│ │
│ ├─ shared/ # Shared UI/services not domain specific
│ │ └─ scanner/ # Scandit integration (tokens, service, components, platform gating)
│ │ ├─ src/lib/scanner.service.ts
│ │ └─ src/lib/render-if-scanner-is-ready.directive.ts
│ │
│ ├─ remission/ # Remission domain features (newer pattern; Vitest)
│ │ ├─ feature/
│ │ │ ├─ remission-return-receipt-details/
│ │ │ │ ├─ vite.config.mts # Signals + Vitest example
│ │ │ │ └─ src/lib/resources/ # Resource factories (signals async pattern)
│ │ │ └─ remission-return-receipt-list/
│ │ └─ shared/ # Dialogs / shared remission UI pieces
│ │
│ ├─ common/ # Cross-domain utilities (decorators, print, data-access)
│ ├─ utils/ # Narrow utility libs (ean-validation, z-safe-parse, etc.)
│ ├─ ui/ # Generic UI components (presentational)
│ ├─ icons/ # Icon sets / wrappers
│ ├─ catalogue/ # Domain area (legacy Jest)
│ ├─ customer/ # Domain area (legacy Jest)
│ └─ oms/ # Domain area (legacy Jest)
├─ generated/swagger/ # Generated API clients (regen via scripts; do not hand edit)
├─ tools/ # Helper scripts (e.g. swagger fix script)
├─ testresults/ # JUnit XML (jest-junit). CI artifact pickup.
├─ coverage/ # Per-project coverage outputs
├─ tailwind-plugins/ # Custom Tailwind plugin modules used by `tailwind.config.js`
├─ vitest.workspace.ts # Glob enabling multi-lib Vitest detection
├─ nx.json / package.json # Workspace + scripts + defaultBase=develop
└─ eslint.config.js # Flat ESLint root config
```
Guidelines: create new code in the closest domain folder; expose public API via each lib `src/index.ts`; follow existing naming (`feature-name.type.ts`). Keep generated swagger untouched—extend via wrapper libs if needed.
### 1.b Import Path Aliases
Use existing TS path aliases (see `tsconfig.base.json`) instead of long relative paths:
Core / Cross-cutting:
- `@isa/core/logging`, `@isa/core/config`, `@isa/core/storage`, `@isa/core/tabs`, `@isa/core/notifications`
Domain & Features:
- Catalogue: `@isa/catalogue/data-access`
- Customer: `@isa/customer/data-access`
- OMS features: `@isa/oms/feature/return-details`, `.../return-process`, `.../return-review`, `.../return-search`, `.../return-summary`
- OMS shared: `@isa/oms/shared/product-info`, `@isa/oms/shared/task-list`
- Remission: `@isa/remission/data-access`, feature libs (`@isa/remission/feature/remission-return-receipt-details`, `...-list`) and shared (`@isa/remission/shared/remission-start-dialog`, `.../search-item-to-remit-dialog`, `.../return-receipt-actions`, `.../product`)
Shared / UI:
- Shared libs: `@isa/shared/scanner`, `@isa/shared/filter`, `@isa/shared/product-image`, `@isa/shared/product-router-link`, `@isa/shared/product-format`
- UI components: `@isa/ui/buttons`, `@isa/ui/dialog`, `@isa/ui/input-controls`, `@isa/ui/layout`, `@isa/ui/menu`, `@isa/ui/toolbar`, etc. (one alias per folder under `libs/ui/*`)
- Icons: `@isa/icons`
Utilities:
- `@isa/utils/ean-validation`, `@isa/utils/z-safe-parse`, `@isa/utils/scroll-position`
Generated Swagger Clients:
- `@generated/swagger/isa-api`, `@generated/swagger/oms-api`, `@generated/swagger/inventory-api`, etc. (one per subfolder). Never edit generated sources—wrap in a domain lib if extension needed.
App-local (only inside `apps/isa-app` context):
- Namespaced folders: `@adapter/*`, `@domain/*`, `@hub/*`, `@modal/*`, `@page/*`, `@shared/*` (and nested: `@shared/components/*`, `@shared/services/*`, etc.), `@ui/*`, `@utils/*`, `@swagger/*`.
Patterns:
- Always add new reusable code as a library then expose via an `@isa/...` alias; do not add new generic code under app-local aliases if it may be reused later.
- When introducing a new library ensure its `src/index.ts` re-exports only stable public surface; internal helpers stay un-exported.
- For new generated API groups, extend via thin wrappers in a domain `data-access` lib rather than patching generated code.
### 2. Testing Strategy
- Legacy tests: Jest (`@nx/jest:jest`). New feature libs (e.g. remission feature) use Vitest + Vite plugin (`vite.config.mts`).
- When adding a new library today prefer Vitest unless consistency with existing Jest-only area is required.
- Do NOT mix frameworks inside one lib. Check presence of `vite.config.*` to know it is Vitest-enabled.
- App (`isa-app`) still uses Jest.
### 3. Architecture & Cross-Cutting Services
- Core libraries underpin features: `@isa/core/logging`, `@isa/core/config`, `@isa/core/storage`.
- Feature domains grouped (e.g. `libs/remission/**`, `libs/shared/**`, `libs/common/**`). Keep domain-specific code there; UI-only pieces in `ui/` or `shared/`.
- Prefer standalone components but some legacy components set `standalone: false` (see `MainComponent`). Maintain existing pattern unless doing a focused migration.
### 4. Logging (Critical Pattern)
- Central logging via `@isa/core/logging` (files: `logging.service.ts`, `logging.providers.ts`).
- Configure once in app config using provider builders: `provideLogging(withLogLevel(...), withSink(ConsoleLogSink), withContext({...}))`.
- Use factory `logger(() => ({ dynamicContext }))` (see README) rather than injecting `LoggingService` directly unless extending framework code.
- Context hierarchy: global -> component (`provideLoggerContext`) -> instance (factory param) -> message (callback arg). Always pass context as lazy function `() => ({ ... })` for perf.
- Respect log level threshold; do not perform expensive serialization before calling (let sinks handle it or gate behind dev checks).
### 5. Configuration Access
- Use `Config` service (`@isa/core/config/src/lib/config.ts`). Fetch values with Zod schema: `config.get('licence.scandit', z.string())` (see `SCANDIT_LICENSE` token). Avoid deprecated untyped access.
### 6. Storage & State Persistence
- Storage abstraction: `injectStorage(SomeProvider)` wraps a `StorageProvider` (local/session/indexedDB/custom user storage) and prefixes keys with current authenticated user `sub` (OAuth `sub` fallback 'anonymous').
- When adding persisted signal stores, use `withStorage(storageKey, ProviderType)` feature (`signal-store-feature.ts`) to auto debounce-save (1s) + restore on init. Only pass plain serializable state.
### 7. Signals & State
- Internal state often via Angular signals & NgRx Signals (`@ngrx/signals`). Avoid manual subscriptions—prefer computed/signals and `rxMethod` for side effects.
- When persisting, ensure objects are JSON-safe; validation via Zod if deserializing external data.
#### 7.a NgRx Signals Deep Dive
Core building blocks we use:
- `signalStore(...)` + features: `withState`, `withComputed`, `withMethods`, `withHooks`, `withStorage` (custom feature in `core/storage`).
- `rxMethod` (from `@ngrx/signals/rxjs-interop`) to bridge imperative async flows (HTTP calls, debounce, switchMap) into store-driven mutations.
- `getState`, `patchState` for immutable, shallow merges; avoid manually mutating nested objects—spread + patch.
Patterns:
1. Store Shape: Keep initial state small & serializable (no class instances, functions, DOM nodes). Derive heavy or view-specific projections with `withComputed`.
2. Side Effects: Wrap fetch/update flows inside `rxMethod` pipes; ensure cancellation semantics (`switchMap`) to drop stale requests.
3. Persistence: Apply `withStorage(key, Provider)` last so hooks run after other features; persisted state must be plain JSON (no Dates—convert to ISO strings). Debounce already handled (1s) in `withStorage`—do NOT add another debounce upstream unless burst traffic is extreme.
4. Error Handling: Keep an `error` field in state for presentation; log via `logger()` at Warn/Error levels but do not store full Error object (serialize minimal fields: `message`, maybe `code`).
5. Loading Flags: Prefer a boolean `loading` OR a discriminated union `status: 'idle'|'loading'|'success'|'error'` for richer UI; avoid multiple booleans that can drift.
6. Computed Selectors: Name as `XComputed` or just semantic (e.g. `filteredItems`) using `computed(() => ...)` inside `withComputed`; never cause side-effects in a computed.
7. Resource Factory Pattern: For remote data needed in multiple components, create a factory function returning an object with `value`, `isLoading`, `error` signals plus a `reload()` method; see remission `resources/` directory.
Store Lifecycle Hooks:
- Use `withHooks({ onInit() { ... }, onDestroy() { ... } })` for restoration, websockets, or timers. Pair cleanups explicitly.
Persistence Feature (`withStorage`):
- Implementation: Debounced `storeState` rxMethod listens to any state change, saves hashed userscoped key (see `hash.utils.ts`). On init it calls `restoreState()`.
- Extending: If you need to blacklist transient fields from persistence, add a method wrapping `getState` and remove keys before `storage.set` (extend feature locally rather than editing shared code unless broadly needed).
Typical Store Template:
```ts
// feature-x.store.ts
import {
signalStore,
withState,
withComputed,
withMethods,
withHooks,
} from '@ngrx/signals';
import { rxMethod } from '@ngrx/signals/rxjs-interop';
import { debounceTime, switchMap, tap, catchError, of } from 'rxjs';
import { withStorage } from '@isa/core/storage';
import { logger } from '@isa/core/logging';
interface FeatureXState {
items: ReadonlyArray<Item>;
query: string;
loading: boolean;
error?: string;
}
const initialState: FeatureXState = { items: [], query: '', loading: false };
export const FeatureXStore = signalStore(
withState(initialState),
withProps((store, logger = logger(() => ({ store: 'FeatureX' }))) => ({
_logger: logger,
})),
withComputed(({ items, query }) => ({
filtered: computed(() => items().filter((i) => i.name.includes(query()))),
hasError: computed(() => !!query() && !items().length),
})),
withMethods((store) => ({
setQuery: (q: string) => patchState(store, { query: q }),
// rxMethod side effect to load items
loadItems: rxMethod<string | void>(
pipe(
debounceTime(150),
tap(() => patchState(store, { loading: true, error: undefined })),
switchMap(() =>
fetchItems(store.query()).pipe(
tap((items) => patchState(store, { items, loading: false })),
catchError((err) => {
store._logger.error('Load failed', err as Error, () => ({
query: store.query(),
}));
patchState(store, {
loading: false,
error: (err as Error).message,
});
return of([]);
}),
),
),
),
),
})),
withHooks((store) => ({
onInit() {
store.loadItems();
},
})),
withStorage('feature-x', LocalStorageProvider),
);
```
Testing Signal Stores (Vitest or Jest):
- Use `runInInjectionContext(TestBed.inject(Injector), () => FeatureXStore)` or instantiate via exported factory if provided.
- For async rxMethod flows, flush microtasks (`await vi.runAllTimersAsync()` if timers used) or rely on returned observable completion when you subscribe inside the test harness.
- Snapshot only primitive slices (avoid full object snapshots with volatile ordering).
Migration Tips:
- Converting legacy NgRx reducers: Start by lifting static initial state + selectors into `withState` + `withComputed`; replace effects with `rxMethod` maintaining cancellation semantics (`switchMap` mirrors effect flattening strategy).
- Keep action names only if externally observed (analytics, logging). Otherwise remove ceremony—call store methods directly.
Anti-Patterns to Avoid:
- Writing to signals inside a computed or inside another signal setter (causes cascading updates).
- Storing large unnormalized arrays and then repeatedly filtering/sorting in multiple components—centralize that in computed selectors.
- Persisting secrets or PII directly; hash keys already user-scoped but content still plain—sanitize if needed.
- Returning raw subscriptions from store methods; expose signals or idempotent methods only.
#### 7.b Prefer Signals over Observables (Practical Rules)
Default to signals for all in-memory UI & derived state; keep Observables only at I/O edges.
Use Observables for:
- HTTP / WebSocket / SignalR streams at the boundary.
- Timer / interval / external event sources.
- Interop with legacy NgRx store pieces not yet migrated.
Immediately convert inbound Observables to signals:
```ts
// Legacy service returning Observable<Item[]>
items$ = http.get<Item[]>(url);
// New pattern
const items = toSignal(http.get<Item[]>(url), { initialValue: [] });
```
Expose signals from stores & services:
```ts
// BAD (forces template async pipe + subscription mgmt)
getItems(): Observable<Item[]> { return this.http.get(...); }
// GOOD
items = toSignal(this.http.get<Item[]>(url), { initialValue: [] });
```
Bridge when needed:
```ts
// Signal -> Observable (rare):
const queryChanges$ = fromSignal(query, { requireSync: true });
// Observable -> Signal (preferred):
const data = toSignal(data$, { initialValue: undefined });
```
Side-effects: never subscribe manually—wrap in `rxMethod` (cancels stale work via `switchMap`).
```ts
loadData: rxMethod<void>(
pipe(
switchMap(() =>
this.api.fetch().pipe(tap((r) => patchState(store, { data: r }))),
),
),
);
```
Template usage: reference signals directly (`{{ item.name }}`) or in control flow; no `| async` needed.
Replacing combineLatest / map chains:
```ts
// Before (Observable)
vm$ = combineLatest([a$, b$]).pipe(map(([a, b]) => buildVm(a, b)));
// After (Signals)
const vm = computed(() => buildVm(a(), b()));
```
Debounce / throttle user input:
Keep raw form value as a signal; create an rxMethod for debounced fetch instead of debouncing inside a computed.
```ts
search = signal('');
runSearch: rxMethod<string>(
pipe(
debounceTime(300),
switchMap((term) =>
this.api
.search(term)
.pipe(tap((results) => patchState(store, { results }))),
),
),
);
effect(() => {
runSearch(this.search());
});
```
Avoid converting a signal back to an Observable just to use a single RxJS operator; prefer inline signal `computed` or small helper.
Migration heuristic:
1. Identify component `foo$` fields used only in template -> convert to signal via `toSignal`.
2. Collapse chains of `combineLatest` + `map` into `computed`.
3. Replace imperative `subscribe` side-effects with `rxMethod` + `patchState`.
4. Add persistence last via `withStorage` if state must survive reload.
Performance tip: heavy derived computations (sorting large arrays) belong in a memoized `computed`; if expensive & infrequently needed, gate behind another signal flag.
### 8. Scanner Integration (Scandit)
- Barcode scanning encapsulated in `@isa/shared/scanner` (`scanner.service.ts`). Use provided injection tokens for license & defaults (override via DI if needed). Service auto-configures once; `ready` signal triggers `configure()` lazily.
- Always catch and log errors with proper context; platform gating throws `PlatformNotSupportedError` which is downgraded to warn.
### 9. Styling
- Tailwind with custom semantic tokens (`tailwind.config.js`). Prefer design tokens like `text-isa-neutral-700`, spacing utilities with custom `px-*` scales rather than adhoc raw values.
- Global overlays rely on CDK classes; retain `@angular/cdk/overlay-prebuilt.css` in style arrays when creating new entrypoints or Storybook stories.
### 10. Library Conventions
- File naming: kebab-case; feature first then type (e.g. `return-receipt-list.component.ts`).
- Provide public API via each lib `src/index.ts`. Export only stable symbols; keep internal utilities in subfolders not re-exported.
- Add `project.json` with `test` & `lint` targets; for new Vitest libs include `vite.config.mts` and adjust `tsconfig.spec.json` references to vitest types.
### 11. Adding / Modifying Tests
- For Jest libs: standard `*.spec.ts` with `TestBed`. Spectator may appear in legacy code—do not introduce Spectator in new tests; use Angular Testing Utilities.
- For Vitest libs: ensure `vite.config.mts` includes `setupFiles`. Use `describe/it` from `vitest` and Angular TestBed (see remission resource spec for pattern of using `runInInjectionContext`).
- Prefer resource-style factories returning signals for async state (pattern in `createSupplierResource`).
### 12. Performance & Safety
- Logging: rely on lazy context function; avoid `JSON.stringify()` unless behind a dev guard.
- Storage: hashing keys (see `hash.utils.ts`) ensures stable key space; do not bypass if you need consistent per-user scoping.
- Scanner overlay: always clean up overlay + event listeners (follow existing `open` implementation for pattern).
### 13. CI / Coverage / Artifacts
- JUnit XML placed in `testresults/` (Jest configured with `jest-junit`). Keep filename stability for pipeline consumption; do not rename those outputs.
- Coverage output under `coverage/libs/...`; respect Nx caching—avoid side effects outside project roots.
### 14. When Unsure
- Search existing domain folder for analogous implementation (e.g. new feature under remission: inspect sibling feature libs for structure).
- Preserve existing DI token patterns instead of introducing new global singletons.
### 15. Quick Examples
```ts
// New feature logger usage
const log = logger(() => ({ feature: 'ReturnReceipt', action: 'init' }));
log.info('Mount');
// Persisting a signal store slice
export const FeatureStore = signalStore(
withState(initState),
withStorage('return:filters', LocalStorageProvider),
);
// Fetch config value safely
const apiBase = inject(Config).get('api.baseUrl', z.string().url());
```
---
Let me know if any area (e.g. auth flow, NgRx usage, Swagger generation details) needs deeper coverage and I can extend this file.

189
.github/prompts/plan.prompt.md vendored Normal file
View File

@@ -0,0 +1,189 @@
---
mode: agent
tools: ['edit', 'search', 'usages', 'vscodeAPI', 'problems', 'changes', 'fetch', 'githubRepo', 'Nx Mcp Server', 'context7']
description: Plan Mode - Research and create a detailed implementation plan before making any changes.
model: Gemini 2.5 Pro (copilot)
---
# Plan Mode
You are now operating in **Plan Mode** - a research and planning phase that ensures thorough analysis before implementation. Plan mode is **ALWAYS ACTIVE** when using this prompt. You must follow these strict guidelines for every request:
## Phase 1: Research & Analysis (MANDATORY)
### ALLOWED Operations:
- ✅ Read files using Read, Glob, Grep tools
- ✅ Search documentation and codebases
- ✅ Analyze existing patterns and structures
- ✅ Use WebFetch for documentation research
- ✅ List and explore project structure
- ✅ Use Nx/Angular/Context7 MCP tools for workspace analysis
- ✅ Review dependencies and configurations
### FORBIDDEN Operations:
-**NEVER** create, edit, or modify any files
-**NEVER** run commands that change system state
-**NEVER** make commits or push changes
-**NEVER** install packages or modify configurations
-**NEVER** run build/test commands during planning
## Phase 2: Plan Presentation (REQUIRED FORMAT)
After thorough research, present your plan using this exact structure:
```markdown
## 📋 Implementation Plan
### 🎯 Objective
[Clear statement of what will be accomplished]
### 🔍 Research Summary
- **Current State**: [What exists now]
- **Requirements**: [What needs to be built/changed]
- **Constraints**: [Limitations and considerations]
### 📁 Files to be Modified/Created
1. **File**: `path/to/file.ts`
- **Action**: Create/Modify/Delete
- **Purpose**: [Why this file needs changes]
- **Key Changes**: [Specific modifications planned]
2. **File**: `path/to/another-file.ts`
- **Action**: Create/Modify/Delete
- **Purpose**: [Why this file needs changes]
- **Key Changes**: [Specific modifications planned]
### 🏗️ Implementation Steps
1. **Step 1**: [Detailed description]
- Files affected: `file1.ts`, `file2.ts`
- Rationale: [Why this step is necessary]
2. **Step 2**: [Detailed description]
- Files affected: `file3.ts`
- Rationale: [Why this step is necessary]
3. **Step N**: [Continue numbering...]
### ⚠️ Risks & Considerations
- **Risk 1**: [Potential issue and mitigation]
- **Risk 2**: [Potential issue and mitigation]
### 🧪 Testing Strategy
- [How the changes will be tested]
- [Specific test files or approaches]
### 📚 Architecture Decisions
- **Pattern Used**: [Which architectural pattern will be followed]
- **Libraries/Dependencies**: [What will be used and why]
- **Integration Points**: [How this fits with existing code]
### ✅ Success Criteria
- [ ] Criterion 1
- [ ] Criterion 2
- [ ] All tests pass
- [ ] No lint errors
```
## Phase 3: Await Approval
After presenting the plan:
1. **STOP** all implementation activities
2. **WAIT** for explicit user approval
3. **DO NOT** proceed with any file changes
4. **RESPOND** to questions or plan modifications
5. **EXIT PLAN MODE** only when user explicitly says "execute", "implement", "go ahead", "approved", or similar approval language
## Phase 4: Implementation (After Exiting Plan Mode)
Once the user explicitly approves and you exit plan mode:
1. **PLAN MODE IS NOW DISABLED** - you can proceed with normal implementation
2. Use TodoWrite to create implementation todos
3. Follow the plan step-by-step
4. Update todos as you progress
5. Run tests and lint checks as specified
6. Provide progress updates
## Key Behavioral Rules
### Research Thoroughly
- Spend significant time understanding the codebase
- Look for existing patterns to follow
- Identify all dependencies and integration points
- Consider edge cases and error scenarios
### Be Comprehensive
- Plans should be detailed enough for another developer to implement
- Include all necessary file changes
- Consider testing, documentation, and deployment
- Address potential conflicts or breaking changes
### Show Your Work
- Explain reasoning behind architectural decisions
- Reference existing code patterns when applicable
- Cite documentation or best practices
- Provide alternatives when multiple approaches exist
### Safety First
- Never make changes during planning phase
- Always wait for explicit approval
- Flag potentially risky changes
- Suggest incremental implementation when complex
## Example Interactions
### Good Plan Mode Behavior:
```
User: "Add a dark mode toggle to the settings page"
Assistant: I'll research the current theming system and create a comprehensive plan for implementing dark mode.
[Extensive research using Read, Grep, Glob tools]
## 📋 Implementation Plan
[Follows complete format above]
Ready to proceed? Please approve this plan before I begin implementation.
```
### What NOT to do:
```
User: "Add a dark mode toggle"
Assistant: I'll add that right away!
[Immediately starts editing files - WRONG!]
```
# <<<<<<< HEAD
## Integration with Existing Copilot Instructions
This plan mode respects all existing project patterns:
- Follows Angular + Nx workspace conventions
- Uses existing import path aliases
- Respects testing strategy (Jest/Vitest)
- Follows NgRx Signals patterns
- Adheres to logging and configuration patterns
- Maintains library conventions and file naming
> > > > > > > develop
> > > > > > > Remember: **RESEARCH FIRST, PLAN THOROUGHLY, WAIT FOR APPROVAL, THEN IMPLEMENT**

182
.github/review-instructions.md vendored Normal file
View File

@@ -0,0 +1,182 @@
# Code Review Instructions
## Summary
When conducting a code review, follow these steps to ensure a thorough and constructive process.
**Ensure that all review guidelines are followed. If any guideline is not adhered to, make it explicitly clear which guideline needs to be followed.**
## Review Process
1. 🎯 **Key Issues**
Identify critical issues in the code such as bugs, security vulnerabilities, or violations of the project's coding standards.
_Include specific links to files and line numbers (e.g., file.js#L10) where applicable._
2. 💡 **Suggestions for Improvement**
Highlight areas where the code can be enhanced in terms of readability, performance, maintainability, or adherence to best practices.
_Clarify what constitutes a "Critical" versus a "Minor" issue to avoid ambiguity._
3.**Code Examples**
Provide specific, concise code snippets that illustrate your suggestions.
_Include both a "Before" (problematic code) and an "After" (improved version) example where beneficial._
4. 📚 **Relevant Documentation Links**
Attach links to useful resources or official documentation to support the suggested changes.
_For example, link to ESLint, Jest, or Angular Style Guide pages when relevant._
## Tone and Feedback
- Be constructive and supportive.
Frame suggestions as opportunities for growth rather than criticism.
- Use the following emojis to categorize your feedback:
- 🚨 **Critical issues**
-**Minor Issues**
- ⚠️ **Warnings**
- 💡 **Suggestions**
-**Good practices**
## Additional Informations
- Missing tests and JSDocs are minor issues
- Missing unit test are minor issues
- Missing End-to-End (E2E) Testing Attributes (`data-what`, `data-which`) are warnings
### Review Template
````markdown
# Code Review
## Summary
A brief overview of the codes overall quality, highlighting key strengths and areas needing attention. This sets the stage for the detailed feedback below.
---
## 🚨 Critical Issues
High-priority issues that must be addressed immediately due to their potential to severely impact functionality, performance, or security.
### 1. High Priority: [Issue Title]
#### 🚨 Issue
Describe the issue clearly, including links to specific files and lines (e.g., file.js#L10). Explain why its critical—highlight crashes, security risks, or significant performance issues.
#### 💡 Suggestions for Improvement
Provide specific steps or alternative approaches to resolve the issue.
#### ✨ Code Example
**Current**: [file](file.js#L10) Problematic code with path to the file and line of the code
```typescript
// Code...
```
**Improvement**: Improved version
```typescript
// Code...
```
#### 📚 Relevant Documentation
Include URLs for further research (e.g., [Jest Documentation](https://jestjs.io/docs/getting-started)).
---
## ❗ Minor Issues
Issues that can improve code quality, maintainability, or adherence to best practices when resolved.
### 1. Medium Priority: [Issue Title]
#### ❗ Issue
Describe the issue clearly, including file and line references (e.g., file.js#L10). Explain the impact on the project.
#### 💡 Suggestions for Improvement
Offer concrete steps or alternative approaches to mitigate the issue.
#### ✨ Code Example
**Current**: [file](file.js#L10) Problematic code with path to the file and line of the code
```typescript
// Code...
```
**Improvement**: Improved version
```typescript
// Code...
```
#### 📚 Relevant Documentation
Provide links to further resources.
---
## ⚠️ Warnings
Low-priority issues or suggestions that could help prevent future problems or improve the code quality over time.
### 1. Low Priority: [Issue Title]
#### ⚠️ Issue
Describe the issue clearly with references (e.g., file.js#L10). Explain the potential impact if left unaddressed.
#### 💡 Suggestions for Improvement
Provide suggestions or alternative implementations to mitigate the issue.
#### ✨ Code Example
**Current**: [file](file.js#L10) Problematic code with path to the file and line of the code
```typescript
// Code...
```
**Improvement**: Improved version
```typescript
// Code...
```
#### 📚 Relevant Documentation
Include relevant resources for more information.
---
## 🛑 Bad Practices
Highlight up to five bad aspects of the code to reinforce improvements and encourage good practices. Use different funny emoji at the beginning of each bad practice.
- Emoji **Bad Practice 1**:
Describe a specific weakness (e.g., clear code structure) with an example reference (e.g., file.js#L20). Explain why its bad.
- Emoji **Bad Practice 2**:
Outline another negative feature (e.g., effective error handling) with a snippet reference.
---
## ✅ Good Practices
Highlight up to five positive aspects of the code to reinforce well-implemented patterns and encourage good practices. Use different funny emoji at the beginning of each good practice.
- Emoji **Good Practice 1**:
Describe a specific strength (e.g., clear code structure) with an example reference (e.g., file.js#L20). Explain why its commendable.
- Emoji **Good Practice 2**:
Outline another positive feature (e.g., effective error handling) with a snippet reference.
---
## 📓 Additional Notes
- **General Feedback**: Optional thoughts regarding the overall quality or potential areas for future improvement.
- **Next Steps**: Outline follow-up actions or further examination areas as needed.
````

73
.github/testing-instructions.md vendored Normal file
View File

@@ -0,0 +1,73 @@
# Testing Instructions
## Framework and Tools
- **Vitest** is the recommended testing framework.
[Vitest Documentation (latest)](https://context7.com/vitest-dev/vitest/llms.txt?topic=getting+started)
- **Jest** and **Spectator** are **deprecated**.
Do not use them for new tests. Existing tests should be migrated to Vitest where possible.
## Guidelines
1. **Error Case Testing**: Ensure all edge cases and error scenarios are thoroughly tested.
2. **Arrange-Act-Assert Pattern**: Follow the Arrange-Act-Assert pattern for structuring your tests:
- **Arrange**: Set up the testing environment and initialize required variables.
- **Act**: Execute the functionality being tested.
- **Assert**: Verify the expected outcomes.
## Best Practices
- Write clear and descriptive test names.
- Ensure tests are isolated and do not depend on each other.
- Mock external dependencies to avoid side effects.
- Aim for high code coverage without compromising test quality.
## Example Test Structure
```typescript
// Example using Vitest (Jest and Spectator are deprecated)
import { describe, it, expect, beforeEach } from 'vitest';
import { render } from '@testing-library/angular';
import { MyComponent } from './my-component.component';
describe('MyComponent', () => {
let component: MyComponent;
beforeEach(async () => {
const { fixture } = await render(MyComponent);
component = fixture.componentInstance;
});
it('should display the correct title', async () => {
// Arrange
const expectedTitle = 'Hello World';
// Act
component.title = expectedTitle;
// If using Angular, trigger change detection:
// fixture.detectChanges();
// Assert
const compiled = fixture.nativeElement as HTMLElement;
expect(compiled.querySelector('h1')?.textContent).toBe(expectedTitle);
});
it('should handle error cases gracefully', () => {
// Arrange
const invalidInput = null;
// Act
component.input = invalidInput;
// Assert
expect(() => component.processInput()).toThrowError('Invalid input');
});
});
```
## Additional Resources
- [Vitest Documentation (latest)](https://context7.com/vitest-dev/vitest/llms.txt?topic=getting+started)
- [Vitest Official Guide](https://vitest.dev/guide/)
- [Testing Library for Angular](https://testing-library.com/docs/angular-testing-library/intro/)
- **Jest** and **Spectator** documentation are deprecated

132
.gitignore vendored
View File

@@ -1,50 +1,82 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/dist
/tmp
/out-tsc
# dependencies
/node_modules
# profiling files
chrome-profiler-events.json
speed-measure-plugin.json
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
.prettierrc
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# misc
/.angular/cache
/.sass-cache
/connect.lock
/coverage
/testresults
/libpeerconnection.log
npm-debug.log
yarn-error.log
yarn.lock
testem.log
/typings
# System Files
.DS_Store
Thumbs.db
libs/swagger/src/lib/*
# See http://help.github.com/ignore-files/ for more about ignoring files.
.matomo
junit.xml
# compiled output
/dist
/tmp
/out-tsc
/
# dependencies
/node_modules
# profiling files
chrome-profiler-events.json
speed-measure-plugin.json
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# misc
/.angular/cache
/.sass-cache
/connect.lock
/coverage
/testresults
/libpeerconnection.log
npm-debug.log
yarn-error.log
yarn.lock
testem.log
/typings
# System Files
.DS_Store
Thumbs.db
libs/swagger/src/lib/*
*storybook.log
.nx/cache
.nx/workspace-data
.angular
# Claude configuration
.claude/*
!.claude/agents
!.claude/commands
!.claude/skills
storybook-static
.cursor\rules\nx-rules.mdc
.github\instructions\nx.instructions.md
.cursor/rules/nx-rules.mdc
.github/instructions/nx.instructions.md
vite.config.*.timestamp*
vitest.config.*.timestamp*
.mcp.json
.memory.json
nx.instructions.md
CLAUDE.md

1
.husky/pre-commit Normal file
View File

@@ -0,0 +1 @@
npx lint-staged

7
.lintstagedrc.json Normal file
View File

@@ -0,0 +1,7 @@
{
"*.ts": "npx eslint --fix --config eslint.config.js",
"*.tsx": "npx eslint --fix --config eslint.config.js",
"*.js": "npx eslint --fix --config eslint.config.js",
"*.jsx": "npx eslint --fix --config eslint.config.js",
"*.html": "npx eslint --fix --config eslint.config.js"
}

View File

@@ -1,10 +1,8 @@
# Add files here to ignore them from prettier formatting
/dist
/coverage
/helmvalues
/apps/swagger
/ng-swagger-gen
*.json
*.yml
/.nx/cache
/.nx/workspace-data
/node_modules
.angular
.vscode

37
.prettierrc Normal file
View File

@@ -0,0 +1,37 @@
{
"singleQuote": true,
"semi": true,
"trailingComma": "all",
"tabWidth": 2,
"bracketSpacing": true,
"printWidth": 80,
"endOfLine": "auto",
"arrowParens": "always",
"quoteProps": "consistent",
"overrides": [
{
"files": "*.html",
"options": {
"parser": "html"
}
},
{
"files": "*.component.html",
"options": {
"parser": "angular"
}
},
{
"files": "*.scss",
"options": {
"singleQuote": false
}
},
{
"files": "*.json",
"options": {
"printWidth": 80
}
}
]
}

View File

@@ -1,5 +0,0 @@
{
"singleQuote": true,
"printWidth": 140
}

View File

@@ -1,7 +1,11 @@
{
"recommendations": [
"johnpapa.angular2",
"esbenp.prettier-vscode",
"angular.ng-template",
]
}
"recommendations": [
"johnpapa.angular2",
"esbenp.prettier-vscode",
"angular.ng-template",
"nrwl.angular-console",
"dbaeumer.vscode-eslint",
"firsttris.vscode-jest-runner",
"editorconfig.editorconfig"
]
}

112
.vscode/settings.json vendored
View File

@@ -1,15 +1,97 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"editor.formatOnSave": true,
"typescriptHero.imports.insertSemicolons": false,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"css.validate": false,
"less.validate": false,
"scss.validate": false
}
{
"editor.accessibilitySupport": "off",
"typescript.tsdk": "node_modules/typescript/lib",
"exportall.config.exclude": [".test.", ".spec.", ".stories."],
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": [
"json"
],
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.formatOnSave": false
},
"exportall.config.folderListener": [
],
"github.copilot.chat.commitMessageGeneration.instructions": [
{
"file": ".github/commit-instructions.md"
}
],
"github.copilot.chat.codeGeneration.instructions": [
{
"file": ".vscode/llms/angular.txt"
},
{
"file": "docs/tech-stack.md"
},
{
"file": "docs/guidelines/code-style.md"
},
{
"file": "docs/guidelines/project-structure.md"
},
{
"file": "docs/guidelines/state-management.md"
},
{
"file": "docs/guidelines/testing.md"
}
],
"github.copilot.chat.testGeneration.instructions": [
{
"file": ".github/testing-instructions.md"
},
{
"file": "docs/tech-stack.md"
},
{
"file": "docs/guidelines/code-style.md"
},
{
"file": "docs/guidelines/testing.md"
}
],
"github.copilot.chat.reviewSelection.instructions": [
{
"file": ".github/copilot-instructions.md"
},
{
"file": ".github/review-instructions.md"
},
{
"file": "docs/tech-stack.md"
},
{
"file": "docs/guidelines/code-style.md"
},
{
"file": "docs/guidelines/project-structure.md"
},
{
"file": "docs/guidelines/state-management.md"
},
{
"file": "docs/guidelines/testing.md"
}
],
"nxConsole.generateAiAgentRules": true,
"chat.mcp.discovery.enabled": {
"claude-desktop": true,
"windsurf": true,
"cursor-global": true,
"cursor-workspace": true
},
"chat.mcp.access": "all",
"typescript.inlayHints.parameterTypes.enabled": true,
"typescript.inlayHints.variableTypes.enabled": true,
"editor.hover.delay": 100
}

357
CLAUDE.md Normal file
View File

@@ -0,0 +1,357 @@
# CLAUDE.md
> **Last Updated:** 2025-10-22
> **Angular Version:** 20.1.2
> **Nx Version:** 21.3.2
> **Node.js:** ≥22.0.0
> **npm:** ≥10.0.0
## 🔴 CRITICAL: Mandatory Agent Usage
**You MUST use these subagents for ALL research tasks:**
- **`docs-researcher`**: For ALL documentation (packages, libraries, READMEs)
- **`docs-researcher-advanced`**: Auto-escalate when docs-researcher fails
- **`Explore`**: For ALL code pattern searches and multi-file analysis
- **Direct tools (Read/Bash)**: ONLY for single specific files or commands
**Violations of this rule degrade performance and context quality. NO EXCEPTIONS.**
## Project Overview
This is a sophisticated Angular 20.1.2 monorepo managed by Nx 21.3.2. The main application is `isa-app`, a comprehensive inventory and returns management system for retail/e-commerce operations. The system handles complex workflows including order management (OMS), returns processing (remission), customer relationship management (CRM), product cataloging, and checkout/reward systems.
## Architecture
### Monorepo Structure
- **apps/isa-app**: Main Angular application
- **libs/**: Reusable libraries organized by domain and type
- **core/**: Core utilities (config, logging, storage, tabs, navigation)
- **common/**: Shared utilities (data-access, decorators, print)
- **ui/**: UI component libraries (buttons, dialogs, inputs, etc.)
- **shared/**: Shared domain components (filter, scanner, product components)
- **oms/**: Order Management System features and utilities
- **remission/**: Remission/returns management features
- **catalogue/**: Product catalogue functionality
- **utils/**: General utilities (validation, scroll position, parsing)
- **icons/**: Icon library
- **generated/swagger/**: Auto-generated API client code from OpenAPI specs
### Key Architectural Patterns
- **Domain-Driven Design**: Clear domain boundaries with dedicated modules (OMS, remission, CRM, catalogue, checkout)
- **Layered Architecture**: Strict dependency hierarchy (Feature → Shared/UI → Data Access → Infrastructure)
- **Standalone Components**: All new components use Angular standalone architecture with explicit imports
- **Feature Libraries**: Domain features organized as separate libraries (e.g., `oms-feature-return-search`, `remission-feature-remission-list`)
- **Data Access Layer**: Separate data-access libraries for each domain with NgRx Signals stores
- **Shared UI Components**: 17 dedicated UI component libraries with design system integration
- **Generated API Clients**: 10 auto-generated Swagger/OpenAPI clients with post-processing pipeline
- **Path Aliases**: Comprehensive TypeScript path mapping (`@isa/domain/layer/feature`)
- **Component Prefixes**: Domain-specific prefixes (OMS: `oms-feature-*`, Remission: `remi-*`, UI: `ui-*`)
- **Modern State Management**: NgRx Signals with entities, session persistence, and reactive patterns
## Common Development Commands
### Essential Commands (Project-Specific)
```bash
# Start development server with SSL (required for authentication flows)
npm start
# Run tests for all libraries (excludes main app)
npm test
# Build for development
npm run build
# Build for production
npm run build-prod
# Regenerate all API clients from Swagger/OpenAPI specs
npm run generate:swagger
# Regenerate library reference documentation
npm run docs:generate
# Format code with Prettier
npm run prettier
# Format only staged files (pre-commit hook)
npm run pretty-quick
# Run CI tests with coverage
npm run ci
```
### Standard Nx Commands
For complete command reference, see [Nx Documentation](https://nx.dev/reference/commands).
**Common patterns:**
```bash
# Test specific library (always use --skip-nx-cache)
npx nx test <project-name> --skip-nx-cache
# Lint a project
npx nx lint <project-name>
# Show project dependencies
npx nx graph
# Run tests for affected projects (CI/CD)
npx nx affected:test --skip-nx-cache
```
**Important:** Always use `--skip-nx-cache` flag when running tests to ensure fresh results.
## Testing Framework
> **Last Reviewed:** 2025-10-22
> **Status:** Migration in Progress (Jest → Vitest)
### Current Setup (Migration in Progress)
- **Jest**: 40 libraries (65.6% - legacy/existing code)
- **Vitest**: 21 libraries (34.4% - new standard)
- All formal libraries now have test executors configured
### Testing Strategy
- **New libraries**: Use Vitest + Angular Testing Utilities (TestBed, ComponentFixture)
- **Legacy libraries**: Continue with Jest + Spectator until migrated
- **Advanced mocking**: Use ng-mocks for complex scenarios
### Key Requirements
- Test files must end with `.spec.ts`
- Use AAA pattern (Arrange-Act-Assert)
- **Always include E2E attributes**: `data-what`, `data-which`, and dynamic `data-*` in HTML templates
- Mock external dependencies appropriately for your framework
**For detailed testing guidelines, framework comparison, and migration instructions, see [`docs/guidelines/testing.md`](docs/guidelines/testing.md).**
**References:**
- [Jest Documentation](https://jestjs.io/)
- [Vitest Documentation](https://vitest.dev/)
- [Angular Testing Guide](https://angular.io/guide/testing)
- [Spectator](https://ngneat.github.io/spectator/)
## State Management
- **NgRx Signals**: Primary state management with modern functional approach using `signalStore()`
- **Entity Management**: Uses `withEntities()` for normalized data storage
- **Session Persistence**: State persistence with `withStorage()` using SessionStorageProvider
- **Reactive Methods**: `rxMethod()` with `takeUntilKeydownEscape()` for user-cancellable operations
- **Custom RxJS Operators**: Specialized operators like `takeUntilAborted()`, `takeUntilKeydown()`
- **Error Handling**: `tapResponse()` for handling success/error states in stores
- **Lifecycle Hooks**: `withHooks()` for cleanup and initialization (e.g., orphaned entity cleanup)
- **Navigation State**: Use `@isa/core/navigation` for temporary navigation context (return URLs, wizard state) instead of query parameters
## Styling and Design System
- **Framework**: [Tailwind CSS](https://tailwindcss.com/docs) with extensive ISA-specific customization
- **Custom Breakpoints**: `isa-desktop` (1024px), `isa-desktop-l` (1440px), `isa-desktop-xl` (1920px)
- **Brand Color System**: `isa-*` color palette with semantic naming
- **Custom Tailwind Plugins** (7): button, typography, menu, label, input, section, select-bullet
- **Typography System**: 14 custom utilities (`.isa-text-heading-1-bold`, `.isa-text-body-2-regular`, etc.)
- **UI Component Libraries**: 17 specialized libraries with consistent APIs (see Library Reference)
- **Storybook**: Component documentation and development at `npm run storybook`
### Responsive Design with Breakpoint Service
Use `@isa/ui/layout` for reactive breakpoint detection instead of CSS-only solutions:
```typescript
import { breakpoint, Breakpoint } from '@isa/ui/layout';
// Detect screen size reactively
isDesktop = breakpoint([Breakpoint.Desktop, Breakpoint.DekstopL, Breakpoint.DekstopXL]);
```
**Available Breakpoints:**
- `Tablet`: max-width: 1279px (mobile/tablet)
- `Desktop`: 1280px - 1439px (standard desktop)
- `DekstopL`: 1440px - 1919px (large desktop)
- `DekstopXL`: 1920px+ (extra large)
**Template Usage:**
```html
@if (isDesktop) {
<!-- Desktop-specific content -->
}
```
**Why:** Prefer breakpoint service over CSS-only (hidden/flex) for SSR and maintainability.
## API Integration and Data Access
**Generated Swagger Clients:** 10 auto-generated TypeScript clients in `generated/swagger/`
- Available APIs: availability-api, cat-search-api, checkout-api, crm-api, eis-api, inventory-api, isa-api, oms-api, print-api, wws-api
- Tool: [ng-swagger-gen](https://www.npmjs.com/package/ng-swagger-gen) with custom per-API configuration
- Post-processing: Automatic Unicode cleanup via `tools/fix-files.js`
- Regenerate: `npm run generate:swagger`
**Architecture Pattern:**
- Business logic services wrap generated API clients
- Type safety: TypeScript + [Zod](https://zod.dev/) schema validation
- Error handling: Global HTTP interceptor with automatic re-authentication
- Modern injection: Uses `inject()` function with private field pattern
- Request cancellation: Built-in via AbortSignal and custom RxJS operators (`takeUntilAborted()`, `takeUntilKeydown()`)
**Data Access Libraries:** See Library Reference section for domain-specific implementations (`@isa/[domain]/data-access`).
## Build Configuration
- **Framework**: Angular with TypeScript (see `package.json` for current versions)
- **Requirements**:
- Node.js >= 22.0.0 (specified in package.json engines)
- npm >= 10.0.0 (specified in package.json engines)
- **Build System**: Nx monorepo with Vite for testing (Vitest)
- **Development Server**: Serves with SSL by default (required for authentication flows)
## Important Conventions and Patterns
### Library Organization
- **Naming Pattern**: `[domain]-[layer]-[feature]` (e.g., `oms-feature-return-search`, `ui-buttons`)
- **Path Aliases**: `@isa/[domain]/[layer]/[feature]` (e.g., `@isa/oms/data-access`, `@isa/ui/buttons`)
- **Project Names**: Found in each library's `project.json` file, following consistent naming
### Component Architecture
- **Standalone Components**: All new components must be standalone with explicit imports
- **Component Prefixes**: Domain-specific prefixes for clear identification
- OMS features: `oms-feature-*` (e.g., `oms-feature-return-search-main`)
- Remission features: `remi-*`
- UI components: `ui-*`
- Core utilities: `core-*`
- **Signal-based Inputs**: Use Angular signals (`input()`, `computed()`) for reactive properties
- **Host Binding**: Dynamic CSS classes via Angular host properties
### Dependency Rules
- **Unidirectional Dependencies**: Feature → Shared/UI → Data Access → Infrastructure
- **Import Boundaries**: Use path aliases, avoid relative imports across domain boundaries
- **Generated API Imports**: Import from `@generated/swagger/[api-name]` for API clients
### Code Quality
- **Modern Angular Patterns**: Prefer `inject()` over constructor injection
- **Type Safety**: Use Zod schemas for runtime validation alongside TypeScript
- **Error Handling**: Custom error classes with specific error codes
- **E2E Testing**: Always include `data-what` and `data-which` attributes in templates
## Development Workflow and Best Practices
### Project Conventions
- **Default Branch**: `develop` (not main) - Always create PRs against develop
- **Commit Style**: [Conventional commits](https://www.conventionalcommits.org/) without co-author tags
- **Nx Cache**: Always use `--skip-nx-cache` for tests to ensure fresh results
- **Testing**: New libraries use Vitest + Angular Testing Utilities; legacy use Jest + Spectator
- **E2E Attributes**: Always include `data-what`, `data-which`, and dynamic `data-*` in templates
- **Design System**: Use ISA-specific Tailwind utilities (`isa-accent-*`, `isa-text-*`)
### Code Quality Tools
- **Linting**: [ESLint](https://eslint.org/) with Nx dependency checks
- **Formatting**: [Prettier](https://prettier.io/) with Husky + lint-staged pre-commit hooks
- **Type Safety**: [TypeScript](https://www.typescriptlang.org/) strict mode + [Zod](https://zod.dev/) validation
- **Bundle Size**: Monitor carefully (2MB warning, 5MB error for main bundle)
### Nx Workflow Tips
- Use `npx nx graph` to visualize dependencies
- Use `npx nx affected:test` for CI/CD optimization
- Reference: [Nx Documentation](https://nx.dev/getting-started/intro)
## Development Notes and Guidelines
### Getting Started
- **Application Startup**: Only `isa-app` can be started - it's the main application entry point
- **SSL Development**: The development server runs with SSL by default (`npm start`), which is crucial for production-like authentication flows
- **Node Requirements**: Ensure Node.js ≥22.0.0 and npm ≥10.0.0 before starting development
- **First-Time Setup**: After cloning, run `npm install` then `npm start` to verify everything works
### Essential Documentation References
- **Testing Guidelines**: Review `docs/guidelines/testing.md` before writing any tests - it covers the Jest→Vitest migration, Spectator→Angular Testing Utilities transition, and E2E attribute requirements
- **Code Review Standards**: Follow the structured review process in `.github/review-instructions.md` with categorized feedback (🚨 Critical, ❗ Minor, ⚠️ Warnings, ✅ Good Practices)
- **E2E Testing Requirements**: Always include `data-what`, `data-which`, and dynamic `data-*` attributes in HTML templates - these are essential for automated testing by QA colleagues
### Researching and Investigating the Codebase
**🔴 MANDATORY: You MUST use subagents for research. Direct file reading/searching is FORBIDDEN except for single specific files.**
#### Required Agent Usage
| Task Type | Required Agent | Escalation Path |
|-----------|---------------|-----------------|
| **Package/Library Documentation** | `docs-researcher` | → `docs-researcher-advanced` if not found |
| **Internal Library READMEs** | `docs-researcher` | Keep context clean |
| **Code Pattern Search** | `Explore` | Set thoroughness level |
| **Implementation Analysis** | `Explore` | Multiple file analysis |
| **Single Specific File** | Read tool directly | No agent needed |
#### Documentation Research System (Two-Tier)
1. **ALWAYS start with `docs-researcher`** (Haiku, 30-120s) for any documentation need
2. **Auto-escalate to `docs-researcher-advanced`** (Sonnet, 2-7min) when:
- Documentation not found
- Conflicting sources
- Need code inference
- Complex architectural questions
#### Enforcement Examples
```
❌ WRONG: Read libs/ui/buttons/README.md
✅ RIGHT: Task → docs-researcher → "Find documentation for @isa/ui/buttons"
❌ WRONG: Grep for "signalStore" patterns
✅ RIGHT: Task → Explore → "Find all signalStore implementations"
❌ WRONG: WebSearch for Zod documentation
✅ RIGHT: Task → docs-researcher → "Find Zod validation documentation"
```
**Remember: Using subagents is NOT optional - it's mandatory for maintaining context efficiency and search quality.**
#### Common Research Patterns
| Information Need | Required Approach |
|-----------------|-------------------|
| **Library documentation** | `docs-researcher` → Check library-reference.md → Escalate if needed |
| **Code patterns/examples** | `Explore` with "medium" or "very thorough" |
| **Architecture understanding** | `npx nx graph` + `Explore` for implementation |
| **Debugging/errors** | Direct tool use (Read specific error file, check console) |
#### Debugging Tips
- **TypeScript errors**: Follow error path to exact file:line
- **Test failures**: Use `--skip-nx-cache` for fresh output
- **Module resolution**: Check `tsconfig.base.json` path aliases
- **State issues**: Use Angular DevTools browser extension
### Library Development Patterns
- **Library Documentation**: Use `docs-researcher` for ALL library READMEs (mandatory for context management)
- **New Library Creation**: Use Nx generators with domain-specific naming (`[domain]-[layer]-[feature]`)
- **Standalone Components**: All new components must be standalone with explicit imports - no NgModules
- **Testing Framework**: New = Vitest + Angular Testing Utilities, Legacy = Jest + Spectator
- **Path Aliases**: Always use `@isa/[domain]/[layer]/[feature]` - avoid relative imports
#### Library Reference Guide
The monorepo contains **62 libraries** organized across 12 domains. For quick lookup, see **[`docs/library-reference.md`](docs/library-reference.md)**.
**Quick Overview by Domain:**
- Availability (1) | Catalogue (1) | Checkout (6) | Common (3) | Core (5) | CRM (1) | Icons (1)
- OMS (9) | Remission (8) | Shared Components (7) | UI Components (17) | Utilities (3)
### API Integration Workflow
- **Swagger Generation**: Run `npm run generate:swagger` to regenerate all 10 API clients when backend changes
- **Data Services**: Wrap generated API clients in domain-specific data-access services with proper error handling and Zod validation
- **State Management**: Use NgRx Signals with `signalStore()`, entity management, and session persistence for complex state
### Performance and Quality Considerations
- **Bundle Monitoring**: Watch bundle sizes (2MB warning, 5MB error for main bundle)
- **Testing Cache**: Always use `--skip-nx-cache` flag when running tests to ensure reliable results
- **Code Quality**: Pre-commit hooks enforce Prettier formatting and ESLint rules automatically
- **Memory Management**: Clean up subscriptions and use OnPush change detection for optimal performance
### Common Troubleshooting
- **Build Issues**: Check Node version and run `npm install` if encountering module resolution errors
- **Test Failures**: Use `--skip-nx-cache` flag and ensure test isolation (no shared state between tests)
- **Nx Cache Issues**: If you see `existing outputs match the cache, left as is` during build or testing:
- **Option 1**: Run `npx nx reset` to clear the Nx cache completely
- **Option 2**: Use `--skip-nx-cache` flag to bypass Nx cache for a specific command (e.g., `npx nx test <project> --skip-nx-cache`)
- **When to use**: Always use `--skip-nx-cache` when you need guaranteed fresh builds or test results
- **SSL Certificates**: Development server uses SSL - accept certificate warnings in browser for localhost
- **Import Errors**: Verify path aliases in `tsconfig.base.json` and use absolute imports for cross-library dependencies
### Domain-Specific Conventions
- **Component Prefixes**: Use `oms-feature-*` for OMS, `remi-*` for remission, `ui-*` for shared components
- **Git Workflow**: Default branch is `develop` (not main), use conventional commits without co-author tags
- **Design System**: Use ISA-specific Tailwind utilities (`isa-accent-*`, `isa-text-*`) and custom breakpoints (`isa-desktop-*`)
- **Logging**: Use centralized logging service (`@isa/core/logging`) with contextual information for debugging
- **Navigation State**: Use `@isa/core/navigation` for passing temporary state between routes (return URLs, form context) instead of query parameters - keeps URLs clean and state reliable

View File

@@ -1,5 +1,5 @@
#stage 1
FROM node:18 as base
FROM node:22 as base
ARG IS_PRODUCTION=false
ARG SEMVERSION=1.0.0
ARG BuildUniqueID
@@ -7,8 +7,9 @@ LABEL build.uniqueid="${BuildUniqueID:-1}"
WORKDIR /app
COPY . .
RUN umask 0022
RUN npm install -g npm@11.6
RUN npm version ${SEMVERSION}
RUN npm install --always-auth=false
RUN npm ci --foreground-scripts
RUN if [ "${IS_PRODUCTION}" = "true" ] ; then npm run-script build-prod ; else npm run-script build ; fi
# stage final
@@ -24,6 +25,6 @@ ARG BuildUniqueID
LABEL build.uniqueid="${BuildUniqueID:-1}"
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -q -O /tmp/chrome.deb && apt update && apt install -y /tmp/chrome.deb
# ignore exitcode, sonst gibts keinen container
RUN npm test || true
RUN npm run ci || true
ENTRYPOINT [ "/bin/sleep", "60000" ]

View File

@@ -1,4 +0,0 @@
- Neue Icon Module (z.B. mit SVG sprites)
- Breadcrumb Navigation (Neu)
- Remissions Produkt Liste (Refactoring / Neu)
- Angular Version (Upgrade)

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +0,0 @@
# Scan
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.0.
## Code scaffolding
Run `ng generate component component-name --project scan` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project scan`.
> Note: Don't forget to add `--project scan` or else it will be added to the default project in your `angular.json` file.
## Build
Run `ng build scan` to build the project. The build artifacts will be stored in the `dist/` directory.
## Publishing
After building your library with `ng build scan`, go to the dist folder `cd dist/scan` and run `npm publish`.
## Running unit tests
Run `ng test scan` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/adapter/scan",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,11 +0,0 @@
{
"name": "@adapter/scan",
"version": "0.0.1",
"peerDependencies": {
"@angular/common": "^12.2.0",
"@angular/core": "^12.2.0"
},
"dependencies": {
"tslib": "^2.3.0"
}
}

View File

@@ -1,44 +0,0 @@
import { Injectable, isDevMode } from '@angular/core';
import { EnvironmentService } from '@core/environment';
import { PromptModalData, UiModalService, UiPromptModalComponent } from '@ui/modal';
import { Observable } from 'rxjs';
import { ScanAdapter } from './scan-adapter';
@Injectable()
export class DevScanAdapter implements ScanAdapter {
readonly name = 'Dev';
constructor(private _modal: UiModalService, private _environmentService: EnvironmentService) {}
async init(): Promise<boolean> {
return Promise.resolve(false);
// return new Promise((resolve, reject) => {
// resolve(isDevMode());
// });
}
scan(): Observable<string> {
return new Observable((observer) => {
const modalRef = this._modal.open({
content: UiPromptModalComponent,
title: 'Scannen',
data: {
message: 'Diese Eingabemaske dient nur zu Entwicklungs und Testzwecken.',
placeholder: 'Scan Code',
confirmText: 'weiter',
cancelText: 'abbrechen',
} as PromptModalData,
});
const sub = modalRef.afterClosed$.subscribe((result) => {
observer.next(result.data);
observer.complete();
});
return () => {
modalRef.close();
sub.unsubscribe();
};
});
}
}

View File

@@ -1,20 +0,0 @@
:host {
@apply block relative;
}
.scanner-container {
width: 100vw;
max-width: 95vw;
max-height: calc(95vh - 120px);
}
.close-scanner {
@apply block px-6 py-4 bg-white text-brand border-2 border-solid border-brand rounded-full text-lg font-bold mx-auto mt-4;
}
@screen desktop {
.scanner-container {
max-width: 900px;
max-height: 900px;
}
}

View File

@@ -1,4 +0,0 @@
<div class="scanner-container" #scanContainer></div>
<button class="close-scanner" type="button" (click)="close()">
Scan abbrechen
</button>

View File

@@ -1,100 +0,0 @@
import { Component, ChangeDetectionStrategy, ElementRef, ViewChild, NgZone, AfterViewInit, OnDestroy } from '@angular/core';
import { UiMessageModalComponent, UiModalService } from '@ui/modal';
import { Barcode, BarcodePicker, ScanResult, ScanSettings } from 'scandit-sdk';
@Component({
selector: 'app-scandit-overlay',
templateUrl: 'scandit-overlay.component.html',
styleUrls: ['scandit-overlay.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ScanditOverlayComponent implements AfterViewInit, OnDestroy {
private _barcodePicker: BarcodePicker;
private _onScan?: (code: string) => void;
private _onClose?: () => void;
@ViewChild('scanContainer', { read: ElementRef, static: true }) scanContainer: ElementRef;
constructor(private _zone: NgZone, private _modal: UiModalService) {}
ngAfterViewInit(): void {
this.createBarcodePicker()
.then(() => {
this._barcodePicker.on('scan', (scanResult) => {
this._zone.run(() => this.handleScanrResult(scanResult));
});
})
.catch((err: Error) => {
this._modal
.open({
content: UiMessageModalComponent,
title: 'Zugriff auf Kamera verweigert',
data: { message: 'Falls Sie den Zugriff erlauben möchten, können Sie das über die Webseiteinstellung Ihres Browsers.' },
})
.afterClosed$.subscribe(() => {
this._onClose?.();
});
});
}
async createBarcodePicker() {
this._barcodePicker = await BarcodePicker.create(this.scanContainer.nativeElement, {
playSoundOnScan: true,
vibrateOnScan: true,
});
this._barcodePicker.applyScanSettings(this.getScanSettings());
}
getScanSettings(): ScanSettings {
return new ScanSettings({
blurryRecognition: false,
enabledSymbologies: [
Barcode.Symbology.EAN8,
Barcode.Symbology.EAN13,
Barcode.Symbology.UPCA,
Barcode.Symbology.UPCE,
Barcode.Symbology.CODE128,
Barcode.Symbology.CODE39,
Barcode.Symbology.CODE93,
Barcode.Symbology.INTERLEAVED_2_OF_5,
Barcode.Symbology.QR,
],
codeDuplicateFilter: 1000,
});
}
onScan(fn: (code: string) => void) {
this._onScan = fn;
}
onClose(fn: () => void) {
this._onClose = fn;
}
handleScanrResult(scanRestul: ScanResult) {
let result: string | undefined;
if (scanRestul.barcodes.length) {
result = scanRestul.barcodes[0].data;
} else if (scanRestul.texts.length) {
result = scanRestul.texts[0].value;
}
if (result) {
this._onScan?.(result);
}
}
close() {
this._onClose?.();
}
ngOnDestroy(): void {
this._zone.runOutsideAngular(() => {
this._barcodePicker?.destroy(true);
});
}
}

View File

@@ -1,82 +0,0 @@
import { Injectable } from '@angular/core';
import { Observable, Subscriber } from 'rxjs';
import { ScanAdapter } from '../scan-adapter';
import { Overlay } from '@angular/cdk/overlay';
import { configure } from 'scandit-sdk';
// import { ScanditModalComponent } from './scandit-modal';
import { Config } from '@core/config';
import { ComponentPortal } from '@angular/cdk/portal';
import { ScanditOverlayComponent } from './scandit-overlay.component';
import { EnvironmentService } from '@core/environment';
@Injectable()
export class ScanditScanAdapter implements ScanAdapter {
readonly name = 'Scandit';
constructor(private readonly _config: Config, private _overlay: Overlay, private _environmentService: EnvironmentService) {}
async init(): Promise<boolean> {
if (this._environmentService.isTablet()) {
await configure(this._config.get('licence.scandit'), {
engineLocation: '/scandit/',
});
return true;
}
return false;
}
scan(): Observable<string> {
return new Observable((observer) => {
const overlay = this.createOverlay();
const portal = this.createPortal();
const ref = overlay.attach(portal);
const sub = new Subscriber();
const complete = () => {
overlay.detach();
ref.destroy();
sub.unsubscribe();
sub.complete();
observer.complete();
};
sub.add(
overlay.backdropClick().subscribe(() => {
complete();
})
);
ref.instance.onScan((code) => {
observer.next(code);
complete();
});
ref.instance.onClose(() => {
complete();
});
return complete;
});
}
createOverlay() {
const overlay = this._overlay.create({
positionStrategy: this._overlay.position().global().centerHorizontally().centerVertically(),
hasBackdrop: true,
});
return overlay;
}
createPortal() {
const portal = new ComponentPortal(ScanditOverlayComponent);
return portal;
}
}

View File

@@ -1,11 +0,0 @@
/*
* Public API Surface of scan
*/
export * from './lib/scandit';
export * from './lib/dev.scan-adapter';
export * from './lib/native.scan-adapter';
export * from './lib/scan-adapter';
export * from './lib/scan.module';
export * from './lib/scan.service';
export * from './lib/tokens';

View File

@@ -1,19 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"outDir": "../../../out-tsc/lib",
"declaration": true,
"declarationMap": true,
"inlineSources": true,
"types": [],
"lib": [
"dom",
"es2018"
]
},
"exclude": [
"src/test.ts",
"**/*.spec.ts"
]
}

View File

@@ -1,10 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.lib.json",
"compilerOptions": {
"declarationMap": false
},
"angularCompilerOptions": {
"compilationMode": "partial"
}
}

View File

@@ -1,14 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"outDir": "../../../out-tsc/spec",
"types": [
"jasmine"
]
},
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
}

View File

@@ -1,25 +0,0 @@
# ProductImage
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.2.
## Code scaffolding
Run `ng generate component component-name --project product-image` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project product-image`.
> Note: Don't forget to add `--project product-image` or else it will be added to the default project in your `angular.json` file.
## Build
Run `ng build product-image` to build the project. The build artifacts will be stored in the `dist/` directory.
## Publishing
After building your library with `ng build product-image`, go to the dist folder `cd dist/product-image` and run `npm publish`.
## Running unit tests
Run `ng test product-image` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/cdn/product-image",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,11 +0,0 @@
{
"name": "@cdn/product-image",
"version": "0.0.1",
"peerDependencies": {
"@angular/common": "^10.1.2",
"@angular/core": "^10.1.2"
},
"dependencies": {
"tslib": "^2.0.0"
}
}

View File

@@ -1,8 +0,0 @@
/*
* Public API Surface of product-image
*/
export * from './lib/product-image.service';
export * from './lib/product-image.module';
export * from './lib/product-image.pipe';
export * from './lib/tokens';

View File

@@ -1,24 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"outDir": "../../../out-tsc/lib",
"declaration": true,
"declarationMap": true,
"inlineSources": true,
"types": [],
"lib": [
"dom",
"es2018"
]
},
"angularCompilerOptions": {
"skipTemplateCodegen": true,
"strictMetadataEmit": true,
"enableResourceInlining": true
},
"exclude": [
"src/test.ts",
"**/*.spec.ts"
]
}

View File

@@ -1,10 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.lib.json",
"compilerOptions": {
"declarationMap": false
},
"angularCompilerOptions": {
"compilationMode": "partial"
}
}

View File

@@ -1,14 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"outDir": "../../../out-tsc/spec",
"types": [
"jasmine"
]
},
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
}

View File

@@ -1,17 +0,0 @@
{
"extends": "../../../tslint.json",
"rules": {
"directive-selector": [
true,
"attribute",
"cdn",
"camelCase"
],
"component-selector": [
true,
"element",
"cdn",
"kebab-case"
]
}
}

View File

@@ -1,25 +0,0 @@
# Core
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.0.0.
## Code scaffolding
Run `ng generate component component-name --project core` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project core`.
> Note: Don't forget to add `--project core` or else it will be added to the default project in your `angular.json` file.
## Build
Run `ng build core` to build the project. The build artifacts will be stored in the `dist/` directory.
## Publishing
After building your library with `ng build core`, go to the dist folder `cd dist/core` and run `npm publish`.
## Running unit tests
Run `ng test core` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/application",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,6 +0,0 @@
// start:ng42.barrel
export * from './application.module';
export * from './application.service';
export * from './defs';
export * from './store';
// end:ng42.barrel

View File

@@ -1,18 +0,0 @@
import { createAction, props } from '@ngrx/store';
import { ApplicationProcess } from '..';
const prefix = '[CORE-APPLICATION]';
export const setTitle = createAction(`${prefix} Set Title`, props<{ title: string }>());
export const setSection = createAction(`${prefix} Set Section`, props<{ section: 'customer' | 'branch' }>());
export const addProcess = createAction(`${prefix} Add Process`, props<{ process: ApplicationProcess }>());
export const removeProcess = createAction(`${prefix} Remove Process`, props<{ processId: number }>());
export const setActivatedProcess = createAction(`${prefix} Set Activated Process`, props<{ activatedProcessId: number }>());
export const patchProcess = createAction(`${prefix} Patch Process`, props<{ processId: number; changes: Partial<ApplicationProcess> }>());
export const patchProcessData = createAction(`${prefix} Patch Process Data`, props<{ processId: number; data: Record<string, any> }>());

View File

@@ -1,35 +0,0 @@
import { ApplicationState } from './application.state';
import { ApplicationProcess } from '../defs';
import * as selectors from './application.selectors';
describe('applicationSelectors', () => {
it('should select the processes', () => {
const processes: ApplicationProcess[] = [{ id: 1, name: 'Vorgang 1', section: 'customer' }];
const state: ApplicationState = {
processes,
section: 'customer',
};
expect(selectors.selectProcesses.projector(state)).toEqual(processes);
});
it('should select the section', () => {
const state: ApplicationState = {
processes: [],
section: 'customer',
};
expect(selectors.selectSection.projector(state)).toEqual('customer');
});
it('should select the activatedProcess', () => {
const processes: ApplicationProcess[] = [
{ id: 1, name: 'Vorgang 1', section: 'customer', activated: 100 },
{ id: 2, name: 'Vorgang 2', section: 'customer', activated: 300 },
{ id: 3, name: 'Vorgang 3', section: 'customer', activated: 200 },
];
const state: ApplicationState = {
processes,
section: 'customer',
};
expect(selectors.selectActivatedProcess.projector(state)).toEqual(processes[1]);
});
});

View File

@@ -1,5 +0,0 @@
/*
* Public API Surface of application
*/
export * from './lib';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/auth",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,125 +0,0 @@
import { coerceArray, coerceStringArray } from '@angular/cdk/coercion';
import { Injectable } from '@angular/core';
import { Config } from '@core/config';
import { isNullOrUndefined } from '@utils/common';
import { AuthConfig, OAuthService } from 'angular-oauth2-oidc';
import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';
import { asapScheduler, BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private readonly _initialized = new BehaviorSubject<boolean>(false);
get initialized$() {
return this._initialized.asObservable();
}
private _authConfig: AuthConfig;
constructor(private _config: Config, private readonly _oAuthService: OAuthService) {
this._oAuthService.events?.subscribe((event) => {
if (event.type === 'token_received') {
console.log('SSO Token Expiration:', new Date(this._oAuthService.getAccessTokenExpiration()));
}
});
}
async init() {
if (this._initialized.getValue()) {
throw new Error('AuthService is already initialized');
}
this._authConfig = this._config.get('@core/auth');
this._authConfig.redirectUri = window.location.origin;
this._authConfig.silentRefreshRedirectUri = window.location.origin + '/silent-refresh.html';
this._authConfig.useSilentRefresh = true;
this._oAuthService.configure(this._authConfig);
this._oAuthService.tokenValidationHandler = new JwksValidationHandler();
this._oAuthService.setupAutomaticSilentRefresh();
try {
await this._oAuthService.loadDiscoveryDocumentAndTryLogin();
} catch (error) {
this.login();
}
this._initialized.next(true);
}
isAuthenticated() {
return this._oAuthService.hasValidIdToken();
}
getToken() {
return this._oAuthService.getAccessToken();
}
getClaims() {
const token = this._oAuthService.getAccessToken();
return this.parseJwt(token);
}
getClaimByKey(key: string) {
const claims = this.getClaims();
if (isNullOrUndefined(claims)) {
return null;
}
return claims[key];
}
parseJwt(token: string) {
if (isNullOrUndefined(token)) {
return null;
}
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const encoded = window.atob(base64);
return JSON.parse(encoded);
}
login() {
this._oAuthService.initLoginFlow();
}
setKeyCardToken(token: string) {
this._oAuthService.customQueryParams = {
temp_token: token,
};
}
async logout() {
await this._oAuthService.revokeTokenAndLogout();
// asapScheduler.schedule(() => {
// window.location.reload();
// }, 250);
}
hasRole(role: string | string[]) {
const roles = coerceArray(role);
const userRoles = this.getClaimByKey('role');
if (isNullOrUndefined(userRoles)) {
return false;
}
return roles.every((r) => userRoles.includes(r));
}
async refresh() {
try {
if (this._authConfig.responseType.includes('code') && this._authConfig.scope.includes('offline_access')) {
await this._oAuthService.refreshToken();
} else {
await this._oAuthService.silentRefresh();
}
} catch (error) {
console.error(error);
}
}
}

View File

@@ -1,4 +0,0 @@
// start:ng42.barrel
export * from './auth.module';
export * from './auth.service';
// end:ng42.barrel

View File

@@ -1,5 +0,0 @@
/*
* Public API Surface of auth
*/
export * from './lib';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/breadcrumb",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1 +0,0 @@
describe('Breadcrumb Actions', () => {});

View File

@@ -1,57 +0,0 @@
import * as selector from './breadcrumb.selectors';
import * as action from './breadcrumb.actions';
import { breadcrumbReducer } from './breadcrumb.reducer';
import { BreadcrumbState, INIT } from './breadcrumb.state';
describe('Breadcrumb Selectors', () => {
let state: BreadcrumbState;
beforeEach(() => {
state = breadcrumbReducer(
INIT,
action.addBreadcrumb({ breadcrumb: { id: 1, key: 'unit-test-1', path: '', name: 'Unit Test 1', section: 'customer' } })
);
state = breadcrumbReducer(
state,
action.addBreadcrumb({
breadcrumb: { id: 2, key: 'unit-test-1', path: '', name: 'Unit Test 1', tags: ['details'], section: 'customer' },
})
);
state = breadcrumbReducer(
state,
action.addBreadcrumb({ breadcrumb: { id: 3, key: 'unit-test-2', path: '', name: 'Unit Test 1', section: 'customer' } })
);
state = breadcrumbReducer(
state,
action.addBreadcrumb({ breadcrumb: { id: 4, key: 'unit-test-3', path: '', name: 'Unit Test 1', section: 'customer' } })
);
state = breadcrumbReducer(
state,
action.addBreadcrumb({
breadcrumb: { id: 5, key: 'unit-test-3', path: '', name: 'Unit Test 1', tags: ['details'], section: 'customer' },
})
);
});
describe('selectBreadcrumbsByKey', () => {
it('should return all breadcrumbs with the key unit-test-1', () => {
const fixture = selector.selectBreadcrumbsByKey.projector(Object.values(state.entities), 'unit-test-1');
expect(fixture.length).toBe(2);
expect(fixture[0].key).toBe('unit-test-1');
expect(fixture[1].key).toBe('unit-test-1');
});
});
describe('selectBreadcrumbsByKeyAndTag', () => {
it('should return all breadcrumbs with the key unit-test-3 and tag details', () => {
const fixture = selector.selectBreadcrumbsByKeyAndTag.projector(Object.values(state.entities), {
key: 'unit-test-3',
tag: 'details',
});
expect(fixture.length).toBe(1);
expect(fixture[0].key).toBe('unit-test-3');
expect(fixture[0].tags).toContain('details');
});
});
});

View File

@@ -1,7 +0,0 @@
/*
* Public API Surface of breadcrumb
*/
export * from './lib/breadcrumb.service';
export * from './lib/core-breadcrumb.module';
export * from './lib/defs';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/cache",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,4 +0,0 @@
export interface CacheOptions {
ttl?: number;
persist?: boolean;
}

View File

@@ -1,116 +0,0 @@
import { Injectable } from '@angular/core';
import { CacheOptions } from './cache-options';
import { Cached } from './cached';
import { interval } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class CacheService {
constructor() {
this._registerCleanupTask();
}
_registerCleanupTask() {
this.cleanup();
interval(1000 * 60).subscribe(() => {
this.cleanup();
});
}
set<T>(token: Object, data: T, options?: CacheOptions) {
const persist = options?.persist;
const ttl = options?.ttl;
const cached: Cached = {
data,
};
if (ttl) {
cached.until = Date.now() + ttl;
} else {
cached.until = Date.now() + 1000 * 60 * 60 * 12;
}
if (persist) {
localStorage.setItem(this.getKey(token), this.serialize(cached));
} else {
sessionStorage.setItem(this.getKey(token), this.serialize(cached));
}
Object.freeze(cached);
return cached;
}
get<T = any>(token: Object, from?: 'session' | 'persist'): T {
let cached: Cached;
if (from === 'session') {
cached = this.deserialize(sessionStorage.getItem(this.getKey(token)));
} else if (from === 'persist') {
cached = this.deserialize(localStorage.getItem(this.getKey(token)));
} else {
cached = this.deserialize(sessionStorage.getItem(this.getKey(token))) || this.deserialize(localStorage.getItem(this.getKey(token)));
}
if (!cached) {
return undefined;
}
if (cached.until < Date.now()) {
this.delete(token, from);
return undefined;
}
return cached.data;
}
delete(token: Object, from: 'session' | 'persist' = 'session') {
if (from === 'session') {
sessionStorage.removeItem(this.getKey(token));
} else if (from === 'persist') {
localStorage.removeItem(this.getKey(token));
}
}
private getKey(token: Object) {
const key = `CacheService_` + this.hash(JSON.stringify(token));
return key;
}
private hash(data: string): string {
let hash = 0;
for (let i = 0; i < data.length; i++) {
hash = data.charCodeAt(i) + ((hash << 5) - hash);
}
return hash.toString(16);
}
private serialize(data: Cached): string {
return JSON.stringify(data);
}
private deserialize(data: string): Cached {
return JSON.parse(data);
}
cleanup() {
// get all keys created by this service by looking for the service name and remove the entries
// that ttl is expired
let localStorageKeys = Object.keys(localStorage).filter((key) => key.startsWith('CacheService_'));
let seesionStorageKeys = Object.keys(sessionStorage).filter((key) => key.startsWith('CacheService_'));
localStorageKeys.forEach((key) => {
const cached = this.deserialize(localStorage.getItem(key));
if (cached.until < Date.now()) {
localStorage.removeItem(key);
}
});
seesionStorageKeys.forEach((key) => {
const cached = this.deserialize(sessionStorage.getItem(key));
if (cached.until < Date.now()) {
sessionStorage.removeItem(key);
}
});
}
}

View File

@@ -1,4 +0,0 @@
export interface Cached {
until?: number;
data?: any;
}

View File

@@ -1,6 +0,0 @@
/*
* Public API Surface of cache
*/
export * from './lib/cache.service';
export * from './lib/cache.module';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/command",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,25 +0,0 @@
import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';
import { ActionHandler } from './action-handler.interface';
import { CommandService } from './command.service';
import { FEATURE_ACTION_HANDLERS, ROOT_ACTION_HANDLERS } from './tokens';
export function provideActionHandlers(actionHandlers: Type<ActionHandler>[]): Provider[] {
return [CommandService, actionHandlers.map((handler) => ({ provide: FEATURE_ACTION_HANDLERS, useClass: handler, multi: true }))];
}
@NgModule({})
export class CoreCommandModule {
static forRoot(actionHandlers: Type<ActionHandler>[]): ModuleWithProviders<CoreCommandModule> {
return {
ngModule: CoreCommandModule,
providers: [CommandService, actionHandlers.map((handler) => ({ provide: ROOT_ACTION_HANDLERS, useClass: handler, multi: true }))],
};
}
static forChild(actionHandlers: Type<ActionHandler>[]): ModuleWithProviders<CoreCommandModule> {
return {
ngModule: CoreCommandModule,
providers: [CommandService, actionHandlers.map((handler) => ({ provide: FEATURE_ACTION_HANDLERS, useClass: handler, multi: true }))],
};
}
}

View File

@@ -1,6 +0,0 @@
// start:ng42.barrel
export * from './action-handler.interface';
export * from './command.module';
export * from './command.service';
export * from './tokens';
// end:ng42.barrel

View File

@@ -1,5 +0,0 @@
/*
* Public API Surface of command
*/
export * from './lib';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/config",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,8 +0,0 @@
import { Observable } from 'rxjs';
/**
* Config loader interface for loading configurations
*/
export interface ConfigLoader {
load(): Promise<any>;
}

View File

@@ -1,4 +0,0 @@
// start:ng42.barrel
export * from './config-loader';
export * from './json.config-loader';
// end:ng42.barrel

View File

@@ -1,36 +0,0 @@
// unit test JsonConfigLoader
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator';
import { CORE_JSON_CONFIG_LOADER_URL } from '../tokens';
import { JsonConfigLoader } from './json.config-loader';
describe('JsonConfigLoader', () => {
let spectator: SpectatorService<JsonConfigLoader>;
const createService = createServiceFactory({
imports: [HttpClientTestingModule],
service: JsonConfigLoader,
mocks: [],
providers: [{ provide: CORE_JSON_CONFIG_LOADER_URL, useValue: '/assets/config.json' }],
});
let httpTestingController: HttpTestingController;
beforeEach(() => {
spectator = createService();
httpTestingController = spectator.inject(HttpTestingController);
});
it('should create', () => {
expect(spectator.service).toBeTruthy();
});
describe('load', () => {
it('should call the provided url', async () => {
const reqPromise = spectator.service.load();
const req = httpTestingController.expectOne('/assets/config.json');
req.flush({ unit: 'test' });
const result = await reqPromise;
httpTestingController.verify();
expect(result).toEqual({ unit: 'test' });
});
});
});

View File

@@ -1,13 +0,0 @@
import { HttpClient } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import { ConfigLoader } from './config-loader';
import { CORE_JSON_CONFIG_LOADER_URL } from '../tokens';
@Injectable()
export class JsonConfigLoader implements ConfigLoader {
constructor(@Inject(CORE_JSON_CONFIG_LOADER_URL) private url: string, private http: HttpClient) {}
load(): Promise<any> {
return this.http.get(this.url).toPromise();
}
}

View File

@@ -1,7 +0,0 @@
import { Type } from '@angular/core';
import { ConfigLoader } from './config-loaders';
export interface ConfigModuleOptions {
useConfigLoader: Type<ConfigLoader>;
jsonConfigLoaderUrl?: string;
}

View File

@@ -1,28 +0,0 @@
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
import { CORE_CONFIG_LOADER } from '@core/config';
import { Config } from './config';
import { ConfigModuleOptions } from './config-module-options';
import { CORE_JSON_CONFIG_LOADER_URL } from './tokens';
export function _initializeConfigFactory(config: Config) {
return () => config.init();
}
@NgModule({})
export class ConfigModule {
static forRoot(options: ConfigModuleOptions): ModuleWithProviders<ConfigModule> {
const configLoaderProvider = {
provide: CORE_CONFIG_LOADER,
useClass: options.useConfigLoader,
};
return {
ngModule: ConfigModule,
providers: [
Config,
configLoaderProvider,
options.jsonConfigLoaderUrl ? { provide: CORE_JSON_CONFIG_LOADER_URL, useValue: options.jsonConfigLoaderUrl } : null,
],
};
}
}

View File

@@ -1,45 +0,0 @@
import { createServiceFactory, SpectatorService } from '@ngneat/spectator';
import { Config } from './config';
import { ConfigLoader } from './config-loaders';
import { CORE_CONFIG_LOADER } from './tokens';
class TestConfigLoader implements ConfigLoader {
load() {
return Promise.resolve({});
}
}
// Unit test Config
describe('Config', () => {
let spectator: SpectatorService<Config>;
const createService = createServiceFactory({
service: Config,
providers: [{ provide: CORE_CONFIG_LOADER, useClass: TestConfigLoader }],
});
let configLoader: ConfigLoader;
beforeEach(() => {
spectator = createService();
configLoader = spectator.inject(CORE_CONFIG_LOADER);
});
it('should create', () => {
expect(spectator.service).toBeTruthy();
});
describe('init()', () => {
it('should load config and assigns it to _config', async () => {
const config = { unit: 'test' };
spyOn(configLoader, 'load').and.returnValue(Promise.resolve(config));
await spectator.service.init();
expect(spectator.service['_config']).toEqual(config);
});
});
describe('get()', () => {
it('should return config value', () => {
spectator.service['_config'] = { test: 'test' };
expect(spectator.service.get('test')).toEqual('test');
});
});
});

View File

@@ -1,27 +0,0 @@
import { Inject, Injectable } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { ConfigLoader } from './config-loaders';
import { CORE_CONFIG_LOADER } from './tokens';
import { pick } from './utils';
@Injectable()
export class Config {
private _config: any;
private readonly _initilized = new ReplaySubject<void>(1);
get initialized() {
return this._initilized.asObservable();
}
constructor(@Inject(CORE_CONFIG_LOADER) private readonly _configLoader: ConfigLoader) {}
// load config and assign it to this._config
async init() {
this._config = await this._configLoader.load();
this._initilized.next();
}
get(path: string) {
return pick(path, this._config);
}
}

View File

@@ -1,8 +0,0 @@
// start:ng42.barrel
export * from './config-module-options';
export * from './config.module';
export * from './config';
export * from './tokens';
export * from './config-loaders';
export * from './utils';
// end:ng42.barrel

View File

@@ -1,6 +0,0 @@
import { InjectionToken } from '@angular/core';
import { ConfigLoader } from './config-loaders';
export const CORE_CONFIG_LOADER = new InjectionToken<ConfigLoader>('core.config.loader');
export const CORE_JSON_CONFIG_LOADER_URL = new InjectionToken<ConfigLoader>('core.json.config.loader.url');

View File

@@ -1,3 +0,0 @@
// start:ng42.barrel
export * from './pick';
// end:ng42.barrel

View File

@@ -1,41 +0,0 @@
import { pick } from './pick';
describe('pick', () => {
it('should pick properties from the 1st level from the object', () => {
const obj = {
foo: 'bar',
};
expect(pick('foo', obj)).toEqual('bar');
});
it('should pick properties from the 2nd level from the object', () => {
const obj = {
foo: {
bar: 'baz',
},
};
expect(pick('foo.bar', obj)).toEqual('baz');
});
it('should pick properties from the 3rd level from the object', () => {
const obj = {
foo: {
bar: {
baz: 'qux',
},
},
};
expect(pick('foo.bar.baz', obj)).toEqual('qux');
});
it('should throw an error of obj is not an object', () => {
expect(() => pick('foo', 'bar')).toThrowError(`bar is not an object`);
});
it('should return undefined if the property is not found', () => {
const obj = {
foo: 'bar',
};
expect(pick('bar', obj)).toEqual(undefined);
});
});

View File

@@ -1,33 +0,0 @@
/**
* Pick a value from an object at a given path.
* @param path path of the value to pick
* @param obj object to pick from
* @returns the value at the path or undefined
* @throws if obj is not an object
*/
export function pick<T = any>(path: string, obj: Object): T {
const paths = path.split('.');
// check if obj is null or undefined
if (obj == null) {
return undefined;
}
// check if obj is of type object and not an array
// and throw an error if not
if (typeof obj !== 'object' || Array.isArray(obj)) {
throw new Error(`${obj} is not an object`);
}
let result = obj;
// loop through the path and pick the value
// early exit if the path is empty
for (const path of paths) {
result = result[path];
if (result == null) {
return undefined;
}
}
return result as T;
}

View File

@@ -1,5 +0,0 @@
/*
* Public API Surface of config
*/
export * from './lib';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/environment",
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@@ -1,6 +0,0 @@
/*
* Public API Surface of environment
*/
export * from './lib/environment.service';
export * from './lib/environment.module';

View File

@@ -1,7 +0,0 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/core/logger",
"lib": {
"entryFile": "src/public-api.ts"
}
}

Some files were not shown because too many files have changed in this diff Show More