Compare commits

...

628 Commits

Author SHA1 Message Date
Nino
e4e6391ecf #4550 Fix Multiple Processes Contain now correct data, even if a new search gets triggered on result page 2024-01-04 08:59:05 +01:00
Nino
c5f7592947 Merge branch 'develop' into fix/4550-HSC-Suche-Wird-Nicht-Gespeichert 2024-01-03 11:56:28 +01:00
Nino
7f8f48f393 Updated tsconfig 2024-01-03 11:54:03 +01:00
Nino
0fe0c5242d Merge branch 'release/3.0' into develop 2024-01-03 11:52:25 +01:00
Nino
3ad397eb95 Zwischencommit 2024-01-03 11:46:24 +01:00
Nino
d208bdaf97 Added Package Inspection Class Name in Details Page for Page Objects Targetting 2024-01-02 15:08:19 +01:00
Nino Righi
dc80df4ad4 Merged PR 1712: #4524 Page Article Search Improved Order by Filter Handling
#4524 Page Article Search Improved Order by Filter Handling
2023-12-29 16:12:53 +00:00
Nino Righi
3020609682 Merged PR 1711: #4545 #4548 Fix HSC Breadcrumb and Multiple Processes bug
#4545 #4548 Fix HSC Breadcrumb and Multiple Processes bug
2023-12-29 15:22:26 +00:00
Nino Righi
5c3e1ed2ad Merged PR 1710: #4544 Fix Proveded Store correctly, removed take from filter and cancleSearch...
#4544 Fix Proveded Store correctly, removed take from filter and cancleSearchRequests on process change
2023-12-29 15:12:51 +00:00
Nino Righi
e832feebc5 Merged PR 1709: #4545 Fix Missing Main Breadcrumb
#4545 Fix Missing Main Breadcrumb
2023-12-28 15:10:44 +00:00
Nino Righi
08580d782d Merged PR 1708: #4546 HSC Customer Orders Fixed Navigation Link Active Styling
#4546 HSC Customer Orders Fixed Navigation Link Active Styling
2023-12-28 15:01:40 +00:00
Nino Righi
2d07556341 Merged PR 1707: #4533 Fixed Breadcrumb and Searchbox after Scan
#4533 Fixed Breadcrumb and Searchbox after Scan
2023-12-28 12:23:48 +00:00
Nino Righi
9ad1256019 Merged PR 1706: #4543 Styling Fix Checkout Review for multiple Destinations per OrderType
#4543 Styling Fix Checkout Review for multiple Destinations per OrderType
2023-12-27 16:00:23 +00:00
Nino Righi
250002f057 Merged PR 1705: #4516 Fix Also Show Details Items Group in Pick Up Shelf In
#4516 Fix Also Show Details Items Group in Pick Up Shelf In
2023-12-27 15:59:11 +00:00
Nino Righi
0973b01bf0 Merged PR 1704: #4539 Fix Skip Location Change Filter
#4539 Fix Skip Location Change Filter
2023-12-27 14:39:15 +00:00
Nino Righi
d5254cc150 Merged PR 1703: #4541 Added Errorhandling to Customer Search Store
#4541 Added Errorhandling to Customer Search Store
2023-12-27 08:09:29 +00:00
Nino Righi
adc5a5a280 Merged PR 1702: #4516 WA Implementation of orderType Groups
#4516 WA Implementation of orderType Groups
2023-12-22 16:13:52 +00:00
Nino Righi
2ff033ea55 Merged PR 1701: #4539 Hotfix AHF Open Filter Page does not trigger search request
#4539 Hotfix AHF Open Filter Page does not trigger search request
2023-12-21 17:23:08 +00:00
Nino Righi
cbaac8ed9a Merged PR 1700: #4537 Relocated Component Store provision
#4537 Relocated Component Store provision
2023-12-21 17:19:35 +00:00
Lorenz Hilpert
f0b653fd0f Merged PR 1699: #4533 Breadcrumb wird falsch dargestellt
#4533 Breadcrumb wird falsch dargestellt
2023-12-20 16:17:39 +00:00
Lorenz Hilpert
14eba6e5ea Merged PR 1698: #4485 Kundendaten werden übernommen wenn welche vorhanden sind
#4485 Kundendaten werden übernommen wenn welche vorhanden sind
2023-12-20 14:55:04 +00:00
Lorenz Hilpert
803a8e316c Skip UnitTest for some libs 2023-12-19 17:33:19 +01:00
Nino Righi
83cab7796e Merged PR 1697: #4530 Notification Batch Messages for each type
#4530 Notification Batch Messages for each type

(cherry picked from commit 5073693fc2)
2023-12-19 17:14:37 +01:00
Nino Righi
c70dd30830 Merged PR 1695: #4523 AHF, WA Added other notification types to Email Notification Badge
#4523 AHF, WA Added other notification types to Email Notification Badge

(cherry picked from commit f3cb6236a5)
2023-12-19 17:14:03 +01:00
Lorenz Hilpert
b28bb165d4 Merged PR 1696: #4532 Mitarbeiter klickt auf Einbuchen und erreicht den Tätigkeitskalender
#4532 Mitarbeiter klickt auf Einbuchen und erreicht den Tätigkeitskalender
2023-12-19 13:35:58 +00:00
Nino Righi
5073693fc2 Merged PR 1697: #4530 Notification Batch Messages for each type
#4530 Notification Batch Messages for each type
2023-12-19 13:34:22 +00:00
Nino Righi
f3cb6236a5 Merged PR 1695: #4523 AHF, WA Added other notification types to Email Notification Badge
#4523 AHF, WA Added other notification types to Email Notification Badge
2023-12-15 16:03:34 +00:00
Lorenz Hilpert
4ab9890313 #4485 #4500 Kundenkartenkonto anlage Verhalten and Suche angeglichen 2023-12-15 14:34:24 +01:00
Nino Righi
32d8d81f53 Merged PR 1694: #4526 Hotfix Pickup Shelf Edit show Erneut Senden CTA
#4526 Hotfix Pickup Shelf Edit show Erneut Senden CTA
2023-12-15 10:12:51 +00:00
Nino
0361aa63ff Merge Develop into Release/3.0, corrected itemSize in page catalog list 2023-12-12 16:52:03 +01:00
Nino
2f95c23910 Merge branch 'develop' into release/3.0 2023-12-12 16:35:35 +01:00
Nino Righi
a8cd6ce844 Merged PR 1693: #4522 Pickup Shelf List Added margin-bottom as gap between item groups, remov...
#4522 Pickup Shelf List Added margin-bottom as gap between item groups, removed unused code
2023-12-12 14:18:07 +00:00
Lorenz Hilpert
3bba23cc76 Merged PR 1692: #4380 Abholung als Standard wenn möglich und keine Auswahl getroffen wurde
#4380 Abholung als Standard wenn möglich und keine Auswahl getroffen wurde
2023-12-12 12:43:13 +00:00
Nino Righi
e25f176a7b Merged PR 1691: #4521 Fix Check Page Catalog List if List got already fetched completely
#4521 Fix Check Page Catalog List if List got already fetched completely
2023-12-12 09:39:22 +00:00
Nino Righi
a169d2a4e9 Merged PR 1690: #4518 Fix Pickup Shelf In List additionally Fetch Items after queryParams change
#4518 Fix Pickup Shelf In List additionally Fetch Items after queryParams change
2023-12-11 15:55:32 +00:00
Nino Righi
6a9caa432e Merged PR 1689: #4519 #4520 Page Catalog Search Breadcrumb and Navigation fixes
#4519 #4520 Page Catalog Search Breadcrumb and Navigation fixes
2023-12-11 09:23:35 +00:00
Nino Righi
389948c077 Merged PR 1688: #4510 Fix Time Format in Customer Details
#4510 Fix Time Format in Customer Details
2023-12-08 09:30:29 +00:00
Nino Righi
e7724ed8b9 Merged PR 1687: #4509 Implemented Loading Spinner on Pickup Shelf Details Pages
#4509 Implemented Loading Spinner on Pickup Shelf Details Pages
2023-12-07 10:03:39 +00:00
Nino Righi
c7f1b27fdf Merged PR 1686: #4508 Pickup Shelf In Clear Cover Items after Routing to new Details page
#4508 Pickup Shelf In Clear Cover Items after Routing to new Details page
2023-12-06 15:18:55 +00:00
Lorenz Hilpert
135f0255b8 IPad2 PDP Styling 2023-12-06 16:18:06 +01:00
Nino Righi
65a7aa569d Merged PR 1685: Scroll Position Fix After Process Change
Scroll Position Fix After Process Change
2023-12-05 18:14:32 +00:00
Nino Righi
211eaa6175 Merged PR 1684: Page Catalog Result List - Removed maxBufferSize, Updated ScrollPosition Handling
Page Catalog Result List - Removed maxBufferSize, Updated ScrollPosition Handling
2023-12-05 16:59:23 +00:00
Lorenz Hilpert
8097c6ad9e Merge branch 'performance' into develop 2023-12-05 10:48:17 +01:00
Lorenz Hilpert
b0d76b01d7 Merge branch 'release/3.0' into develop 2023-12-05 10:47:34 +01:00
Lorenz Hilpert
626fd0081f Merge branch 'develop' into release/3.0 2023-12-05 10:47:00 +01:00
Lorenz Hilpert
362fca74bc Warenausgbae list IPad 2 2023-12-04 16:29:14 +01:00
Lorenz Hilpert
b8f0a29f79 IPad 2 Scrolling 2023-12-04 16:22:39 +01:00
Lorenz Hilpert
f54400f00d Merge branch 'develop' into performance 2023-12-04 14:23:30 +01:00
Lorenz Hilpert
54094695b1 #4505 RD // Einbuchen - Bearbeiten Seite wird mal in Split Screen Ansicht mal ohne angezeigt 2023-12-04 13:27:43 +01:00
Nino Righi
1e3e9588da Merged PR 1683: #4501 #4502 Fixed by reverting Changes from #4490
#4501 #4502 Fixed by reverting Changes from #4490
2023-12-04 11:43:07 +00:00
Nino
f04705b659 Merge branch 'release/3.0' into develop 2023-12-01 17:04:02 +01:00
Nino
c22672fad0 Fixed Styling and Layout Issues 2023-12-01 13:07:59 +01:00
Nino
59673a47db Tablet size fix, Navigate After SearchCompleted on Page Catalog and Page Customer Orders 2023-11-30 18:24:32 +01:00
Nino
e56ea0bd4e MaxBufferSize Update Result List Page Catalog 2023-11-30 18:15:58 +01:00
Nino Righi
f8c4d4a842 Merged PR 1682: #4416 RD Checkout, WA, WE, Notifications Component Changes
#4416 RD Checkout, WA, WE, Notifications Component Changes
2023-11-30 16:06:37 +00:00
Lorenz Hilpert
c4dd9214a3 Splitscreen side outlet rendern nur wenn nötig 2023-11-30 16:55:08 +01:00
Nino Righi
4d74b3a89e Merged PR 1679: #4491 Mark Shelf Children Sides Active based on view param
#4491 Mark Shelf Children Sides Active based on view param
2023-11-29 15:31:35 +00:00
Nino Righi
b0b3fd40ce Merged PR 1681: #4490 Improvement added Filter parameter orderitemprocessingstatus on details...
#4490 Improvement added Filter parameter orderitemprocessingstatus on details page request
2023-11-29 15:04:58 +00:00
Lorenz Hilpert
3404c930c5 #4485 - anlage von Kundenkartenkonto - Datenübernahme 2023-11-29 16:04:18 +01:00
Nino Righi
abcd940ed3 Merged PR 1678: #4493 Fix Breadcrumb Navigation if comming from other List
#4493 Fix Breadcrumb Navigation if comming from other List
2023-11-29 10:45:51 +00:00
Nino Righi
c1756942b2 Merged PR 1680: #4492 Added Navigation based On View after certain Actions
#4492 Added Navigation based On View after certain Actions
2023-11-29 10:45:14 +00:00
Lorenz Hilpert
ea4d036066 Merge branch 'develop' into release/3.0 2023-11-24 09:51:21 +01:00
Lorenz Hilpert
101a34bd3f #4484 RD // Online Konto anlegen via "Kundensuche | Keine Suchergebnisse" wirft Fehlermeldung 2023-11-23 18:06:49 +01:00
Lorenz Hilpert
99bad149cb attribute für e2e tests 2023-11-23 13:57:55 +01:00
Lorenz Hilpert
a0bff7164c #4481 RD // Warenkorb - Klick auf "Speichern" bei Benachrichtigung "Email" oder "SMS" enabled "Bestellen"-Button nicht 2023-11-22 15:30:07 +01:00
Lorenz Hilpert
0c4a4130b9 #4488 RD // TK - Artikel-Link führt auf Dashboard 2023-11-21 15:58:38 +01:00
Lorenz Hilpert
8dd1211729 #4487 RD // Abholfach - ändern des vsl. Lieferdatums und "zurückgelegt bis"-Datum wirft Fehler 2023-11-21 10:42:14 +01:00
Lorenz Hilpert
a2f1b8b624 #4478 RD // Abholfach - Routing löst Suche aus 2023-11-20 14:22:32 +01:00
Lorenz Hilpert
98a331ffe5 #4482 RD // Abholfach - Split-Screen raus bei "Bearbeiten" + ""Historie" 2023-11-20 13:38:11 +01:00
Lorenz Hilpert
c0f97c9bae Add doNotTrack option to article search 2023-11-10 18:52:23 +01:00
Lorenz Hilpert
960ffa165f Merge branch 'develop' into release/3.0 2023-11-10 18:33:13 +01:00
Lorenz Hilpert
6bdfbe2eff Refactor breadcrumb filtering in side menu
component
2023-11-10 18:32:56 +01:00
Lorenz Hilpert
80342e61ac #4470 Updated icon names in icons.json 2023-11-10 16:31:27 +01:00
Lorenz Hilpert
6bf3894e4d Add data attributes to pickup shelf list item
component HTML
2023-11-10 15:07:11 +01:00
Lorenz Hilpert
aab29838bf #4470 Add new customer order types to icons and label
colors
2023-11-10 14:35:38 +01:00
Lorenz Hilpert
856ca5651e #4475 Refactor remission-list.component.html button
styles
2023-11-10 14:31:57 +01:00
Lorenz Hilpert
a7d4b8d7fb #4273 Refactor navigation logic in search results and
product card components
2023-11-10 14:09:01 +01:00
Lorenz Hilpert
62d260473c #4474 Refactor clearFilter method to use main_qs from
filter query params
2023-11-09 11:50:02 +01:00
Lorenz Hilpert
bde52a2526 Merge branch 'release/3.0' into develop 2023-11-09 11:39:41 +01:00
Lorenz Hilpert
6243b03cfc #4466 Revert changes to fix display issue in
PickupShelfDetailsBaseComponent
2023-11-08 16:39:03 +01:00
Lorenz Hilpert
d24841800e #4468 Refactor setSelectedOrderItemQuantity to use
updater
2023-11-08 13:39:31 +01:00
Nino Righi
f60628c769 Merged PR 1677: #4467 Fix Display Price even if Price is 0
#4467 Fix Display Price even if Price is 0
2023-11-08 11:55:55 +00:00
Nino Righi
034f697da5 Merged PR 1676: #4462 Added focusSearchbox additionally on side nav click
#4462 Added focusSearchbox additionally on side nav click
2023-11-08 11:55:13 +00:00
Lorenz Hilpert
ec9f80767b Merge branch 'release/3.0' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/3.0 2023-11-08 11:05:32 +01:00
Lorenz Hilpert
a5e569cf05 #4451 #4463 Add name method to PickupShelfInService and
PickupShelfOutService
2023-11-08 11:04:58 +01:00
Nino Righi
b62259f9b4 Merged PR 1675: #4457 Fix Filter Routing on Close
#4457 Fix Filter Routing on Close
2023-11-08 09:42:24 +00:00
Nino Righi
95baeaa8a8 Merged PR 1674: #4462 Cursor Should Select Searchbox on Initial Navigation
#4462 Cursor Should Select Searchbox on Initial Navigation
2023-11-07 16:49:56 +00:00
Nino Righi
a5b9115a91 Merged PR 1673: #4459 Fix Reorder Modal handling after Closing Modal without changes
#4459 Fix Reorder Modal handling after Closing Modal without changes
2023-11-07 16:03:23 +00:00
Lorenz Hilpert
1885c58d86 #4464 Add setSelectedOrderItemQuantity method to update
selected order item quantity
2023-11-07 17:01:57 +01:00
Lorenz Hilpert
add55a47d6 Merge branches 'release/3.0' and 'release/3.0' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/3.0 2023-11-07 16:29:37 +01:00
Lorenz Hilpert
129f49a9ee #4461 Add sharedRegexRouterLinkActive directive to
side-menu component
2023-11-07 16:29:18 +01:00
Nino Righi
9560eb7ad6 Merged PR 1671: #4458 Fixed Process Naming
#4458 Fixed Process Naming
2023-11-07 15:09:18 +00:00
Nino Righi
772ba29a8e Merged PR 1672: #4457 Fixed routing after Filter close
#4457 Fixed routing after Filter close
2023-11-07 15:08:31 +00:00
Nino Righi
8ac8f6cc1f Merged PR 1670: #4459 Removed Side Outlet after REORDER completed
#4459 Removed Side Outlet after REORDER completed
2023-11-07 12:23:46 +00:00
Lorenz Hilpert
a0f496475c #4453 Add customerInfoDTO to createCustomerRoute 2023-11-06 15:21:36 +01:00
Lorenz Hilpert
8979a388ee #4454 Fix button placement and remove unnecessary
sorting in main actions selector
2023-11-06 14:27:08 +01:00
Lorenz Hilpert
8b9a209c49 #4450 Add RunCheckTrigger to
PickupShelfInDetailsComponent and
PickupShelfOutDetailsComponent
2023-11-06 14:07:27 +01:00
Lorenz Hilpert
f4c3e3ceee #4452 Reset selected compartment info in
PickupShelfDetailsBaseComponent
2023-11-06 13:55:40 +01:00
Lorenz Hilpert
5ca8a83f25 Merge branch 'release/3.0' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/3.0 2023-11-03 15:19:10 +01:00
Lorenz Hilpert
006011885f #4448 Add "Create new customer" link to search views 2023-11-03 15:18:50 +01:00
Nino Righi
9c9e061f6d Merged PR 1669: #4431 Adjusted Process Tab Logic for Customer Order Area
#4431 Adjusted Process Tab Logic for Customer Order Area
2023-11-03 09:13:10 +00:00
Lorenz Hilpert
c9782a7d29 Merge branch 'develop' into release/3.0 2023-10-30 09:42:49 +01:00
Nino Righi
59de82def8 Merged PR 1668: #4425 HSC Customer Orders Result List Refactor - Cache, Breadcrumb, Branch Dr...
#4425 HSC Customer Orders Result List Refactor - Cache, Breadcrumb, Branch Dropdown, Process and Scroll Position Fixes
2023-10-27 14:57:05 +00:00
Lorenz Hilpert
dc2617bb5d #4429 Refactor orderItems update in
PickupShelfDetailsStore
2023-10-27 15:14:28 +02:00
Lorenz Hilpert
d80e621563 #4424 Add filter functionality to
getOrderItemsByOrderNumberOrCompartmentCode method
2023-10-27 14:56:44 +02:00
Lorenz Hilpert
63c02e4605 #4424 Add orderItemSubsetId to order item details. 2023-10-27 11:57:42 +02:00
Lorenz Hilpert
3f93fe0869 #4423 Add download availability to shopping cart item 2023-10-27 10:51:44 +02:00
Lorenz Hilpert
9011f76e95 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-10-27 10:26:05 +02:00
Lorenz Hilpert
dd88e4ad3e Fix breadcrumb filter in side menu component 2023-10-27 10:25:48 +02:00
Nino Righi
a0869aa4a5 Merged PR 1667: #4421 Reset Filter When Navigate from Article Recommendations
#4421 Reset Filter When Navigate from Article Recommendations
2023-10-26 14:54:05 +00:00
Nino Righi
1107264d7c Merged PR 1665: #4417 Abholfach Listen Routing Breadcrumb
#4417 Abholfach Listen Routing Breadcrumb
2023-10-26 14:31:28 +00:00
Nino Righi
31512546d3 Merged PR 1666: #4420 Fix Customer Area Billing Addresses Added Margin
#4420 Fix Customer Area Billing Addresses Added Margin
2023-10-26 14:31:04 +00:00
Lorenz Hilpert
183e7b6945 Add orderItemSubsetId to
PickupShelfDetailsBaseComponent and remove
unnecessary RxJS operators
2023-10-26 16:28:42 +02:00
Nino
fba465d573 Merge branch 'develop' into release/3.0 2023-10-25 16:17:18 +02:00
Lorenz Hilpert
dd6784e3b3 #4396 Archive pickup shelf services 2023-10-25 15:01:07 +02:00
Lorenz Hilpert
9caa0fc0fa Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-10-25 13:44:03 +02:00
Lorenz Hilpert
1102fb4608 #4396 Add all_branches filter to PickupShelfInService
and PickupShelfOutService
2023-10-25 13:43:46 +02:00
Nino Righi
012cc6ac67 Merged PR 1664: #4411 Fix Routing after Applying Filter
#4411 Fix Routing after Applying Filter
2023-10-25 11:23:43 +00:00
Lorenz Hilpert
72de7efc1d #4410 Refactor checkout-summary.component.html layout 2023-10-25 12:34:13 +02:00
Lorenz Hilpert
b8c7bbec88 Revert "Merged PR 1659: #4396 Fix RD getOrderItems on Details page now with correct filter settings"
This reverts commit 9def487ab8.
2023-10-25 11:25:18 +02:00
Lorenz Hilpert
608513b6dc Merged PR 1662: #4405 Fix navigation and error handling in pickup shelf
Bitte noch nicht freigeben. Möchte im daily noch was klären

#4405 Fix navigation and error handling in pickup shelf
components
2023-10-25 09:21:10 +00:00
Nino Righi
fa78eca087 Merged PR 1663: #4408 Fix Side Nav Dropdown gets opened if route is Active
#4408 Fix Side Nav Dropdown gets opened if route is Active
2023-10-24 18:52:31 +00:00
Lorenz Hilpert
77fda0f939 #1989 Add message modal component for customer details
view.
2023-10-24 20:30:56 +02:00
Lorenz Hilpert
81d210a77b #4407 Refactor getLastActivatedCustomerProcessId$() to
filter processes by type 'cart' and handle
undefined lastCustomerProcess
2023-10-24 16:21:01 +02:00
Lorenz Hilpert
5ab4456040 Merge branch 'develop' into release/3.0 2023-10-24 14:21:59 +02:00
Nino Righi
2db45c900a Merged PR 1661: #4406 No Large increase of Global Font Size possible if on screen size tablet
#4406 No Large increase of Global Font Size possible if on screen size tablet
2023-10-24 11:55:13 +00:00
Nino Righi
705dc23908 Merged PR 1660: #4256 Fix HSC Kundenbestellungen Filter and Search History handling
#4256 Fix HSC Kundenbestellungen Filter and Search History handling
2023-10-24 08:22:26 +00:00
Nino Righi
9def487ab8 Merged PR 1659: #4396 Fix RD getOrderItems on Details page now with correct filter settings
#4396 Fix RD getOrderItems on Details page now with correct filter settings
2023-10-23 16:30:16 +00:00
Lorenz Hilpert
50e08f115a #4392 iPad - WA - langer Titel schiebt sich unter Status 2023-10-23 16:15:29 +02:00
Nino Righi
b15693a914 Merged PR 1657: #4403 Fix Abholfach Einbuchen Code Structure
#4403 Fix Abholfach Einbuchen Code Structure
2023-10-23 12:25:38 +00:00
Nino Righi
cbf23b6f30 Merged PR 1658: #4401 Fix Article Search Results Breadcrumb updates now correctly and fixed N...
#4401 Fix Article Search Results Breadcrumb updates now correctly and fixed Navigation after Applying Filter on all screen sizes
2023-10-23 12:25:08 +00:00
Nino
fc45efb4af Merge branch 'develop' into release/3.0 2023-10-20 16:25:57 +02:00
Nino
b4fbcd6d16 Remission Filter Button Styling, Filter Overlay Max Width Changed 2023-10-20 16:23:39 +02:00
Nino
c54e5c27ae #4396 Removed Filter All Branches on Pickup Shelf Result List Request 2023-10-20 15:52:49 +02:00
Nino
4b80765b26 Merge branch 'develop' into feature/4340-RD-Shell-Nav-Menue-Expand-Dropdown 2023-10-20 15:45:43 +02:00
Nino
d223e064c2 #4397 Fix RD Abholfach Zubuchen mit Zusatz 2023-10-20 15:43:49 +02:00
Nino
1f8d6c5898 #4340 Fix Open Dropdown on Init Side-Menu Component 2023-10-19 15:22:25 +02:00
Nino
66555e9c7e Merge branch 'develop' into feature/4340-RD-Shell-Nav-Menue-Expand-Dropdown 2023-10-19 14:58:25 +02:00
Nino
bb81b8f826 Merge branch 'develop' into release/3.0 2023-10-19 13:26:35 +02:00
Nino Righi
ecb5a77fdd Merged PR 1651: #4389 RD Added Pickup Shelf List In Item Loader and trackByGroupFn
#4389 RD Added Pickup Shelf List In Item Loader and trackByGroupFn
2023-10-19 11:24:58 +00:00
Nino Righi
6652c2f97e Merged PR 1650: #4391 Assign new CompartmentCode if action differs from "book in", otherwise...
#4391 Assign new CompartmentCode if action differs from "book in", otherwise use latestCompartmentCode
2023-10-19 08:51:22 +00:00
Nino Righi
e9f16f72cb Merged PR 1649: #4340 Expand Dropdown on Click if menu is on assigned Section
#4340 Expand Dropdown on Click if menu is on assigned Section
2023-10-19 08:19:28 +00:00
Nino Righi
a687b1771f Merged PR 1648: #4358 Improved implementation by using order$ as observable
#4358 Improved implementation by using order$ as observable
2023-10-19 08:18:56 +00:00
Nino
ec79e315e5 #4340 Expand Dropdown on Click if menu is on assigned Section 2023-10-18 15:52:41 +02:00
Nino Righi
af10e66b1a Merged PR 1647: #4310 Show Button always centered
#4310 Show Button always centered
2023-10-18 09:08:17 +00:00
Lorenz Hilpert
2d8a0f514d #4372 RD/ Scanbutton fehlt in Kundensuche 2023-10-18 11:07:06 +02:00
Lorenz Hilpert
02ade0a377 Skandit SDK Lizenz Update 2023-10-18 10:58:17 +02:00
Nino Righi
c2943037d9 Merged PR 1646: #4390 Customer Area, removed navigation cards
#4390 Customer Area, removed navigation cards
2023-10-17 16:10:18 +00:00
Nino Righi
c30d8fa5fd Merged PR 1645: #4374 #4358 Change EstimatedShippingDate, preferredPickUpDate and pickUpDeadl...
#4374 #4358 Change EstimatedShippingDate, preferredPickUpDate and pickUpDeadline on Shelf In and Out fixed
2023-10-17 14:49:50 +00:00
Nino Righi
4fd10bc8a4 Merged PR 1644: #4364 Check if Order is Kulturpass Order if no customer is available
#4364 Check if Order is Kulturpass Order if no customer is available
2023-10-17 13:46:23 +00:00
Lorenz Hilpert
1d25fec9ff #3025 RD // HSC+ Filiale- Automatische Bestellbestätigung per Mail 2023-10-17 15:41:49 +02:00
Nino Righi
6f77527d59 Merged PR 1643: #4382 Changed Layout inside Purchase Options Modal
#4382 Changed Layout inside Purchase Options Modal
2023-10-16 16:21:38 +00:00
Nino Righi
7a2cd5cef8 Merged PR 1642: #4360 Autocomplete Provider Implementation
#4360 Autocomplete Provider Implementation
2023-10-16 16:20:59 +00:00
Lorenz Hilpert
d1de4d96d8 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-10-16 18:20:45 +02:00
Lorenz Hilpert
dd1652c3a6 Logs entfernt 2023-10-16 18:20:30 +02:00
Lorenz Hilpert
66fd2eed81 #4355 Lieferadresse bearbeiten nicht möglich 2023-10-16 18:20:13 +02:00
Nino Righi
f5d90f97e8 Merged PR 1641: #4370 Only show compartment code if available, never display orderNumber
#4370 Only show compartment code if available, never display orderNumber
2023-10-16 15:39:46 +00:00
Nino Righi
ade3800568 Merged PR 1640: #4348 #4366 Multiple Bugfixes Shelf Edit with changing CompartmentInfo or CompartmentCode
#4348 #4366 Multiple Bugfixes Shelf Edit with changing CompartmentInfo or CompartmentCode
2023-10-16 15:38:48 +00:00
Lorenz Hilpert
486e2e5a28 Fix Build Error 2023-10-16 15:53:22 +02:00
Lorenz Hilpert
86d3b4e3f5 Merge branch 'develop' into release/3.0 2023-10-16 15:51:20 +02:00
Nino Righi
4d669731fb Merged PR 1639: #4376 Styling Fix
#4376 Styling Fix
2023-10-16 13:05:11 +00:00
Nino Righi
5bc81f7048 Merged PR 1638: #4368 Fix Navigation On Filter Close
#4368 Fix Navigation On Filter Close
2023-10-16 13:04:03 +00:00
Nino Righi
6cf6dec001 Merged PR 1636: #4370 Fix dont show compartment or orderNumber if item has processingStatus 1...
#4370 Fix dont show compartment or orderNumber if item has processingStatus 16 or 8192
2023-10-16 13:03:37 +00:00
Nino Righi
526d82752c Merged PR 1637: #4367 Fix Navigation to Shelf Out from Checkout Summary
#4367 Fix Navigation to Shelf Out from Checkout Summary
2023-10-16 07:48:06 +00:00
Nino Righi
7565b2bb54 Merged PR 1635: #4373 Changed Wording and Color of preferredPickUpDate in Checkout Summary
#4373 Changed Wording and Color of preferredPickUpDate in Checkout Summary
2023-10-16 07:45:28 +00:00
Nino Righi
692a32f4d7 Merged PR 1634: #4362 Scroll Position Handling, Bugfix between multiple open Shelf Out processes
#4362 Scroll Position Handling, Bugfix between multiple open Shelf Out processes
2023-10-16 07:44:55 +00:00
Lorenz Hilpert
4039ffdf20 #4365 Weitere Navigationen umgebaut 2023-10-12 16:25:09 +02:00
Lorenz Hilpert
cb39b3b79b #4365 RD // Abholfach - Alte Bestellpostensuche Seite ist erreichbar 2023-10-12 16:18:21 +02:00
Lorenz Hilpert
fe3dfd00ab #4354 Kundendaten erfassen // Rechnungs und Lieferadresse als Standard Adresse festlegen 2023-10-12 16:02:16 +02:00
Nino Righi
08a4b5a2ca Merged PR 1633: #4349 Unselect Items after handle action, update actions on list item
#4349 Unselect Items after handle action, update actions on list item
2023-10-12 13:23:12 +00:00
Lorenz Hilpert
e8a036b6df #4357 Warenausgabe - Trefferliste nachladen unendlich 2023-10-11 17:26:43 +02:00
Lorenz Hilpert
ff698ec6b2 #4345 Warenausgabe - Mehrere Artikel mit verschiedene Status werden zusammen gebunden 2023-10-11 16:40:41 +02:00
Lorenz Hilpert
8644ea515b Merge branch 'feature/splitscreen-pickup-shelf-design' into develop 2023-10-10 14:25:52 +02:00
Lorenz Hilpert
10a77c25e9 Zubuchen im Wareneingang Fix 2023-10-10 14:23:08 +02:00
Lorenz Hilpert
25d3adc28c Bugfix Navigation and Process Creation 2023-10-10 14:03:47 +02:00
Lorenz Hilpert
5cdbbb995f Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-10 12:05:20 +02:00
Lorenz Hilpert
01a26ef57a Console Logs removed 2023-10-10 12:05:06 +02:00
Lorenz Hilpert
3b337ea127 Cleanup Cache 2023-10-10 12:04:40 +02:00
Nino
c66ef5ba91 Trefferlisten Small Desktop Breakpoint, Eingebaut in Artikelsuche, Kundensuche, Warenausgabe, Einbuchen 2023-10-10 11:53:27 +02:00
Nino
b2edcf8a20 #4347 Fix Navigation on Edit Page from Shelf In and Out 2023-10-09 17:41:00 +02:00
Nino
06af33e37e Added compartmentInfo to every compartmentCode navigation 2023-10-09 17:14:26 +02:00
Nino
1a217d0870 Open New Process if navgation on customer area triggers 2023-10-09 16:01:31 +02:00
Nino
d6c52baf53 Navigation and Styling to Edit Pages 2023-10-09 15:15:23 +02:00
Lorenz Hilpert
f923fdefa4 #4344 Warenausgabe - Statusänderung via Bestellposten Details Seite wird nur nach Seiten Refresh angezeigt 2023-10-09 14:18:55 +02:00
Lorenz Hilpert
bd674a0e14 #4338 Warenausgabe - "Bearbeiten" bringt Fehler 2023-10-09 13:34:34 +02:00
Nino
bd3f8af924 Process Id Fix 2023-10-06 17:57:36 +02:00
Nino
5e720876ac Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-06 17:43:25 +02:00
Nino
8543db465b Cover Anzeige und Cover navigation 2023-10-06 17:43:06 +02:00
Lorenz Hilpert
ec4951d8dd #4343 Warenausgabe - Öffnen Bestellposten mit Abholfach-Zusatz navigiert zu leere Seite 2023-10-06 15:02:49 +02:00
Lorenz Hilpert
17f1846c69 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-06 14:15:54 +02:00
Lorenz Hilpert
6b71a544fe renamed selected into displayed for displaying items and added compartment info 2023-10-06 14:15:38 +02:00
Nino
7f1f097179 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-06 14:13:20 +02:00
Nino
a7003b84bf Removed Extends Base Component from Shelf In List 2023-10-06 14:12:59 +02:00
Nino
8a84e69ce3 Fix Pickup Shelf Details In 2023-10-06 14:10:57 +02:00
Lorenz Hilpert
3ebd50a8c1 #4341 Warenausgabe - Kacheln in Trefferliste sind rechts abgeschnitten 2023-10-06 13:43:08 +02:00
Nino
1f7a952c91 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-06 11:25:36 +02:00
Nino
560ef57915 Abholfach Details Selected Item and Filter Back Navigation to Details 2023-10-06 11:21:09 +02:00
Lorenz Hilpert
4fb81526ae Split Screen classes fuer e2e tests 2023-10-06 11:13:11 +02:00
Lorenz Hilpert
4bee8117ee #4342 Warenausgabe - Bearbeiten Seite beinhaltet komische Text 2023-10-06 10:25:01 +02:00
Nino
66991684d2 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-05 17:48:43 +02:00
Nino
06abcbff51 Update Pickup Shelf In Details 2023-10-05 17:48:19 +02:00
Nino
17197461f7 Update Domain Service Shelf In 2023-10-05 17:47:25 +02:00
Lorenz Hilpert
f036190019 Build Error Fix 2023-10-05 17:41:33 +02:00
Lorenz Hilpert
e68975b0f7 Load Cover Items - Implemented In Details Store 2023-10-05 17:26:12 +02:00
Lorenz Hilpert
692c1cb596 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-05 17:16:31 +02:00
Lorenz Hilpert
7ace3b7685 #4338 Warenausgabe - "Bearbeiten" bringt Fehler 2023-10-05 17:16:10 +02:00
Nino
6d6077c54f Added Cover Page and Updated Navigation Routes (added OrderItemSubsetId) 2023-10-05 17:14:23 +02:00
Nino
b60913de3c Shelf In Navigation Update on Shared Components 2023-10-05 15:27:07 +02:00
Nino
357b89f1ea Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-05 15:14:37 +02:00
Nino
c37b05d4b8 Pickup Shelf In List Select Items, Routing and Actions Update 2023-10-05 15:14:21 +02:00
Lorenz Hilpert
94fe011d49 #4337 Warenaugabe - Abholfachnummer wird lanksbündig angezeigt 2023-10-05 14:16:40 +02:00
Lorenz Hilpert
0e458e81d8 #4336 Warenausgabe - automatisches nachladen durch Scrollen 2023-10-05 14:12:15 +02:00
Lorenz Hilpert
efbdb134a9 Cleanup 2023-10-05 11:43:20 +02:00
Lorenz Hilpert
a97d87ed7b #4335 Fehler bei Öffnung einer Bestellung mit Status "eingetroffen" 2023-10-05 11:40:47 +02:00
Lorenz Hilpert
cb56cfcb00 #4332 Upgrade Bestellung ohne Konto" leitet zum Dashboard weiter 2023-10-05 10:58:36 +02:00
Nino
d13cf0ef8d Init PickUpShelfIn page, Navigation and SubPages 2023-10-04 18:06:28 +02:00
Nino
e6afd6887a Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-04 15:29:10 +02:00
Nino
7378b7db53 Removed many unnecessary history endpoint requests 2023-10-04 15:28:53 +02:00
Lorenz Hilpert
70f9bb0f73 Skip fetch while another request is being executed 2023-10-04 15:13:57 +02:00
Lorenz Hilpert
2fa7451716 Notification in Details laden und Fix Request lists 2023-10-04 14:29:03 +02:00
Lorenz Hilpert
871aeaed1f Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-04 13:20:42 +02:00
Lorenz Hilpert
09f0337489 Fetching OrderItemSubsetTasks 2023-10-04 13:19:26 +02:00
Nino
51f36de7dd Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-10-04 12:46:33 +02:00
Nino
0999e1ea51 Fetch Partial Bugfix, Breadcrumb Fix, Details Store Selectors Refactor 2023-10-04 12:45:52 +02:00
Lorenz Hilpert
d079b276cf Attribute für e2e 2023-10-04 10:42:48 +02:00
Nino
e1bd87418c Aufrufe geupdated, bugfixing 2023-10-02 18:10:53 +02:00
Nino
d06af28e11 Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-10-02 17:11:06 +02:00
Nino
c123a29b1d Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-10-02 17:08:01 +02:00
Nino
1398a3bdee Added more/less functionality and Added Nav Menu to Customer Area, Small Styling Adjustments 2023-10-02 17:07:43 +02:00
Lorenz Hilpert
340e866aed Funktion zum updaten der OrderItemSubsets 2023-10-02 16:26:24 +02:00
Nino
9338162906 Added Navigation After Actions on Detail Page 2023-10-02 16:03:50 +02:00
Nino
23d61bfa60 Navigation to History and Edit page, Implementation of Edit page, Centered Edit Page Action Buttons 2023-10-02 14:57:55 +02:00
Lorenz Hilpert
7409053cef #4330 Kundendaten // Upgrade Versandbestellung (oder gemischt)-Kundendatensatz wirft Fehler 2023-09-29 17:54:32 +02:00
Nino
0c372b0245 Updated Store and Base component implementation, Fixed Tags Component (also in Customer-Orders), Added new function declarations to implement, Added History and Edit Breadcrumb management 2023-09-29 16:58:16 +02:00
Lorenz Hilpert
dd68405522 #4331 Bestellung // Button "Bestellen" ist erst lange ausgegraut (wird aber nach eine Zeit klickbar) 2023-09-29 16:55:08 +02:00
Lorenz Hilpert
69e792ae41 Merge tag '4323-WBS-Fehlende-Wannenummer' into develop
4323-WBS-Fehlende-Wannenummer
2023-09-29 16:15:57 +02:00
Lorenz Hilpert
02b507aca9 Merge branch 'hotfix/4323-WBS-Fehlende-Wannenummer' 2023-09-29 16:10:57 +02:00
Lorenz Hilpert
05f94c65fc 4323 Remi // WBS ohne Wannennummer -> Fehlermeldung 2023-09-29 16:09:46 +02:00
Lorenz Hilpert
8b6ebd1820 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-09-29 11:08:16 +02:00
Lorenz Hilpert
45cb411e17 #4329 HSC - OLA im Warenkorb 2023-09-29 11:07:54 +02:00
Nino Righi
dec66de61d Merged PR 1632: #4322 Fix Checkout Summary If an Order has no items, dont display that Order
#4322 Fix Checkout Summary If an Order has no items, dont display that Order
2023-09-29 08:54:08 +00:00
Nino
e9a490d7f3 Details Page Completed Store hookup 2023-09-28 17:19:42 +02:00
Nino
280b28a474 Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-09-28 10:16:41 +02:00
Lorenz Hilpert
cfba5f34d4 #4317 AddressSelectionModalComponent - warning entfernt 2023-09-27 18:37:52 +02:00
Nino
582e2d988c Pickup Shelf Out Details Page 2023-09-27 18:16:44 +02:00
Lorenz Hilpert
4c627986d1 #4185 OLA im Warenkorb - spinner ersetzt 2023-09-27 18:01:01 +02:00
Nino
299dab43b9 Init Pickup Shelf Out Details Page and startet Header Implementation 2023-09-26 17:30:28 +02:00
Nino
ce0823a6fd Pickup Shelf Out List Actions Implementation 2023-09-26 17:02:30 +02:00
Nino
e0963e9b65 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-09-25 20:45:37 +02:00
Nino
a88552f975 List Styling Completed 2023-09-25 20:44:16 +02:00
Lorenz Hilpert
66a7bab287 Action Handler Impl 2023-09-25 19:04:37 +02:00
Lorenz Hilpert
088d9e1b6f Group Pipe von UiCommon in eigene Lib ausgelagert 2023-09-25 11:40:43 +02:00
Lorenz Hilpert
29619b2fec Paging Abholfach Store Fix 2023-09-22 17:05:52 +02:00
Nino
a5effc89a7 Merge branch 'feature/splitscreen-pickup-shelf-design' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into feature/splitscreen-pickup-shelf-design 2023-09-22 16:19:25 +02:00
Nino
e7fe2a2676 Update Result List Splitscreen 2023-09-22 16:17:33 +02:00
Lorenz Hilpert
53bb01db2d Fix Process Change 2023-09-22 15:05:59 +02:00
Nino
003d0cbcb2 Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-09-22 10:49:31 +02:00
Nino
a71c627a30 Pickup Shelf List Init 2023-09-22 10:45:15 +02:00
Lorenz Hilpert
261c851514 Caching und State Änderungen für Ausgewählte Items 2023-09-21 17:08:51 +02:00
Nino
58cfcba738 Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-09-21 16:39:25 +02:00
Nino Righi
50dac899c9 Merged PR 1631: #4304 Page Article Search Fixed Routing Bug After Searching Article with EAN...
#4304 Page Article Search Fixed Routing Bug After Searching Article with EAN inside Filter Page with Small Desktop Screen Size
2023-09-21 08:11:23 +00:00
Nino
9fe25f0f73 Added Loading Spinner and Searchbox Hint Message To Search Main and Filter View 2023-09-20 18:09:47 +02:00
Nino
678c961ea9 Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-09-20 17:32:39 +02:00
Lorenz Hilpert
f6b4633ac4 #4303 Kundensuche - kein Splittscreen 2023-09-20 14:45:53 +02:00
Lorenz Hilpert
0ecd2916a2 Caching Abholfach Liste 2023-09-20 14:29:57 +02:00
Lorenz Hilpert
e786b60bfc #4303 Kundensuche - kein Splittscreen 2023-09-20 10:29:31 +02:00
Nino
8c079e9064 Splitscreen Search Main Design 2023-09-19 17:51:32 +02:00
Nino
3b08fe438b Merge branch 'develop' into feature/splitscreen-pickup-shelf-design 2023-09-19 15:55:57 +02:00
Nino
fedbdcc35c Init Splitscreen Routing 2023-09-19 15:30:55 +02:00
Lorenz Hilpert
ac656ddc04 Breadcrumb fue abholfach 2023-09-19 15:23:28 +02:00
Nino Righi
85d8d75da8 Merged PR 1630: #4299 Take Price and priceMaintained from Catalog First
#4299 Take Price and priceMaintained from Catalog First
2023-09-19 12:20:54 +00:00
Nino
e6d389d848 Added Main Side View Component 2023-09-19 10:58:05 +02:00
Lorenz Hilpert
664053f231 Store for Detail Pages 2023-09-19 09:52:35 +02:00
Nino Righi
18b2230dd7 Merged PR 1629: #4301 RD Design Adjustments
#4301 RD Design Adjustments
2023-09-18 14:05:28 +00:00
Lorenz Hilpert
0876ed3acc Added Directive Shared Scroll Container 2023-09-18 15:48:33 +02:00
Lorenz Hilpert
7b4edbee8b Html Tag Fuer PickupShelfFilter Fix 2023-09-18 15:35:22 +02:00
Lorenz Hilpert
05ef1edfeb Wording Fix WE WA 2023-09-18 15:34:06 +02:00
Lorenz Hilpert
fb8db78bbd Breadcrumb Fix 2023-09-18 15:06:36 +02:00
Lorenz Hilpert
aecc4a477f Fix delayWhenFilterIsNotReady 2023-09-18 14:56:22 +02:00
Lorenz Hilpert
fd63ce8b3c Abholfach Infrastruktur - WE und WA 2023-09-18 14:23:16 +02:00
Nino Righi
423cd498cf Merged PR 1628: #4271 Added canAdd request for adding items to Kulturpass Cart Modal
#4271 Added canAdd request for adding items to Kulturpass Cart Modal
2023-09-18 08:42:26 +00:00
Nino Righi
b421c8b08c Merged PR 1627: #4298 Removed Add New Process Menu for Tablet
#4298 Removed Add New Process Menu for Tablet
2023-09-14 15:22:30 +00:00
Nino
4304286f48 Fix Show Filter Page on Tablet if Navigation To Filter Triggered from Result Page (Article Search and Customer Orders) 2023-09-14 16:23:50 +02:00
Nino Righi
df308c98ff Merged PR 1626: #4299 Hotfix Kulturpass Fallback if Delivery Availability Is Missing
#4299 Hotfix Kulturpass Fallback if Delivery Availability Is Missing
2023-09-14 14:02:44 +00:00
Lorenz Hilpert
1d1221e8c5 Navigation Fix Customer Guard ohne Prozess Id 2023-09-14 10:55:53 +02:00
Lorenz Hilpert
e2a6eac0a2 #4258 Abstände Breadcrumb 2023-09-13 18:43:30 +02:00
Lorenz Hilpert
4e54baf9fb Fix Customer Navigation 2023-09-13 18:38:35 +02:00
Lorenz Hilpert
7593e420de #4258 Abstände 2 2023-09-13 18:17:56 +02:00
Lorenz Hilpert
84ca80a1c9 #4258 Abstände 1 2023-09-13 18:17:43 +02:00
Lorenz Hilpert
7265f4d4ce Shell Navigation Kunden 2023-09-13 16:29:47 +02:00
Lorenz Hilpert
fca1eacc6e Bugfix Navigation Kunden und Prozesserstellung 2023-09-13 16:26:25 +02:00
Lorenz Hilpert
384c32dd1f Merge branch 'split-screen-demo' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into split-screen-demo 2023-09-13 13:22:40 +02:00
Lorenz Hilpert
983d075d5a Umbau Kundenbereich Split Screen 2023-09-13 13:21:53 +02:00
Nino
29ce32f3fe Shared Splitscreen Customer Orders Implementation 2023-09-12 17:48:27 +02:00
Nino
d9e67ec9be Shared Split Screen Checkout Implementation 2023-09-12 15:07:10 +02:00
Nino
a1e7ee2997 Routing Fix on Tablet 2023-09-11 18:20:19 +02:00
Nino
653ed1c1b2 Display Article Search Main and Filter correctly on Tablet 2023-09-11 18:12:20 +02:00
Nino
d7a3641fed Ean Search Bugfix 2023-09-11 16:53:43 +02:00
Nino
71cd95587d Finetuning, corrected naming and fixed breadcrumb bug 2023-09-11 14:53:37 +02:00
Nino
4ca12ba5c7 Merge branch 'develop' into split-screen-demo 2023-09-11 11:51:00 +02:00
Nino
bb189abe01 Side Outlet Clear directly after Navigation 2023-09-11 11:31:29 +02:00
Nino
f4e6d14a9c Product Search Routing Refactor, new Split Screen Router Logic, Clear Side Outlet 2023-09-08 16:31:30 +02:00
Nino Righi
a7f0522d57 Merged PR 1625: #4255 Fixed Publication Date Range Filter issues
#4255 Fixed Publication Date Range Filter issues
2023-09-06 16:09:59 +00:00
Nino Righi
cf38eef3b8 Merged PR 1624: #4272 Menu Items Alignment and Display Icons Correctly if Creating New Process in Tablet View
#4272 Menu Items Alignment and Display Icons Correctly if Creating New Process in Tablet View
2023-09-06 15:42:58 +00:00
Nino
104179a2e6 Created Shared Split Screen Component 2023-09-06 15:27:42 +02:00
Nino
4e2be8e397 Shell Top Bar and Shell Process Bar improved class naming for e2e page objects 2023-09-05 12:15:45 +02:00
Nino Righi
732b5a7fb1 Merged PR 1623: #4278 Fix Customer Order Removed Double Search Request and keep queryParams i...
#4278 Fix Customer Order Removed Double Search Request and keep queryParams in sync with filter settings
2023-09-04 16:29:45 +00:00
Nino Righi
0441401d9f Merged PR 1622: #4205 Article Search Details Search for Row Correctly and Split Links if ther...
#4205 Article Search Details Search for Row Correctly and Split Links if there is more than 1
2023-09-04 14:47:06 +00:00
Lorenz Hilpert
564afb7e32 Merged PR 1621: #4272 Menü zeigt Bestellungen, Kundenkarte und Details an
#4272 Menü zeigt Bestellungen, Kundenkarte und Details an
2023-09-04 13:17:47 +00:00
Nino Righi
5167ba21a6 Merged PR 1620: #4262 Fix HSC Selection Of Branch Dropdown Does Not Clear Main Searchbox Anymore
#4262 Fix HSC Selection Of Branch Dropdown Does Not Clear Main Searchbox Anymore
2023-09-01 14:44:40 +00:00
Lorenz Hilpert
b2319e8ea6 Split Screen Demo 2023-09-01 11:51:14 +02:00
Lorenz Hilpert
f8a2166967 #3968-Preisgebunden-Fix 2023-09-01 10:29:29 +02:00
Lorenz Hilpert
6a70d149db Merge branch 'feature/3968-Artikeldetails-Mehrwertsteuer-2' into develop 2023-08-31 14:31:50 +02:00
Lorenz Hilpert
306f5ed7f9 Merge devlop 2023-08-31 14:29:42 +02:00
Lorenz Hilpert
6a5d478e62 #4268 #4264 Warenkorb OLA 2023-08-30 17:51:01 +02:00
Lorenz Hilpert
b440ddbe82 Merge branch 'hotfix/4270-4269-Archiv-Artikel'
(cherry picked from commit f4df6e8799)
2023-08-30 14:38:54 +02:00
Lorenz Hilpert
6b8051f9df Merge tag '4270-4269-Archiv-Artikel' into develop
Merge Hotfix 4270-4269-Archiv-Artikel
2023-08-30 10:43:47 +02:00
Lorenz Hilpert
f4df6e8799 Merge branch 'hotfix/4270-4269-Archiv-Artikel' 2023-08-30 10:31:58 +02:00
Lorenz Hilpert
e9a63fd553 #4274 Kaufoption - Preis nicht übernommen 2023-08-29 11:31:58 +02:00
Nino Righi
a8535d5f3e Merged PR 1618: #4191 Removed First Item Activation on Autocomplete if only 1 Item is selectable
#4191 Removed First Item Activation on Autocomplete if only 1 Item is selectable
2023-08-28 15:06:45 +00:00
Lorenz Hilpert
23b77c7e48 #4269 Preis wird nicht von Shipping AVA übernommen 2023-08-28 17:01:20 +02:00
Nino
878bf44d0b #3968 Article Search Details display vat and if priceMaintained true 2023-08-28 16:51:52 +02:00
Lorenz Hilpert
8b6188a6b5 #4270 Kaufoptionen Bestellung via Mehrfachauswahl wirft Fehler 2023-08-28 14:39:37 +02:00
Lorenz Hilpert
822625a1c2 #4269 PDP Preisanzeige 2023-08-28 14:36:29 +02:00
Lorenz Hilpert
d6e0d92132 (cherry picked from commit d09b5b1ce7) 2023-08-24 20:18:19 +02:00
Lorenz Hilpert
da6489eb7a Merge tag '4266-Archivartikel' into develop
Hotfix 4266 Archivartikel Preisauswahl
2023-08-24 20:06:36 +02:00
Lorenz Hilpert
819827cc4c Merge branch 'hotfix/4266-Archivartikel' 2023-08-24 20:04:40 +02:00
Lorenz Hilpert
d09b5b1ce7 #4266 Archivartikel nach Preis-Eingabe Button ausgegraut 2023-08-24 20:03:59 +02:00
Lorenz Hilpert
cc03ef4f9c #4264 Fix Ola Refresh Calls 2023-08-24 12:58:53 +02:00
Lorenz Hilpert
b4dbd8889d Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-08-24 12:12:50 +02:00
Lorenz Hilpert
483faad86a #4264 - Bestellen-Button ausgegraut 2023-08-24 11:57:47 +02:00
Michael Auer
0dbc745ed0 Merge tag '2.3' into develop
# Conflicts:
#	apps/isa-app/src/app/shell/shell.component.html
2023-08-24 11:56:11 +02:00
Michael Auer
180e93a7da Merge branch 'release/2.3' 2023-08-24 11:50:39 +02:00
Lorenz Hilpert
5c6f416391 #4263 Versand - Fehler vor Kundensuche 2023-08-23 14:56:57 +02:00
Lorenz Hilpert
d97b6afac8 #4205 Reihensuche 2023-08-23 14:31:55 +02:00
Lorenz Hilpert
771816f3af #4185 OLA Warenkorb - 500 Fix 2023-08-22 13:47:22 +02:00
Lorenz Hilpert
0626538aea #4261 Fehler bei Artikel aus Liste in Warenkorb - Weiter Button War Nicht Aktiv 2023-08-21 15:33:35 +02:00
Lorenz Hilpert
a1ad4e4a05 #4261 Fehler bei Artikel aus Liste in Warenkorb 2023-08-21 15:12:22 +02:00
Lorenz Hilpert
6df48eb555 #4255 Neue Filteroption - Erscheinungsdatum 2023-08-21 14:18:40 +02:00
Lorenz Hilpert
27ab4526e2 Logs entfernt und kleinere Änderungen rückgängig gemacht 2023-08-18 12:48:09 +02:00
Lorenz Hilpert
9a24b34fbc #4255 Verbesserung des Datumsinputs 2023-08-18 12:45:27 +02:00
Lorenz Hilpert
d01e01534b #4185 Bugfix - Bestellabschluss 2023-08-17 17:01:33 +02:00
Lorenz Hilpert
5bca1f2a81 Bugfix - zu viele aurufe bei ola 2023-08-16 15:26:08 +02:00
Lorenz Hilpert
807b300885 #4185 OLA im Warenkorb 2023-08-16 14:54:14 +02:00
Lorenz Hilpert
b16ffa4352 Merge branch 'develop' into release/3.0 2023-08-11 15:34:45 +02:00
Lorenz Hilpert
da79d04ef4 Bugfix Erscheinungsdatum 2023-08-11 15:34:09 +02:00
Lorenz Hilpert
cf619df576 Merge branch 'release/3.0' into develop 2023-08-11 10:29:47 +02:00
Lorenz Hilpert
8054c96315 #3376 Erscheinungstermin Filter Option Mit Input Box 2023-08-11 10:28:14 +02:00
Nino Righi
2363f424f5 Merged PR 1617: #3360 Show Branch Tooltip
#3360 Show Branch Tooltip
2023-08-11 08:11:16 +00:00
Lorenz Hilpert
6ab1ea2e70 #4254 Bestellungen ohne Konto werden nicht als Kunde erkannt 2023-08-10 14:03:18 +02:00
Lorenz Hilpert
c9ce7d6762 #4253 Kundensuche - Typo 2023-08-09 17:53:58 +02:00
Lorenz Hilpert
6ee1b0a7f8 #4250 Vorgänge zählen nicht hoch 2023-08-09 16:50:54 +02:00
Lorenz Hilpert
d881920312 Merge branch 'develop' into release/3.0 2023-08-07 07:07:36 +02:00
Lorenz Hilpert
516465db37 #4246 UI Searchbox Hint Erneut anzeigen
(cherry picked from commit 9671683a93)
2023-08-06 05:11:40 +02:00
Lorenz Hilpert
08e95cec55 #4245 Wannernummer-Prüfung - Leerzeichen entfernen
(cherry picked from commit 15c50779b4)
2023-08-06 05:10:46 +02:00
Lorenz Hilpert
9671683a93 #4246 UI Searchbox Hint Erneut anzeigen 2023-08-04 15:56:51 +02:00
Lorenz Hilpert
d909d6e804 #4236 Kulturpass - Artikel ohne Preisbindung erhalten günstigeren Preis
(cherry picked from commit 1d865c47d7)
2023-08-03 17:06:46 +02:00
Lorenz Hilpert
15c50779b4 #4245 Wannernummer-Prüfung - Leerzeichen entfernen 2023-08-03 17:05:45 +02:00
Lorenz Hilpert
1d865c47d7 #4236 Kulturpass - Artikel ohne Preisbindung erhalten günstigeren Preis 2023-08-03 13:57:09 +02:00
Nino
7afd476ac7 Workaround Outlet Navigation 2023-08-02 18:01:58 +02:00
Lorenz Hilpert
37b1e42c64 Angular update 16 - cleanup - customer 2023-08-02 12:14:47 +02:00
Lorenz Hilpert
5bdfec7c3f #4222 Packstückprüfung aktiviert 2023-08-02 10:55:54 +02:00
Lorenz Hilpert
2bddc3c621 Angular update 16 2023-08-01 18:18:02 +02:00
Nino Righi
6b0beba1d9 Merged PR 1616: #3378 SSC Sync PDP and Search Result List
#3378 SSC Sync PDP and Search Result List
2023-08-01 16:16:57 +00:00
Lorenz Hilpert
33904e9d26 Update Angular Packages 2023-08-01 16:18:04 +02:00
Lorenz Hilpert
8aafee672e #4244 Kundenkarten-Ansicht wirf Fehler 2023-08-01 15:21:12 +02:00
Lorenz Hilpert
9d886cd33f Merge branch 'develop' into release/3.0 2023-07-31 18:31:30 +02:00
Nino Righi
95d1ea3530 Merged PR 1615: #4235 Fix Scroll Position Customer Orders
#4235 Fix Scroll Position Customer Orders
2023-07-31 14:19:53 +00:00
Lorenz Hilpert
d3014e7e9a #4243 kein Kundenkarten-Checkbox fuer HSC 2023-07-31 15:09:59 +02:00
Lorenz Hilpert
da143c3412 #4241 Seite Bestellungen von Kundendetails wird nach einige Sekunden zu Kunden Trefferliste navigiert 2023-07-31 14:36:51 +02:00
Nino Righi
b10a7a923e Merged PR 1613: #4240 Bestellbestätigung Fix Leere Kachel
#4240 Bestellbestätigung Fix Leere Kachel
2023-07-31 11:45:23 +00:00
Nino Righi
08601203df Merged PR 1614: #4238 Removed QueryChangeDebounce
#4238 Removed QueryChangeDebounce
2023-07-31 11:44:54 +00:00
Lorenz Hilpert
526ba9f2a0 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-07-28 18:06:45 +02:00
Lorenz Hilpert
f1fc1d17a5 Message bei leerer suche 2023-07-28 18:06:15 +02:00
Nino Righi
6e07c86eed Merged PR 1612: #4228 Gruppierung Bestellbestätigung Abholung und Rücklage
#4228 Gruppierung Bestellbestätigung Abholung und Rücklage
2023-07-28 16:03:14 +00:00
Lorenz Hilpert
14199391e0 #4239 Bereich Kundenkarte hat kein Schließ-Button 2023-07-28 17:33:07 +02:00
Nino
bb834f6274 #4224 Fix Kundenbestellungen Trefferliste Splitscreen Breite der Kachel bzgl der Kundennummer angepasst 2023-07-28 16:43:22 +02:00
Nino Righi
8688935f25 Merged PR 1611: #4233 Fix branch$ should always atleast return defaultBranch if available
#4233 Fix branch$ should always atleast return defaultBranch if available
2023-07-28 14:22:14 +00:00
Lorenz Hilpert
1b7d257e97 #4172 Console.log entfernt 2023-07-28 15:49:37 +02:00
Lorenz Hilpert
fff4b222cb #4172 Keine Suchergebnisse text bei der Ergebnisliste 2023-07-28 15:48:55 +02:00
Lorenz Hilpert
c63dee8509 Merge branch 'release/2.3' into develop 2023-07-28 14:51:41 +02:00
Lorenz Hilpert
810653c4d1 #4194 Icons DR und PP hinzugefügt 2023-07-28 14:50:44 +02:00
Nino Righi
607bc320fb Merged PR 1609: #3395 Bestellbestätigung Verlinkungen und Wording
#3395 Bestellbestätigung Verlinkungen und Wording
2023-07-28 12:26:49 +00:00
Nino Righi
72393ebca5 Merged PR 1610: #4224 Fix Customer Orders Result List Card Size
#4224 Fix Customer Orders Result List Card Size
2023-07-28 12:26:20 +00:00
Lorenz Hilpert
ecef17846b #4226 #4234 Bei Einstieg in Kundensuche wird suche mit Default Filter getriggert 2023-07-28 14:10:00 +02:00
Lorenz Hilpert
45265eedd4 #4230 Keine Kachel in Trefferliste wenn ein Bestellung ohne Konto-Datensatz angelegt wird 2023-07-28 13:34:32 +02:00
Nino Righi
04da34e677 Merged PR 1608: #4233 Fix Article Search Details Fetching Branch correctly
#4233 Fix Article Search Details Fetching Branch correctly
2023-07-27 16:29:43 +00:00
Lorenz Hilpert
1e504d9e0c Merge branch 'release/3.0' into develop 2023-07-27 17:51:51 +02:00
Lorenz Hilpert
75528d37d3 #4232 Preisanzeige bei Versanbestellung
(cherry picked from commit eddff0d93f)
2023-07-27 17:51:29 +02:00
Lorenz Hilpert
eddff0d93f #4232 Preisanzeige bei Versanbestellung 2023-07-27 17:50:09 +02:00
Lorenz Hilpert
f4579ef8dc #4229 Styling und Filter Anpoassung für Kundenbereich 2023-07-27 14:01:06 +02:00
Lorenz Hilpert
fc5496fda6 #4229 Fix ScrollPosition 2023-07-27 13:32:27 +02:00
Lorenz Hilpert
5cf6f4da38 Merged PR 1607: #4148 Suche nach Versandbestellung mit Order Id
#4148 Suche nach Versandbestellung mit Order Id
2023-07-26 15:32:18 +00:00
Lorenz Hilpert
60fde8b103 #4194 Artikel Format Icon wird falsch angezeigt 2023-07-26 17:20:32 +02:00
Lorenz Hilpert
734fe33f40 #4226 Am Ende der Trefferliste fehlt den Link zum Kundendaten erfassen 2023-07-26 16:54:25 +02:00
Nino Righi
64da928c36 Merged PR 1606: #4172 Kundensuche "Keine Suchergebnisse"
#4172 Kundensuche "Keine Suchergebnisse"
2023-07-26 14:29:41 +00:00
Nino
dba0b1b3c7 Customer Orders Breadcrumb Fix, Styling Fix Result List, Adjusted Position of Address Info correctly 2023-07-26 15:53:01 +02:00
Nino Righi
073746a9bc Merged PR 1605: #4220 Responsive Design Customer Orders Search History
#4220 Responsive Design Customer Orders Search History
2023-07-26 11:58:00 +00:00
Lorenz Hilpert
45c14e3b79 Toaster ueber console erstellen und schließen 2023-07-25 16:49:22 +02:00
Nino Righi
7023fe747b Merged PR 1604: #4219 RD Customer Orders Result List Display OrderNumber at item and BuyerNum...
#4219 RD Customer Orders Result List Display OrderNumber at item and BuyerNumber at customer name
2023-07-25 12:58:24 +00:00
Lorenz Hilpert
141c7fe1d6 #4221 Scanner - Adapter sind nicht bereit
(cherry picked from commit 78e76818b5)
(cherry picked from commit 44b406fad4)
2023-07-25 14:57:40 +02:00
Lorenz Hilpert
44b406fad4 #4221 Scanner - Adapter sind nicht bereit
(cherry picked from commit 78e76818b5)
2023-07-25 14:57:09 +02:00
Lorenz Hilpert
78e76818b5 #4221 Scanner - Adapter sind nicht bereit 2023-07-25 14:52:18 +02:00
Lorenz Hilpert
f78a773fab Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-07-25 14:19:07 +02:00
Nino Righi
60d007d9eb Merged PR 1603: #3394 #3395 #4218 Responsive Design Checkout Summary
#3394 #3395 #4218 Responsive Design Checkout Summary
2023-07-25 12:18:35 +00:00
Lorenz Hilpert
1ec253333e Close Button - Text gege Icon getsuscht 2023-07-25 14:18:18 +02:00
Nino Righi
bd332b6bd9 Merged PR 1602: #4215 #4137 Alle Filter Entfernen in Kundensuche eingebaut, Alle Filter entfernen entfernt die Query nicht mehr
#4215 #4137 Alle Filter Entfernen in Kundensuche eingebaut, Alle Filter entfernen entfernt die Query nicht mehr
2023-07-24 16:20:20 +00:00
Lorenz Hilpert
bc9bdbebe3 #3860 Toaster - Platzierung 2023-07-24 18:18:49 +02:00
Lorenz Hilpert
0b471cc5bc Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-07-24 11:26:55 +02:00
Lorenz Hilpert
c2eed61b83 #4213 Trefferlsite leer - scroll index fix 2023-07-24 11:26:41 +02:00
Lorenz Hilpert
2d403b4c56 Merge branch 'release/3.0' into develop 2023-07-24 01:13:27 +02:00
Lorenz Hilpert
b3e4ca90ee Merge branch 'release/2.3' into develop 2023-07-24 01:12:38 +02:00
Nino Righi
d4a3a4bc06 Merged PR 1601: #4141 Disable Filter Anwenden CTA if no filter is selected or no query available
#4141 Disable Filter Anwenden CTA if no filter is selected or no query available
2023-07-21 13:59:01 +00:00
Lorenz Hilpert
b674b5faf6 #4216 Header - Schriftgröße über Header anpassen 2023-07-21 15:40:45 +02:00
Lorenz Hilpert
8416028113 (cherry picked from commit edb21308d4) 2023-07-21 10:52:21 +02:00
Lorenz Hilpert
edb21308d4 #4194 Remission - Artikel Format Icon wird falsch angezeigt 2023-07-21 10:50:57 +02:00
Lorenz Hilpert
26ad0153d8 #4214 Trefferliste Kunden IPad 2023-07-21 10:26:42 +02:00
Nino Righi
e9b2acca5b Merged PR 1600: #4172 #4200 Artikelsuche und Kundenbestellungen Navigation Trefferliste und Anzeige Suchbox Hint
#4172 #4200 Artikelsuche und Kundenbestellungen Navigation Trefferliste und Anzeige Suchbox Hint
2023-07-21 08:15:57 +00:00
Nino Righi
4180ee61d6 Merged PR 1598: #3922 Kundenbestellungen Bugfixes, Filter angepasst, Breadcrumb bugfix
#3922 Kundenbestellungen Bugfixes, Filter angepasst, Breadcrumb bugfix
2023-07-21 07:40:03 +00:00
Lorenz Hilpert
a442a50708 Update Test 2023-07-20 15:59:52 +02:00
Lorenz Hilpert
59e650a1f1 #4201 Bearbeitung von Bestellung ohne Konto deaktiviert 2023-07-20 14:21:14 +02:00
Lorenz Hilpert
69b6470cda Revert "#4209 - FIX - KulturPass-Einlösecode lässt Abholfrist ändern"
This reverts commit 02d60e9bd5.
2023-07-20 13:57:31 +02:00
Lorenz Hilpert
44b33c1e4c Revert "#4209 - FIX - KulturPass-Einlösecode lässt Abholfrist ändern"
This reverts commit 02d60e9bd5.
2023-07-20 13:56:08 +02:00
Lorenz Hilpert
08f00c6578 Update CheckForUpdate interval - 15 min 2023-07-20 11:49:44 +02:00
Lorenz Hilpert
51c4066222 (cherry picked from commit 6fb72e4b2f) 2023-07-20 11:46:13 +02:00
Lorenz Hilpert
6fb72e4b2f #4121 Vormerker kann nicht manuell bearbeitet werden 2023-07-20 11:42:41 +02:00
Lorenz Hilpert
c9fbbd78a8 #4213 FIX - Kundensuche Trefferliste verschwindet nach Tab wechseln 2023-07-20 10:07:22 +02:00
Nino Righi
ce5388be61 Merged PR 1599: #4206 Checkout Cart display notification channels if buyer or payer is available
#4206 Checkout Cart display notification channels if buyer or payer is available
2023-07-19 16:59:52 +00:00
Lorenz Hilpert
02d60e9bd5 #4209 - FIX - KulturPass-Einlösecode lässt Abholfrist ändern
(cherry picked from commit fce50daff6)
2023-07-19 18:42:27 +02:00
Lorenz Hilpert
fce50daff6 #4209 - FIX - KulturPass-Einlösecode lässt Abholfrist ändern 2023-07-19 18:41:06 +02:00
Lorenz Hilpert
35b7f5700f #4211 Kaufoptionen popup - Prüfung ob Artikel mit Kunden kombinierbar ist
(cherry picked from commit ddd5d50c5d)
2023-07-19 17:46:52 +02:00
Lorenz Hilpert
b954947bb7 Merge branch 'release/2.3' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/2.3 2023-07-19 17:45:36 +02:00
Lorenz Hilpert
ddd5d50c5d #4211 Kaufoptionen popup - Prüfung ob Artikel mit Kunden kombinierbar ist 2023-07-19 17:45:17 +02:00
Lorenz Hilpert
efec7ecb26 #4210 Änderungen werden nicht sofort angezeigt 2023-07-19 17:25:22 +02:00
Lorenz Hilpert
ee81f795fe Removed Deprecated unit tests 2023-07-19 15:14:54 +02:00
Lorenz Hilpert
ad557ff919 #4193 Bestellpostensuche Seite nicht erreichbar 2023-07-19 15:06:00 +02:00
Lorenz Hilpert
bf5fae08b2 #4203 Scrollposition auf Kundentrefferliste wird nicht gespeichert 2023-07-19 14:36:18 +02:00
Lorenz Hilpert
88321928bf #4201 Bestellung ohne Konto können Kundendaten nicht bearbeiten 2023-07-19 11:33:13 +02:00
Lorenz Hilpert
a7d50a9439 #4196 Rechnungs- und Lieferadresse ändern bei eine Bestellung für Versand führt zu Dashboard Seite 2023-07-18 16:35:27 +02:00
Lorenz Hilpert
4c6dcd15da #4198 In Kundenkarten Konto Formular der Text geht über den Rand hinaus 2023-07-18 16:27:42 +02:00
Lorenz Hilpert
84f9d14be0 #4199 Warnmeldung bei Geburtsdatumeingabe 2023-07-18 15:25:05 +02:00
Lorenz Hilpert
e2f173f250 #4201 Kunden Detail Seite des Onlinekontos - nicht bearbeitbar 2023-07-18 14:33:22 +02:00
Lorenz Hilpert
fdd9617604 #4202 Kundendetails Bearbeiten Seite von Business Konto 2023-07-18 14:25:49 +02:00
Lorenz Hilpert
bc3cedfe50 #4204 Ladekreis in Kundensuche Suchfeld verschwindet nicht 2023-07-18 14:09:04 +02:00
Lorenz Hilpert
78f9093931 Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-07-18 13:22:59 +02:00
Lorenz Hilpert
a889c768d1 #3761 Bestellposten Design 2023-07-18 13:22:22 +02:00
Nino Righi
e36319a73e Merged PR 1596: #4179 Fix Process Bar Scroll to Active Process
#4179 Fix Process Bar Scroll to Active Process
2023-07-18 11:14:59 +00:00
Nino Righi
199ae95bcd Merged PR 1597: #4186 Fix Price Update and Article Search Result List selected Select Bullet...
#4186 Fix Price Update and Article Search Result List selected Select Bullet handling improved
2023-07-18 08:22:05 +00:00
Lorenz Hilpert
30875f0491 #4195 Anzeige der Hauptseite der Kundensuche angepasst - IPad 2023-07-17 15:16:44 +02:00
Lorenz Hilpert
95d9d17aa7 Merge branch 'release/2.3' into develop 2023-07-17 01:31:46 +02:00
Lorenz Hilpert
215d7ca341 Benachrichtigung für Packstückprüfung einblenden 2023-07-17 01:31:17 +02:00
Lorenz Hilpert
1255df10e0 Benachrichtigungen für Packstückprüfung ausblenden 2023-07-17 01:30:40 +02:00
Nino Righi
4c641adeda Merged PR 1595: #4189 Dont Display Customer Name if Shipping Address is Available
#4189 Dont Display Customer Name if Shipping Address is Available
2023-07-14 15:17:51 +00:00
Lorenz Hilpert
4bd4158dab select inputs können gecleart werden 2023-07-14 17:14:44 +02:00
Nino
4965976f6c Merge branch 'develop' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into develop 2023-07-14 16:59:36 +02:00
Nino
b43f512887 Responsive Design Container Height, Splitscreen Tailwind changes to Page Catalog, Customer-Orders, Checkout - Small Styling bugfixes 2023-07-14 16:59:15 +02:00
Lorenz Hilpert
e6f2b46fce Navigation nach Kundenanlage 2023-07-14 16:30:18 +02:00
Lorenz Hilpert
01c84b361a Kundenbereich Div Size 2023-07-14 15:47:19 +02:00
Lorenz Hilpert
ac35cc237e Leere Notifications nicht anzeigen 2023-07-14 14:50:08 +02:00
Lorenz Hilpert
28ad07b372 Filter Searchbox - Tablet - Desktop 2023-07-14 14:42:39 +02:00
Lorenz Hilpert
6ade77d458 Tailwindcss anpassung splitscreen werte 2023-07-14 14:41:18 +02:00
Lorenz Hilpert
4187e13861 Merge branch 'release/2.3' into develop 2023-07-14 13:25:05 +02:00
Lorenz Hilpert
4fe5034e1c #3666 Design Anpassung 2023-07-14 13:12:48 +02:00
Lorenz Hilpert
729451fa48 Kundennavigation angepasst 2023-07-14 12:19:03 +02:00
Lorenz Hilpert
d77fe8c540 Kundenbereich Nachname Vorname 2023-07-14 12:05:21 +02:00
Lorenz Hilpert
a257ddd8e0 Dev Scanner Entfernt 2023-07-14 11:14:19 +02:00
Lorenz Hilpert
90154bd497 desktop_ zu desktop-large_ geändert, searchprovider für kundensuche angepasst 2023-07-14 10:54:57 +02:00
Lorenz Hilpert
f96224569f Autocomplete Provider für Kundensuche 2023-07-14 03:51:31 +02:00
Lorenz Hilpert
1c695104f9 click event auf Weiter zum Warenkorb 2023-07-14 03:40:47 +02:00
Lorenz Hilpert
ab9a35dd89 Merge branch 'feature/rd-customer' into develop 2023-07-14 03:27:46 +02:00
Lorenz Hilpert
6daa96119d Filter Buttons und Navigation 2023-07-14 03:27:17 +02:00
Lorenz Hilpert
128a280dee Constants and Icon Update 2023-07-14 03:03:45 +02:00
Lorenz Hilpert
475c885344 Kundenlabels und Icons 2023-07-14 01:00:00 +02:00
Lorenz Hilpert
ee62649bf6 Positonierung Button in Details ansicht und Suche Optimiert 2023-07-14 00:29:32 +02:00
Lorenz Hilpert
109999d66f Performance und caching in Kundensuche angepasst 2023-07-13 23:32:50 +02:00
Lorenz Hilpert
9ec34b07c4 Ladeanimation beim laden der Bestellungen 2023-07-13 22:59:29 +02:00
Lorenz Hilpert
2fd2d701dd Merge branch 'feature/rd-customer' into develop 2023-07-13 19:09:53 +02:00
Lorenz Hilpert
5574252b5b Merge branch 'develop' into release/3.0 2023-07-13 19:09:05 +02:00
Lorenz Hilpert
5e79d4dc52 Merge branch 'release/3.0' into develop 2023-07-13 19:08:47 +02:00
Nino Righi
bb91782079 Merged PR 1594: #4176 Fix Order Deadline inside Purchasing Options
#4176 Fix Order Deadline inside Purchasing Options
2023-07-13 17:07:20 +00:00
Nino Righi
2bbcb15740 Merged PR 1593: #4189 Warenkorb Anzeige Änderungen
#4189 Warenkorb Anzeige Änderungen
2023-07-13 17:06:59 +00:00
Lorenz Hilpert
216d302a86 Zuweisung Kunden zum Warenkorb 2023-07-13 19:06:28 +02:00
Nino Righi
e18b9a4200 Merged PR 1592: #3730 Article Search Results Order By Adjustments
#3730 Article Search Results Order By Adjustments
2023-07-13 15:23:42 +00:00
Nino Righi
310395d166 Merged PR 1591: #4184 Fix Article Search Results Remember Scroll Position Correctly
#4184 Fix Article Search Results Remember Scroll Position Correctly
2023-07-13 15:23:24 +00:00
Nino Righi
651f44914f Merged PR 1590: #4187 RD Cart Delivery Address and Wording Change
#4187 RD Cart Delivery Address and Wording Change
2023-07-13 14:55:41 +00:00
Lorenz Hilpert
4a97800a05 Update Navigation p4m 2023-07-13 13:47:11 +02:00
Lorenz Hilpert
f2e124903c Merge branch 'release/2.3' into develop 2023-07-13 12:08:38 +02:00
Nino Righi
eec1cb5666 Merged PR 1589: #4180 Hotfix Mehrfachauswahl Für Download Artikel direkt Logistician setzen
#4180 Hotfix Mehrfachauswahl Für Download Artikel direkt Logistician setzen
2023-07-13 08:05:16 +00:00
Nino Righi
cb7334d63b Merged PR 1588: #4140 Fix Article Search Results Set Default Max Buffer Size for Scrollcontainer
#4140 Fix Article Search Results Set Default Max Buffer Size for Scrollcontainer
2023-07-13 08:03:59 +00:00
Lorenz Hilpert
b62e6e8e35 #3666 Benachrichtigung über die Glocke 2023-07-12 17:57:31 +02:00
Lorenz Hilpert
f98aac5231 Navigations Kundenbereich RD 2023-07-12 15:05:42 +02:00
Lorenz Hilpert
9c4e94ce8d Kundenkarte Customer RD 2023-07-11 21:13:51 +02:00
Lorenz Hilpert
65a19feffc Merge branch 'develop' into feature/rd-customer 2023-07-11 19:32:21 +02:00
Nino Righi
62a1be7abe Merged PR 1587: #4177 RD Purchasing Order Modal Fix Guest Customer without Account cannot ord...
#4177 RD Purchasing Order Modal Fix Guest Customer without Account cannot order via delivery option
2023-07-11 16:54:22 +00:00
Nino Righi
ad4481cfc7 Merged PR 1586: #4183 RD Cart Fix display of data from previous order
#4183 RD Cart Fix display of data from previous order
2023-07-11 16:53:53 +00:00
Nino Righi
e4c20b953d Merged PR 1585: #4169 #4170 #4140 #4182 Artikelsuche - Routing Navigation and Scrolling Bugfixes
#4169 #4170 #4140 #4182 Artikelsuche - Routing Navigation and Scrolling Bugfixes
2023-07-11 16:52:11 +00:00
Lorenz Hilpert
e8044fae1b Kundenbestellungen Seite 2023-07-11 18:50:26 +02:00
Nino Righi
b845147050 Merged PR 1584: #4180 Hotfix Add Logistician to Download Destination
#4180 Hotfix Add Logistician to Download Destination
2023-07-11 11:45:10 +00:00
Nino Righi
c4818319aa Merged PR 1580: #4174 Fix Goods Out and Customer Orders Caching and display items based on pr...
#4174 Fix Goods Out and Customer Orders Caching and display items based on process correctly
2023-07-11 11:14:23 +00:00
Michael Auer
6bc265a358 Merge branch 'release/2.3' 2023-07-11 12:20:14 +02:00
Nino Righi
8cb25d6ca1 Merged PR 1581: #4176 Order Deadline Responsive Design
#4176 Order Deadline Responsive Design
2023-07-11 08:05:44 +00:00
Nino Righi
5a14e0afbd Merged PR 1582: #4178 Changed search history results from 5 to 7 and made container scrollable
#4178 Changed search history results from 5 to 7 and made container scrollable
2023-07-11 08:03:48 +00:00
Nino Righi
0804eeeccb Merged PR 1583: #4175 Warenkorb Notification und Navigation bugfix
#4175 Warenkorb Notification und Navigation bugfix
2023-07-11 08:03:12 +00:00
Lorenz Hilpert
f015169011 Paging Kundensuche 2023-07-10 13:33:43 +02:00
Lorenz Hilpert
201ea2ee9c ANlage und bearbeiten von Adressen 2023-07-10 11:42:28 +02:00
Nino Righi
961211e638 Merged PR 1579: #4171 RD Added Fallbacks to Navigation Services if all arguments are undefined
#4171 RD Added Fallbacks to Navigation Services if all arguments are undefined
2023-07-10 09:04:51 +00:00
Nino Righi
22a494e31e Merged PR 1578: #4162 RD Customer Orders Edit Styling Fixes
#4162 RD Customer Orders Edit Styling Fixes
2023-07-10 09:01:59 +00:00
Nino Righi
75e24771b3 Merged PR 1577: #4168 Fix PDP Recommendations Routing
#4168 Fix PDP Recommendations Routing
2023-07-07 14:07:39 +00:00
Lorenz Hilpert
97b30d5b14 Merge branch 'release/2.3' into develop 2023-07-06 17:14:00 +02:00
Lorenz Hilpert
ca5dbb9d6f Merge branch 'develop' into release/3.0 2023-07-06 16:58:04 +02:00
Nino Righi
e065c1a8da Merged PR 1576: #4095 #4159 Responsive Design PDP Styling fix and implemented Page Scrolling
#4095 #4159 Responsive Design PDP Styling fix and implemented Page Scrolling
2023-07-06 14:57:09 +00:00
Nino Righi
fc76f34d38 Merged PR 1575: #3399 #3398 #3397 Responsive Design Checkout Cart Review
#3399 #3398 #3397 Responsive Design Checkout Cart Review
2023-07-06 14:53:39 +00:00
Nino Righi
98e963d782 Merged PR 1574: #4160 Hotfix Preselect InStore PurchasingOption Tile
#4160 Hotfix Preselect InStore PurchasingOption Tile
2023-07-06 14:34:42 +00:00
Lorenz Hilpert
27e5afacde Merge branch 'develop' into release/3.0 2023-07-06 16:33:14 +02:00
Lorenz Hilpert
8a4fe7aedd Merge branch 'release/2.3' into develop 2023-07-06 16:32:12 +02:00
Lorenz Hilpert
90268b4ec1 #4165 console log entfernt 2023-07-06 16:30:32 +02:00
Lorenz Hilpert
034693df98 #4165 Performance Fix 2023-07-06 16:30:02 +02:00
Lorenz Hilpert
5b31661f8d Fix Kulturpass in der Warenaugabe und Eingang - Datum nicht bearbeitbar 2023-07-06 13:47:30 +02:00
Lorenz Hilpert
ba01807add Merge branch 'develop' into release/3.0 2023-07-05 22:06:55 +02:00
Lorenz Hilpert
3b89777648 Merge branch 'release/2.3' into develop 2023-07-05 22:05:51 +02:00
Lorenz Hilpert
bb510788eb Merge branch 'develop' into release/3.0 2023-07-05 17:44:32 +02:00
Lorenz Hilpert
d48b59b374 Scandit Lizenz 2023-07-05 13:12:04 +02:00
Lorenz Hilpert
7d72fc56db Remission Routing fix 2023-07-04 19:04:24 +02:00
Lorenz Hilpert
90edb7dd7e Scanner Fix 2023-07-04 18:28:57 +02:00
Lorenz Hilpert
7ee0c4d145 #4164 Wannennummer scannen beim Öffnen eines WBS ohne Wannenummer 2023-07-04 17:15:38 +02:00
Lorenz Hilpert
67f2ff54be #4163 WBS abschließen ohne Wannennummer möglich 2023-07-04 15:51:26 +02:00
Nino Righi
1b85c8ff50 Merged PR 1572: #4143 Fix Page Product Search, Page Customer Orders, combine Filter and Searc...
#4143 Fix Page Product Search, Page Customer Orders, combine Filter and Searchquery in Splitscreen #4155 Fix Autocomplete inside Customer Orders
2023-07-04 08:07:36 +00:00
Lorenz Hilpert
f0470d3faa #4161 Artikel ohne Bestand sollen nicht mit dem Wertcode einlösbar sein 2023-07-03 16:53:22 +02:00
Nino Righi
4d5e81a638 Merged PR 1571: #4142 Fix Open Filter after Clearing Query navigates to filter page properly...
#4142 Fix Open Filter after Clearing Query navigates to filter page properly and does not trigger a search. Searchbox stays clear
2023-07-03 09:01:25 +00:00
Nino Righi
7676ae8143 Merged PR 1573: #4158 RD Customer Orders Details Select Bullet Fixed, Styling Adjusted
#4158 RD Customer Orders Details Select Bullet Fixed, Styling Adjusted
2023-07-03 08:52:58 +00:00
Lorenz Hilpert
fb97db99b0 #4151 Aktivierung Packstückprüfung 2023-07-02 11:18:17 +02:00
Lorenz Hilpert
92aad95603 #4157 Warnungstext auf Artikelebene überlappt Menge 2023-06-29 15:52:39 +02:00
Lorenz Hilpert
513cef2a66 #4153 EAN ISBN soll bleiben wenn Artikel nicht gefunden wurde 2023-06-29 15:49:21 +02:00
Lorenz Hilpert
bdf3bbc530 #4153 Artikel können hinzugefügt werden auch ohne Bestand 2023-06-29 14:14:20 +02:00
Nino Righi
9a17f95026 Merged PR 1570: #4135 #4144 Responsive Design Product Search Result List Select Bullet Logic...
#4135 #4144 Responsive Design Product Search Result List Select Bullet Logic updated
2023-06-28 16:10:01 +00:00
Nino Righi
e6b44d8365 Merged PR 1569: #4139 Fix RD Shared Searchbox Close Autocomplete if Search triggered
#4139 Fix RD Shared Searchbox Close Autocomplete if Search triggered
2023-06-28 16:07:49 +00:00
Nino Righi
874f8f4758 Merged PR 1568: #3996 Customer Order Details and History
#3996 Customer Order Details and History
2023-06-28 16:03:23 +00:00
Lorenz Hilpert
47baf2fa89 Kulturpass - Mehrfache Artikelauswahl über EAN überschreitet verfügbare Exemplare 2023-06-28 17:06:55 +02:00
Lorenz Hilpert
57bfc523ab Kulturpass - Early Exit wenn Dialog geschlossen wird 2023-06-28 14:07:28 +02:00
Lorenz Hilpert
23edea5fa4 Merge branch 'feature/kulturpass' into release/2.3 2023-06-28 13:34:38 +02:00
Lorenz Hilpert
7b12857a35 Mark Result Item as active if customer is selected 2023-06-28 13:21:28 +02:00
Lorenz Hilpert
d6d919ed52 Kundensuche Caching 2023-06-27 17:13:50 +02:00
Lorenz Hilpert
330c59f7e9 #4134 Einlösecode- Warenkorb Pop Up 2023-06-27 15:03:07 +02:00
Lorenz Hilpert
600687f652 Version Set To Major 3 Minor 0 2023-06-27 11:01:12 +02:00
Lorenz Hilpert
0c65e9dace #4133 vsl. Lieferdatum und Zurücklegen bis deaktiviert 2023-06-26 13:58:58 +02:00
Lorenz Hilpert
ed144f0a15 Unit Test Fix 2023-06-26 13:30:18 +02:00
Lorenz Hilpert
c0c2cc86d3 Merge branch 'release/2.3' into develop 2023-06-26 13:17:52 +02:00
Lorenz Hilpert
9b8ea11866 Kulturpass - loader anzeige 2023-06-23 17:32:49 +02:00
Lorenz Hilpert
17aed38316 Kulturpass Scanner Fix 2023-06-23 16:57:35 +02:00
Lorenz Hilpert
48a7cc4dd4 Kulturpass - Shoppingcart erstellung vor dem start und checkout beim bestellen 2023-06-23 16:51:50 +02:00
Lorenz Hilpert
4417fd9f0d Kulturpass Mengenänderung Verfügbarkeit Check 2023-06-23 15:30:41 +02:00
Lorenz Hilpert
3e429cb261 Kulturpass Hinweistexte 2023-06-23 12:12:47 +02:00
Lorenz Hilpert
48e30e795f Kulturpass - Hinweis leerer Warenkorb 2023-06-23 11:47:27 +02:00
Lorenz Hilpert
953e528298 Kulturpass Warenkorb Mengenänderung und Entfernen 2023-06-23 11:36:38 +02:00
Lorenz Hilpert
4276f427b9 Kulturpass Warenkorb #4133 #4134 2023-06-23 10:39:19 +02:00
Nino Righi
4b2bfefc9b Merged PR 1567: #3993 #3994 #3995 #3996 Kundenbestellungen Splitscreen, erste Version
#3993 #3994 #3995 #3996 Kundenbestellungen Splitscreen, erste Version
2023-06-20 11:08:15 +00:00
Lorenz Hilpert
11e79c4830 Customer Edit Pages 2023-06-16 13:29:34 +02:00
Lorenz Hilpert
264d914044 #4124 Kulturpass- Abholfrist auf Bearbeitenseite 2023-06-15 16:28:44 +02:00
Lorenz Hilpert
12f1e7c3af #4124 Kulturpass - Zurücklegen bis und Abholfrist nicht ausgrauen 2023-06-15 14:33:41 +02:00
Lorenz Hilpert
9eb4fbab65 Merge branch 'release/2.3' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/2.3 2023-06-15 13:52:19 +02:00
Lorenz Hilpert
8d1a63e47f #4120 Marker Bezahlt über KulturPass in der Ergebnisliste 2023-06-15 13:51:57 +02:00
Nino Righi
e449e612c1 Merged PR 1566: #4112 Hotfix Manueller Preis Archivartikel
#4112 Hotfix Manueller Preis Archivartikel
2023-06-15 11:43:09 +00:00
Lorenz Hilpert
6ba65f031b #4119 Kaufoptionen - Nicht verfügbare Kaufoptionen werden ausgegraut 2023-06-15 11:56:05 +02:00
Lorenz Hilpert
f31ac4c2e3 #4117 Bug Fix Collect On Delivery 2023-06-15 11:01:39 +02:00
Lorenz Hilpert
f980f5aaf9 #4113 Wareneingang Navigation entfernt 2023-06-14 17:53:29 +02:00
Nino Righi
45989d7abd Merged PR 1565: #4077 Responsive Design Display Cart-Checkout Process Tab Correctly
#4077 Responsive Design Display Cart-Checkout Process Tab Correctly
2023-06-14 14:31:47 +00:00
Lorenz Hilpert
87a1e8a2c4 Kulturpass Handler Fix COLLECT_WITH_SMALLAMOUNTINVOICE 2023-06-14 16:30:19 +02:00
Lorenz Hilpert
ae27da1127 Styling anpassung 2023-06-14 15:14:48 +02:00
Lorenz Hilpert
ca21931d93 Customer Create Forms 2023-06-14 15:04:15 +02:00
Lorenz Hilpert
5bb9ebd6ec #3961 Bestelldeadline anzeigen 2023-06-14 10:27:20 +02:00
Lorenz Hilpert
45ab1e9cc5 Kulturpass Drucken Fix 2023-06-13 17:51:33 +02:00
Lorenz Hilpert
8d2685a8c3 Fix Kulturpass Anzeige 2023-06-13 17:34:27 +02:00
Lorenz Hilpert
d38c41a99d Kulturpass - Fix - erneut drucken 2023-06-13 16:08:42 +02:00
Lorenz Hilpert
ff3dacde39 #4101 Kulturpass 2023-06-13 15:25:08 +02:00
Lorenz Hilpert
5c9f4c5b21 Merged PR 1564: Customer RD 2023-06-13 11:45:47 +00:00
Lorenz Hilpert
c134f645ef Merge branch 'develop' into feature/rd-customer 2023-06-13 13:45:00 +02:00
Lorenz Hilpert
6f0933a350 Fix Unit Tests 2023-06-13 13:25:37 +02:00
Nino Righi
c9a90211ee Merged PR 1563: #4099 RD Fix Disable Chrome Autocomplete prompt
#4099 RD Fix Disable Chrome Autocomplete prompt
2023-06-13 08:06:15 +00:00
Nino Righi
95d96dd295 Merged PR 1562: #4097 Fix Goods In Out Details CTA layout
#4097 Fix Goods In Out Details CTA layout
2023-06-13 08:05:37 +00:00
Nino Righi
86bf079f6f Merged PR 1561: #4098 Fix RD Article Search Results closing all Processes dont navigate to old result breadcrumb anymore
#4098 Fix RD Article Search Results closing all Processes dont navigate to old result breadcrumb anymore
2023-06-13 08:05:18 +00:00
Lorenz Hilpert
c202490555 Kundentyp-Auswahl 2023-06-12 17:04:19 +02:00
Lorenz Hilpert
da0100dd35 Icon lib moved to shared 2023-06-12 16:12:28 +02:00
Lorenz Hilpert
b634247463 Merge branch 'develop' into feature/rd-customer 2023-06-12 10:48:56 +02:00
Lorenz Hilpert
84df6493f6 Side View 2023-06-12 10:46:37 +02:00
Nino Righi
90b752e185 Merged PR 1558: #4092 Fix updateNotificationsGroup get orderId from first Item not from initi...
#4092 Fix updateNotificationsGroup get orderId from first Item not from initial form
2023-06-09 12:52:28 +00:00
Nino Righi
d3858c731c Merged PR 1559: #4092 Fix updateNotificationsGroup get orderId from first Item not from initi...
#4092 Fix updateNotificationsGroup get orderId from first Item not from initial form
2023-06-09 12:52:19 +00:00
Nino Righi
f247ac641c Merged PR 1560: #4082 Sidenav Arrow Navigation Fix
#4082 Sidenav Arrow Navigation Fix
2023-06-09 12:45:45 +00:00
Nino Righi
be1a9e8f7e Merged PR 1556: #4067 RD Artikelsuche Ergebnisliste Performance und Scrollposition Update
#4067 RD Artikelsuche Ergebnisliste Performance und Scrollposition Update
2023-06-09 09:11:10 +00:00
Nino Righi
3ed9227508 Merged PR 1553: #4074 Bugfixes
#4074 Bugfixes
2023-06-06 16:12:56 +00:00
Nino Righi
9cfe8176d4 Merged PR 1548: #4083 Goods In Out Order Edit Bestellkanal orderSource from Order not from fi...
#4083 Goods In Out Order Edit Bestellkanal orderSource from Order not from first item
2023-06-06 14:53:47 +00:00
Nino Righi
3999b8f623 Merged PR 1544: #4074 Kaufoptionen Manuelle Preiseingabe
#4074 Kaufoptionen Manuelle Preiseingabe
2023-06-06 13:28:57 +00:00
Andreas Schickinger
c8f54b8be5 Merged PR 1540: #4073 Hotfix PP Filter wird zurückgesetzt, wenn nicht vollständig geladen
#4073 Hotfix PP Filter wird zurückgesetzt, wenn nicht vollständig geladen

Related work items: #4073
2023-06-02 14:34:52 +00:00
Nino Righi
413d2f5178 Merged PR 1539: #4048 Changed clientChannel to orderSource
#4048 Changed clientChannel to orderSource
2023-06-02 11:48:23 +00:00
Andreas Schickinger
35c2a6a046 Merged PR 1537: #4050 Hotfix Kaufoptionen Popup - Weiterleiten zur Kundensuche
#4050 Hotfix Kaufoptionen Popup - Weiterleiten zur Kundensuche

Related work items: #4050
2023-06-02 11:23:21 +00:00
Andreas Schickinger
1df201525c Merged PR 1536: #4068 Hotfix Warenkorb Rücklage Menge ändern
#4068 Warenkorb Rücklage Menge ändern hotfix
2023-06-01 15:42:19 +00:00
Lorenz Hilpert
ef72dcf554 #3984 - Filtereinstellungen wenn Artikel für Dig-Versand in Warenkorb sind falsch
(cherry picked from commit 6717f0ee3d)
2023-05-25 10:54:08 +02:00
Michael Auer
c228147c00 Merged PR 1529: Floating Docker Branch-Tags
Es wird zusätzlich zu den bisherigen Docker-Tags, ein Docker-Tag vergeben, das den aktuellen Branch repräsentiert. Da dieses (identische) Tag für jeden neuen Build aus einem Branch wieder vergeben wird, wandert das Tag auf das neueste Docker-Image aus diesem Branch (vgl. Tag _latest_)

Beispiele:
develop => refs_head_develop
release/2.3 => refs_head_release_2.3

(cherry picked from commit 8880ed0df6)
2023-05-24 18:37:47 +02:00
Lorenz Hilpert
4b56b973c8 #3979 SSC Nummer Anzeigen 2023-05-24 17:53:54 +02:00
Lorenz Hilpert
28a00b9f22 Merge branch 'release/2.3' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/2.3 2023-05-24 17:38:57 +02:00
Nino Righi
b1fe692de5 Merged PR 1527: #4009 Filter reset and Branch Selector Dropdown Bugfixes
#4009 Filter reset and Branch Selector Dropdown Bugfixes
2023-05-23 11:55:14 +00:00
Lorenz Hilpert
08b2f6cbc9 removed console log 2023-05-23 13:32:28 +02:00
Lorenz Hilpert
10e1db388f #3979 Meldenummer in UI anzeigen 2023-05-23 13:32:05 +02:00
Lorenz Hilpert
cd7f71b968 #4044 Handlungsanweisung im Status fehlt 2023-05-22 16:13:57 +02:00
Lorenz Hilpert
9361a631dd Merge branch 'release/2.3' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/2.3 2023-05-22 10:46:34 +02:00
Lorenz Hilpert
59c5abfd93 Deadline Pipe Fix 2023-05-22 10:46:10 +02:00
Nino Righi
633c23a6f0 Merged PR 1526: #4009 Clear Filter Release
#4009 Clear Filter Release
2023-05-18 22:27:32 +00:00
Lorenz Hilpert
779e7323e2 #3965 HSC ISA - Kundenkarten anlegen raus 2023-05-17 15:51:35 +02:00
Lorenz Hilpert
6e7fbd940b #3961 Order Deadline Popup 2023-05-17 14:56:25 +02:00
Lorenz Hilpert
6878b608fc #4035 branch slector fix 2023-05-17 13:23:43 +02:00
Lorenz Hilpert
a4fab8b64e #4035 Filiale wird bei Reservierung setzen 2023-05-16 15:32:38 +02:00
Lorenz Hilpert
21c0cc8794 #4039 - Irrläufer verschwinden nicht von der Liste 2023-05-16 13:30:51 +02:00
Lorenz Hilpert
7ea11ea0c4 #4039 Neu laden der Liste wenn man im Popup auf erledigt klickt 2023-05-12 16:19:21 +02:00
Lorenz Hilpert
d2c307b08a Updated Breadcrumb for Kundensuche 2023-05-12 13:10:00 +02:00
Lorenz Hilpert
778343f636 #4036 Bugfix scaling von texten 2023-05-09 13:03:02 +02:00
Lorenz Hilpert
d2fb3b6c85 #4036 - Kaufoptionen 2023-05-09 10:33:21 +02:00
Lorenz Hilpert
a8bfedcd5d Added Create Customer Components 2023-05-08 15:38:31 +02:00
Lorenz Hilpert
4c7b5eec38 #4016 Kaufoptionen - Preis bei Versandbestellungen 2023-05-03 16:22:51 +02:00
Lorenz Hilpert
35068e23cd #4021 PP - Suche nach Packstuecken oeffnet details bei einem treffer 2023-05-02 11:33:56 +02:00
Lorenz Hilpert
bc30b86cce #4020 PP - Label wird auf IPad nicht merh zwei zeilig angezeigt 2023-05-02 11:24:36 +02:00
Lorenz Hilpert
461f166e33 #4017 PP - scanId wird beim aender des status mit uebermittelt 2023-05-02 11:14:22 +02:00
Lorenz Hilpert
628dbd5227 Merge branch 'develop' into feature/rd-customer 2023-04-27 18:09:40 +02:00
Lorenz Hilpert
c05b290e49 Searchbox 2023-04-27 18:09:12 +02:00
Lorenz Hilpert
b4d967f721 Merge branch 'develop' into feature/rd-customer 2023-04-27 16:10:40 +02:00
Lorenz Hilpert
bf760677ef RD fur customer bereich 2023-04-27 16:06:59 +02:00
Lorenz Hilpert
ad95faffa7 Merge branch 'release/2.3' of https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend into release/2.3 2023-04-24 23:09:21 +02:00
Michael Auer
a0eb3c0459 Revert "Update Remi Api Url"
This reverts commit ea9920c4d5.
2023-04-24 16:53:01 +02:00
Lorenz Hilpert
fea435a6d2 Bugfix - Hor-Scroll removed 2023-04-24 16:41:52 +02:00
Lorenz Hilpert
ea9920c4d5 Update Remi Api Url 2023-04-24 16:19:50 +02:00
1328 changed files with 47882 additions and 22461 deletions

View File

@@ -11,13 +11,10 @@ export class DevScanAdapter implements ScanAdapter {
constructor(private _modal: UiModalService, private _environmentService: EnvironmentService) {}
async init(): Promise<boolean> {
if (this._environmentService.isTablet()) {
return new Promise((resolve, reject) => {
resolve(isDevMode());
});
}
return false;
return Promise.resolve(false);
// return new Promise((resolve, reject) => {
// resolve(isDevMode());
// });
}
scan(): Observable<string> {

View File

@@ -14,7 +14,6 @@ export class ScanAdapterService {
async init(): Promise<void> {
for (const adapter of this.scanAdapters) {
const isReady = await adapter.init();
console.log('ScanAdapterService.init', adapter.name, isReady);
this._readyAdapters[adapter.name] = isReady;
}
}
@@ -24,42 +23,30 @@ export class ScanAdapterService {
}
getAdapter(name: string): ScanAdapter | undefined {
return this.scanAdapters.find((adapter) => adapter.name === name);
return this._readyAdapters[name] && this.scanAdapters.find((adapter) => adapter.name === name);
}
// return true if at least one adapter is ready
isReady(): boolean {
return Object.values(this._readyAdapters).some((ready) => ready);
}
scan(ops: { use?: string; include?: string[]; exclude?: string[] } = { exclude: ['Dev'] }): Observable<string> {
scan(): Observable<string> {
const adapterOrder = ['Native', 'Scandit', 'Dev'];
let adapter: ScanAdapter;
if (ops.use == undefined) {
// get the first adapter that is ready to use
adapter = this.scanAdapters
.filter((adapter) => {
if (ops.include?.length) {
return ops.include.includes(adapter.name);
} else if (ops.exclude?.length) {
return !ops.exclude.includes(adapter.name);
} else {
return true;
}
})
.find((adapter) => this._readyAdapters[adapter.name]);
} else {
adapter = this.getAdapter(ops.use);
for (const name of adapterOrder) {
adapter = this.getAdapter(name);
if (adapter) {
break;
}
}
if (!adapter) {
return throwError('No adapter found');
}
if (this._readyAdapters[adapter.name] == false) {
return throwError('Adapter is not ready');
}
return adapter.scan();
}
}

View File

@@ -2,8 +2,8 @@ import { NgModule } from '@angular/core';
import { ProductImagePipe } from './product-image.pipe';
@NgModule({
declarations: [ProductImagePipe],
imports: [],
declarations: [],
imports: [ProductImagePipe],
exports: [ProductImagePipe],
})
export class ProductImageModule {}

View File

@@ -3,6 +3,8 @@ import { ProductImageService } from './product-image.service';
@Pipe({
name: 'productImage',
standalone: true,
pure: true,
})
export class ProductImagePipe implements PipeTransform {
constructor(private imageService: ProductImageService) {}

View File

@@ -86,6 +86,28 @@ export class ApplicationService {
return this.getProcessById$(processId).pipe(map((process) => process?.data?.selectedBranch));
}
readonly REGEX_PROCESS_NAME = /^Vorgang \d+$/;
async createCustomerProcess(processId?: number): Promise<ApplicationProcess> {
const processes = await this.getProcesses$('customer').pipe(first()).toPromise();
const processIds = processes.filter((x) => this.REGEX_PROCESS_NAME.test(x.name)).map((x) => +x.name.split(' ')[1]);
const maxId = processIds.length > 0 ? Math.max(...processIds) : 0;
const process: ApplicationProcess = {
id: processId ?? Date.now(),
type: 'cart',
name: `Vorgang ${maxId + 1}`,
section: 'customer',
closeable: true,
};
await this.createProcess(process);
return process;
}
async createProcess(process: ApplicationProcess) {
const existingProcess = await this.getProcessById$(process?.id).pipe(first()).toPromise();
if (existingProcess?.id === process?.id) {

View File

@@ -138,6 +138,6 @@ export class BreadcrumbService {
getLatestBreadcrumbForSection(section: 'customer' | 'branch', predicate: (crumb: Breadcrumb) => boolean = (_) => true) {
return this.store
.select(selectors.selectBreadcrumbsBySection, { section })
.pipe(map((crumbs) => crumbs.sort((a, b) => b.changed - a.changed).find((f) => predicate(f))));
.pipe(map((crumbs) => crumbs.sort((a, b) => b.timestamp - a.timestamp).find((f) => predicate(f))));
}
}

View File

@@ -1,14 +1,24 @@
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() {}
constructor() {
this._registerCleanupTask();
}
set(token: Object, data: any, options?: CacheOptions) {
_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 = {
@@ -17,6 +27,8 @@ export class CacheService {
if (ttl) {
cached.until = Date.now() + ttl;
} else {
cached.until = Date.now() + 1000 * 60 * 60 * 12;
}
if (persist) {
@@ -29,13 +41,15 @@ export class CacheService {
return cached;
}
get<T = any>(token: Object, from: 'session' | 'persist' = 'session'): T {
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) {
@@ -59,7 +73,8 @@ export class CacheService {
}
private getKey(token: Object) {
return this.hash(JSON.stringify(token));
const key = `CacheService_` + this.hash(JSON.stringify(token));
return key;
}
private hash(data: string): string {
@@ -77,4 +92,25 @@ export class CacheService {
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 +1,6 @@
import { CommandService } from './command.service';
export abstract class ActionHandler<T = any> {
constructor(readonly action: string) {}
abstract handler(data: T): Promise<T>;
abstract handler(data: T, service?: CommandService): Promise<T>;
}

View File

@@ -1,8 +1,12 @@
import { ModuleWithProviders, NgModule, Type } from '@angular/core';
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> {

View File

@@ -16,7 +16,7 @@ export class CommandService {
throw new Error('Action Handler does not exist');
}
data = await handler.handler(data);
data = await handler.handler(data, this);
}
return data;
}

View File

@@ -2,12 +2,19 @@ import { Injectable } from '@angular/core';
import { Platform } from '@angular/cdk/platform';
import { NativeContainerService } from 'native-container';
import { BreakpointObserver } from '@angular/cdk/layout';
import { map } from 'rxjs/operators';
const MATCH_TABLET = '(max-width: 1024px)';
const MATCH_TABLET = '(max-width: 1023px)';
const MATCH_DESKTOP_SMALL = '(min-width: 1025px) and (max-width: 1439px)';
const MATCH_DESKTOP_SMALL = '(min-width: 1024px) and (max-width: 1279px)';
const MATCH_DESKTOP = '(min-width: 1440px)';
const MATCH_DESKTOP = '(min-width: 1280px)';
const MATCH_DESKTOP_LARGE = '(min-width: 1440px)';
const MATCH_DESKTOP_XLARGE = '(min-width: 1920px)';
const MATCH_DESKTOP_XXLARGE = '(min-width: 2736px)';
@Injectable({
providedIn: 'root',
@@ -23,19 +30,37 @@ export class EnvironmentService {
return this._breakpointObserver.isMatched(MATCH_TABLET);
}
matchTablet$ = this._breakpointObserver.observe(MATCH_TABLET);
matchTablet$ = this._breakpointObserver.observe(MATCH_TABLET).pipe(map((result) => result.matches));
matchDesktopSmall(): boolean {
return this._breakpointObserver.isMatched(MATCH_DESKTOP_SMALL);
}
matchDesktopSmall$ = this._breakpointObserver.observe(MATCH_DESKTOP_SMALL);
matchDesktopSmall$ = this._breakpointObserver.observe(MATCH_DESKTOP_SMALL).pipe(map((result) => result.matches));
matchDesktop(): boolean {
return this._breakpointObserver.isMatched(MATCH_DESKTOP);
}
matchDesktop$ = this._breakpointObserver.observe(MATCH_DESKTOP);
matchDesktop$ = this._breakpointObserver.observe(MATCH_DESKTOP).pipe(map((result) => result.matches));
matchDesktopLarge(): boolean {
return this._breakpointObserver.isMatched(MATCH_DESKTOP_LARGE);
}
matchDesktopLarge$ = this._breakpointObserver.observe(MATCH_DESKTOP_LARGE).pipe(map((result) => result.matches));
matchDesktopXLarge(): boolean {
return this._breakpointObserver.isMatched(MATCH_DESKTOP_XLARGE);
}
matchDesktopXLarge$ = this._breakpointObserver.observe(MATCH_DESKTOP_XLARGE).pipe(map((result) => result.matches));
matchDesktopXXLarge(): boolean {
return this._breakpointObserver.isMatched(MATCH_DESKTOP_XXLARGE);
}
matchDesktopXXLarge$ = this._breakpointObserver.observe(MATCH_DESKTOP_XXLARGE).pipe(map((result) => result.matches));
/**
* @deprecated Use `matchDesktopSmall` or 'matchDesktop' instead.

View File

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

View File

@@ -1,14 +0,0 @@
import { AnimationTriggerMetadata, trigger, state, transition, style, animate } from '@angular/animations';
export const slideAnimationTime = 150;
export const toastAnimations: {
readonly slideToast: AnimationTriggerMetadata;
} = {
slideToast: trigger('slideAnimation', [
state('default', style({ transform: 'translateY(0%)' })),
transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(`${slideAnimationTime}ms ease-in`)]),
transition('default => closing', animate(`${slideAnimationTime}ms ease-in`, style({ transform: 'translateY(-100%)' }))),
]),
};
export type ToastAnimationState = 'default' | 'closing';

View File

@@ -1,4 +0,0 @@
// start:ng42.barrel
export * from './toast';
export * from './toast-ref';
// end:ng42.barrel

View File

@@ -1,17 +0,0 @@
import { OverlayRef } from '@angular/cdk/overlay';
export class ToastRef {
constructor(private readonly _overlay: OverlayRef) {}
close() {
this._overlay.dispose();
}
isVisible() {
return this._overlay && this._overlay.overlayElement;
}
getPosition() {
return this._overlay.overlayElement.getBoundingClientRect();
}
}

View File

@@ -1,11 +0,0 @@
import { TemplateRef } from '@angular/core';
export interface Toast {
title?: string;
text?: string;
timer?: number;
position?: 'top-left' | 'top' | 'top-right' | 'bottom-right' | 'bottom' | 'bottom-left';
size?: 'width-full' | 'content';
template?: TemplateRef<any>; // For rendering dynamic content
templateContext?: {}; // For rendering dynamic content
}

View File

@@ -1,8 +0,0 @@
// start:ng42.barrel
export * from './toast.component';
export * from './toast.module';
export * from './toast.service';
export * from './defs';
export * from './animation';
export * from './tokens';
// end:ng42.barrel

View File

@@ -1,15 +0,0 @@
<div class="toast-main" [style.width]="width" [@slideAnimation]="{ value: animationState }" (@slideAnimation.done)="onSlideFinished()">
<button class="absolute top-2 right-2 p-6 border-none bg-transparent" (click)="close()">
<ui-icon icon="close" size="20px"></ui-icon>
</button>
<div class="toast-content flex flex-col justify-center items-center">
<h1 class="text-xl font-bold text-center py-3 whitespace-pre-wrap">{{ data.title }}</h1>
<ng-container *ngIf="data.text; else templateRef">
<p class="block text-p2 overflow-y-hidden pb-3 text-center overflow-x-hidden">{{ data.text }}</p>
</ng-container>
</div>
</div>
<ng-template #templateRef>
<ng-container *ngTemplateOutlet="data.template; context: data.templateContext"> </ng-container>
</ng-template>

View File

@@ -1,12 +0,0 @@
.toast-main {
@apply block relative mx-auto box-border text-white p-4;
background-color: var(--toast-background);
min-width: 18.75rem;
max-width: calc(100vw - 2rem);
min-height: 5rem;
border-radius: 25px;
}
.toast-content {
min-height: 3rem;
}

View File

@@ -1,48 +0,0 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from '@angular/core';
import { toastAnimations, ToastAnimationState, slideAnimationTime } from './animation';
import { Toast, ToastRef } from './defs';
import { TOAST_CONFIG_TOKEN } from './tokens';
@Component({
selector: 'lib-toast',
templateUrl: 'toast.component.html',
styleUrls: ['toast.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
animations: [toastAnimations.slideToast],
})
export class ToastComponent implements OnInit, OnDestroy {
timeoutRef?: any;
animationState: ToastAnimationState = 'default';
width = '55.25rem';
constructor(
@Inject(TOAST_CONFIG_TOKEN) public readonly data: Toast,
private readonly _ref: ToastRef,
private readonly _cdr: ChangeDetectorRef
) {}
ngOnInit(): void {
if (this.data?.size) {
this.width = this.data?.size === 'width-full' ? '100vw' : '55.25rem';
}
this.timeoutRef = setTimeout(() => {
this.close();
this._cdr.markForCheck();
}, slideAnimationTime + (this.data.timer ?? 5000));
}
ngOnDestroy() {
clearTimeout(this.timeoutRef);
}
close() {
this.animationState = 'closing';
}
onSlideFinished() {
if (this.animationState === 'closing') {
this._ref.close();
}
}
}

View File

@@ -1,12 +0,0 @@
import { OverlayModule } from '@angular/cdk/overlay';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { UiIconModule } from '@ui/icon';
import { ToastComponent } from './toast.component';
@NgModule({
declarations: [ToastComponent],
imports: [CommonModule, OverlayModule, UiIconModule],
exports: [ToastComponent],
})
export class ToastModule {}

View File

@@ -1,16 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { ToastService } from './toast.service';
describe('ToastService', () => {
let service: ToastService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ToastService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@@ -1,79 +0,0 @@
import { Overlay } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { Injectable, Injector } from '@angular/core';
import { Toast, ToastRef } from './defs';
import { ToastComponent } from './toast.component';
import { TOAST_CONFIG_TOKEN } from './tokens';
@Injectable({
providedIn: 'root',
})
export class ToastService {
private _lastToastRef: ToastRef;
get lastToastRef() {
return this._lastToastRef;
}
set lastToastRef(toastRef: ToastRef) {
this._lastToastRef = toastRef;
}
constructor(private readonly _overlay: Overlay, private readonly _injector: Injector) {}
create(data: Toast) {
const positionStrategy = this.getPositionStrategy(data);
const overlayRef = this._overlay.create({ positionStrategy });
this.lastToastRef = new ToastRef(overlayRef);
const injector = this.getInjector(data, this.lastToastRef);
const toastPortal = new ComponentPortal(ToastComponent, null, injector);
overlayRef.attach(toastPortal);
return this.lastToastRef;
}
getInjector(data: Toast, ref: ToastRef) {
return Injector.create({
parent: this._injector,
providers: [
{ provide: TOAST_CONFIG_TOKEN, useValue: data },
{ provide: ToastRef, useValue: ref },
],
});
}
getPositionStrategy(data: Toast) {
switch (data?.position) {
case 'top':
return this._overlay.position().global().top(this.getNextPosition()).centerHorizontally();
case 'top-left':
return this._overlay.position().global().top(this.getNextPosition()).left('1rem');
case 'top-right':
return this._overlay.position().global().top(this.getNextPosition()).right('1rem');
case 'bottom':
return this._overlay.position().global().bottom(this.getNextPosition(true)).centerHorizontally();
case 'bottom-left':
return this._overlay.position().global().bottom(this.getNextPosition(true)).left('1rem');
case 'bottom-right':
return this._overlay.position().global().bottom(this.getNextPosition(true)).right('1rem');
default:
return this._overlay.position().global().top(this.getNextPosition()).centerHorizontally();
}
}
getNextPosition(fromBottom?: boolean) {
const lastToastIsVisible = this.lastToastRef && this.lastToastRef.isVisible();
let position = fromBottom ? 6 : 9;
if (lastToastIsVisible && fromBottom) {
position = (window.innerHeight - this.lastToastRef.getPosition().bottom + this.lastToastRef.getPosition().height + 16) / 16;
} else if (lastToastIsVisible) {
position = (this.lastToastRef.getPosition().bottom + 16) / 16;
}
return position + 'rem';
}
}

View File

@@ -1,4 +0,0 @@
import { InjectionToken } from '@angular/core';
import { Toast } from './defs';
export const TOAST_CONFIG_TOKEN = new InjectionToken<Toast>('TOAST_DATA');

View File

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

View File

@@ -8,7 +8,7 @@ import {
StoreCheckoutSupplierService,
SupplierDTO,
} from '@swagger/checkout';
import { combineLatest, Observable, of } from 'rxjs';
import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs';
import {
AvailabilityRequestDTO,
AvailabilityService,
@@ -21,11 +21,16 @@ import { isArray, memorize } from '@utils/common';
import { LogisticianDTO, LogisticianService } from '@swagger/oms';
import { ResponseArgsOfIEnumerableOfStockInfoDTO, StockDTO, StockInfoDTO, StockService } from '@swagger/remi';
import { PriceDTO } from '@swagger/availability';
import { AvailabilityByBranchDTO, ItemData } from './defs';
import { AvailabilityByBranchDTO, ItemData, Ssc } from './defs';
import { Availability } from './defs/availability';
import { isEmpty } from 'lodash';
@Injectable()
export class DomainAvailabilityService {
// Ticket #3378 Keep Result List Items and Details Page SSC in sync
sscs$ = new BehaviorSubject<Array<Ssc>>([]);
sscsObs$ = this.sscs$.asObservable();
constructor(
private _availabilityService: AvailabilityService,
private _logisticanService: LogisticianService,
@@ -145,6 +150,7 @@ export class DomainAvailabilityService {
);
}
@memorize({ ttl: 10000 })
getTakeAwayAvailability({
item,
quantity,
@@ -283,7 +289,7 @@ export class DomainAvailabilityService {
const availabilities = r.result;
const preferred = availabilities?.find((f) => f.preferred === 1);
const availability: AvailabilityDTO = {
return {
availabilityType: preferred?.status,
ssc: preferred?.ssc,
sscText: preferred?.sscText,
@@ -296,8 +302,8 @@ export class DomainAvailabilityService {
supplierProductNumber: preferred?.supplierProductNumber,
supplierInfo: preferred?.requestStatusCode,
lastRequest: preferred?.requested,
priceMaintained: preferred?.priceMaintained,
};
return availability;
}),
shareReplay(1)
);
@@ -346,7 +352,7 @@ export class DomainAvailabilityService {
const availabilities = r.result;
const preferred = availabilities?.find((f) => f.preferred === 1);
const availability: AvailabilityDTO = {
return {
availabilityType: preferred?.status,
ssc: preferred?.ssc,
sscText: preferred?.sscText,
@@ -358,8 +364,8 @@ export class DomainAvailabilityService {
logistician: { id: preferred?.logisticianId },
supplierInfo: preferred?.requestStatusCode,
lastRequest: preferred?.requested,
priceMaintained: preferred?.priceMaintained,
};
return availability;
}),
shareReplay(1)
);
@@ -452,30 +458,8 @@ export class DomainAvailabilityService {
return [2, 32, 256, 1024, 2048, 4096].some((code) => availability?.availabilityType === code);
}
mapToOlaAvailability({
availability,
item,
quantity,
}: {
availability: AvailabilityDTO;
item: ItemDTO;
quantity: number;
}): OLAAvailabilityDTO {
return {
status: availability?.availabilityType,
at: availability?.estimatedShippingDate,
ean: item?.product?.ean,
itemId: item?.id,
format: item?.product?.format,
isPrebooked: availability?.isPrebooked,
logisticianId: availability?.logistician?.id,
price: availability?.price,
qty: quantity,
ssc: availability?.ssc,
sscText: availability?.sscText,
supplierId: availability?.supplier?.id,
supplierProductNumber: availability?.supplierProductNumber,
};
private _priceIsEmpty(price: PriceDTO) {
return isEmpty(price?.value) || isEmpty(price?.vat);
}
private _mapToTakeAwayAvailability({
@@ -498,7 +482,7 @@ export class DomainAvailabilityService {
inStock: inStock,
supplierSSC: quantity <= inStock ? '999' : '',
supplierSSCText: quantity <= inStock ? 'Filialentnahme' : '',
price: price ?? stockInfo?.retailPrice,
price: this._priceIsEmpty(price) ? stockInfo?.retailPrice : price,
supplier: { id: supplier?.id },
// TODO: Change after API Update
// LH: 2021-03-09 preis Property hat nun ein Fallback auf retailPrice
@@ -540,6 +524,7 @@ export class DomainAvailabilityService {
return preferred.map((p) => {
return [
{
orderDeadline: p?.orderDeadline,
availabilityType: p?.status,
ssc: p?.ssc,
sscText: p?.sscText,
@@ -552,6 +537,7 @@ export class DomainAvailabilityService {
supplierInfo: p?.requestStatusCode,
lastRequest: p?.requested,
itemId: p.itemId,
priceMaintained: p.priceMaintained,
},
p,
];
@@ -559,9 +545,8 @@ export class DomainAvailabilityService {
}
}
private _mapToShippingAvailability(availabilities: SwaggerAvailabilityDTO[]) {
private _mapToShippingAvailability(availabilities: SwaggerAvailabilityDTO[]): AvailabilityDTO[] {
const preferred = availabilities.filter((f) => f.preferred === 1);
return preferred.map((p) => {
return {
availabilityType: p?.status,
@@ -575,6 +560,7 @@ export class DomainAvailabilityService {
supplierInfo: p?.requestStatusCode,
lastRequest: p?.requested,
itemId: p.itemId,
priceMaintained: p.priceMaintained,
};
});
}

View File

@@ -1,3 +1,4 @@
export * from './availability-by-branch-dto';
export * from './availability';
export * from './item-data';
export * from './ssc';

View File

@@ -0,0 +1,5 @@
export interface Ssc {
itemId?: number;
ssc?: string;
sscText?: string;
}

View File

@@ -27,23 +27,53 @@ import {
StoreCheckoutPayerService,
StoreCheckoutBranchService,
ItemsResult,
KulturPassService,
ProductDTO,
KulturPassResult,
} from '@swagger/checkout';
import { DisplayOrderDTO, DisplayOrderItemDTO, OrderCheckoutService, ReorderValues } from '@swagger/oms';
import {
DisplayOrderDTO,
DisplayOrderItemDTO,
OrderCheckoutService,
ReorderValues,
ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString,
} from '@swagger/oms';
import { isNullOrUndefined, memorize } from '@utils/common';
import { combineLatest, Observable, of, concat, isObservable, throwError } from 'rxjs';
import { bufferCount, catchError, filter, first, map, mergeMap, shareReplay, switchMap, tap, withLatestFrom } from 'rxjs/operators';
import { combineLatest, Observable, of, concat, isObservable, throwError, interval as rxjsInterval } from 'rxjs';
import {
bufferCount,
catchError,
distinctUntilChanged,
filter,
first,
map,
mergeMap,
shareReplay,
switchMap,
tap,
withLatestFrom,
startWith,
} from 'rxjs/operators';
import * as DomainCheckoutSelectors from './store/domain-checkout.selectors';
import * as DomainCheckoutActions from './store/domain-checkout.actions';
import { DomainAvailabilityService } from '@domain/availability';
import { DomainAvailabilityService, ItemData } from '@domain/availability';
import { HttpErrorResponse } from '@angular/common/http';
import { ApplicationService } from '@core/application';
import { CustomerDTO, EntityDTOContainerOfAttributeDTO } from '@swagger/crm';
import { CustomerDTO } from '@swagger/crm';
import { Config } from '@core/config';
import parseDuration from 'parse-duration';
@Injectable()
export class DomainCheckoutService {
get olaExpiration() {
const exp = this._config.get('@domain/checkout.olaExpiration') ?? '5m';
return parseDuration(exp);
}
constructor(
private store: Store<any>,
private _config: Config,
private applicationService: ApplicationService,
private storeCheckoutService: StoreCheckoutService,
private orderCheckoutService: OrderCheckoutService,
@@ -52,7 +82,8 @@ export class DomainCheckoutService {
private _paymentService: StoreCheckoutPaymentService,
private _buyerService: StoreCheckoutBuyerService,
private _payerService: StoreCheckoutPayerService,
private _branchService: StoreCheckoutBranchService
private _branchService: StoreCheckoutBranchService,
private _kulturpassService: KulturPassService
) {}
//#region shoppingcart
@@ -113,14 +144,14 @@ export class DomainCheckoutService {
})
.pipe(
map((response) => response.result),
tap((shoppingCart) =>
tap((shoppingCart) => {
this.store.dispatch(
DomainCheckoutActions.setShoppingCart({
processId,
shoppingCart,
})
)
),
);
}),
tap((shoppingCart) => this.updateProcessCount(processId, shoppingCart?.items?.length))
)
)
@@ -199,6 +230,10 @@ export class DomainCheckoutService {
);
}
canAddItemsKulturpass(payload: ProductDTO[]): Observable<KulturPassResult[]> {
return this._kulturpassService.KulturPassCanAddForKulturPass({ payload }).pipe(map((response) => response?.result));
}
canAddItems({
processId,
payload,
@@ -243,11 +278,24 @@ export class DomainCheckoutService {
shoppingCartItemId: number;
availability: AvailabilityDTO;
}) {
return this._shoppingCartService.StoreCheckoutShoppingCartUpdateShoppingCartItemAvailability({
shoppingCartId,
shoppingCartItemId,
availability,
});
return this._shoppingCartService
.StoreCheckoutShoppingCartUpdateShoppingCartItemAvailability({
shoppingCartId,
shoppingCartItemId,
availability,
})
.pipe(
map((response) => response.result),
tap((shoppingCart) => {
this.store.dispatch(
DomainCheckoutActions.addShoppingCartItemAvailabilityToHistoryByShoppingCartId({
shoppingCartId,
availability,
shoppingCartItemId,
})
);
})
);
}
updateItemInShoppingCart({
@@ -259,7 +307,7 @@ export class DomainCheckoutService {
shoppingCartItemId: number;
update: UpdateShoppingCartItemDTO;
}): Observable<ShoppingCartDTO> {
return this.getShoppingCart({ processId }).pipe(
return this.getShoppingCart({ processId, latest: true }).pipe(
first(),
mergeMap((shoppingCart) =>
this._shoppingCartService
@@ -270,8 +318,21 @@ export class DomainCheckoutService {
})
.pipe(
map((response) => response.result),
tap((shoppingCart) => this.store.dispatch(DomainCheckoutActions.setShoppingCart({ processId, shoppingCart }))),
tap((shoppingCart) => this.updateProcessCount(processId, shoppingCart?.items?.length))
tap((shoppingCart) => {
this.store.dispatch(DomainCheckoutActions.setShoppingCart({ processId, shoppingCart }));
if (update.availability) {
this.store.dispatch(
DomainCheckoutActions.addShoppingCartItemAvailabilityToHistory({
processId,
availability: update.availability,
shoppingCartItemId,
})
);
}
this.updateProcessCount(processId, shoppingCart?.items?.length);
})
)
)
);
@@ -372,8 +433,9 @@ export class DomainCheckoutService {
_setBuyer({ processId, buyer }: { processId: number; buyer: BuyerDTO }): Observable<CheckoutDTO> {
return this.getCheckout({ processId }).pipe(
first(),
mergeMap((checkout) =>
this._buyerService
mergeMap((checkout) => {
console.log('checkout', checkout, processId);
return this._buyerService
.StoreCheckoutBuyerSetBuyerPOST({
checkoutId: checkout?.id,
buyerDTO: buyer,
@@ -381,8 +443,8 @@ export class DomainCheckoutService {
.pipe(
map((response) => response.result),
tap((checkout) => this.store.dispatch(DomainCheckoutActions.setCheckout({ processId, checkout })))
)
)
);
})
);
}
@@ -540,6 +602,175 @@ export class DomainCheckoutService {
);
}
async refreshAvailability({
processId,
shoppingCartItemId,
}: {
processId: number;
shoppingCartItemId: number;
}): Promise<AvailabilityDTO> {
const shoppingCart = await this.getShoppingCart({ processId }).pipe(first()).toPromise();
const item = shoppingCart?.items.find((item) => item.id === shoppingCartItemId)?.data;
if (!item) {
return;
}
const itemData: ItemData = {
ean: item.product.ean,
itemId: Number(item.product.catalogProductNumber),
price: item.availability.price,
};
let availability: AvailabilityDTO;
switch (item.features.orderType) {
case 'Abholung':
const abholung = await this.availabilityService
.getPickUpAvailability({
item: itemData,
branch: item.destination?.data?.targetBranch?.data,
quantity: item.quantity,
})
.toPromise();
availability = abholung[0];
break;
case 'Rücklage':
const ruecklage = await this.availabilityService
.getTakeAwayAvailability({
item: itemData,
quantity: item.quantity,
branch: item.destination?.data?.targetBranch?.data,
})
.toPromise();
availability = ruecklage;
break;
case 'Download':
const download = await this.availabilityService
.getDownloadAvailability({
item: itemData,
})
.toPromise();
availability = download;
break;
case 'Versand':
const versand = await this.availabilityService
.getDeliveryAvailability({
item: itemData,
quantity: item.quantity,
})
.toPromise();
availability = versand;
break;
case 'DIG-Versand':
const digVersand = await this.availabilityService
.getDigDeliveryAvailability({
item: itemData,
quantity: item.quantity,
})
.toPromise();
availability = digVersand;
break;
case 'B2B-Versand':
const b2bVersand = await this.availabilityService
.getB2bDeliveryAvailability({
item: itemData,
quantity: item.quantity,
})
.toPromise();
availability = b2bVersand;
break;
}
await this.updateItemInShoppingCart({
processId,
update: { availability },
shoppingCartItemId: item.id,
}).toPromise();
return availability;
}
/**
* Check if the availability of all items is valid
* @param param0 Process Id
* @returns true if the availability of all items is valid
*/
validateOlaStatus({ processId, interval }: { processId: number; interval?: number }): Observable<boolean> {
return rxjsInterval(interval ?? this.olaExpiration / 10).pipe(
startWith(0),
switchMap(() =>
this.store.select(DomainCheckoutSelectors.selectCheckoutEntityByProcessId, { processId }).pipe(
map((entity) => {
const now = Date.now();
if (!entity || !entity.shoppingCart || !entity.shoppingCart.items) {
return;
}
const itemAvailabilityTimestamp = entity.itemAvailabilityTimestamp ?? {};
const shoppingCart = entity.shoppingCart;
const timestamps = shoppingCart.items
?.map((i) => i.data)
?.filter((item) => !!item?.features?.orderType)
?.map((item) => {
const orderType = item.features.orderType;
let timestamp = itemAvailabilityTimestamp[`${item.id}_${orderType}`];
if (timestamp) {
return timestamp;
}
if (orderType.endsWith('Versand')) {
timestamp =
itemAvailabilityTimestamp[`${item.id}_Versand`] ??
itemAvailabilityTimestamp[`${item.id}_DIG-Versand`] ??
itemAvailabilityTimestamp[`${item.id}_B2B-Versand`];
}
return timestamp;
})
?.filter((timestamp) => !!timestamp);
if (timestamps?.length > 0) {
const oldestTimestamp = Math.min(...timestamps);
const expirationTimestamp = oldestTimestamp + this.olaExpiration;
return expirationTimestamp > now;
}
return false;
})
)
),
distinctUntilChanged()
);
}
validateAvailabilities({ processId }: { processId: number }): Observable<boolean> {
return this.getShoppingCart({ processId }).pipe(
map((shoppingCart) => {
const items = shoppingCart?.items?.map((item) => item.data) || [];
return items.every((i) => this.availabilityService.isAvailable({ availability: i.availability }));
})
);
}
checkoutIsValid({ processId }: { processId: number }): Observable<boolean> {
const olaStatus$ = this.validateOlaStatus({ processId, interval: 250 });
const availabilities$ = this.validateAvailabilities({ processId });
return combineLatest([olaStatus$, availabilities$]).pipe(map(([olaStatus, availabilities]) => olaStatus && availabilities));
}
completeCheckout({ processId }: { processId: number }): Observable<DisplayOrderDTO[]> {
const refreshShoppingCart$ = this.getShoppingCart({ processId, latest: true }).pipe(first());
const refreshCheckout$ = this.getCheckout({ processId, refresh: true }).pipe(first());
@@ -693,21 +924,64 @@ export class DomainCheckoutService {
)
);
return updateDestination$
.pipe(tap(console.log.bind(window, 'updateDestination$')))
return of(undefined)
.pipe(
mergeMap((_) => updateDestination$.pipe(tap(console.log.bind(window, 'updateDestination$')))),
mergeMap((_) => refreshShoppingCart$.pipe(tap(console.log.bind(window, 'refreshShoppingCart$')))),
mergeMap((_) => setSpecialComment$.pipe(tap(console.log.bind(window, 'setSpecialComment$')))),
mergeMap((_) => refreshCheckout$.pipe(tap(console.log.bind(window, 'refreshCheckout$')))),
mergeMap((_) => checkAvailabilities$.pipe(tap(console.log.bind(window, 'checkAvailabilities$')))),
mergeMap((_) => updateAvailabilities$.pipe(tap(console.log.bind(window, 'updateAvailabilities$')))),
mergeMap((_) => updateAvailabilities$.pipe(tap(console.log.bind(window, 'updateAvailabilities$'))))
)
.pipe(
mergeMap((_) => setBuyer$.pipe(tap(console.log.bind(window, 'setBuyer$')))),
mergeMap((_) => setNotificationChannels$.pipe(tap(console.log.bind(window, 'setNotificationChannels$')))),
mergeMap((_) => setPayer$.pipe(tap(console.log.bind(window, 'setPayer$')))),
mergeMap((_) => setPaymentType$.pipe(tap(console.log.bind(window, 'setPaymentType$')))),
mergeMap((_) => setDestination$.pipe(tap(console.log.bind(window, 'setDestination$'))))
mergeMap((_) => setDestination$.pipe(tap(console.log.bind(window, 'setDestination$')))),
mergeMap((_) => completeOrder$.pipe(tap(console.log.bind(window, 'completeOrder$'))))
);
}
completeKulturpassOrder({
processId,
orderItemSubsetId,
}: {
processId: number;
orderItemSubsetId: number;
}): Observable<ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString> {
const refreshShoppingCart$ = this.getShoppingCart({ processId, latest: true }).pipe(first());
const refreshCheckout$ = this.getCheckout({ processId, refresh: true }).pipe(first());
const setBuyer$ = this.getBuyer({ processId }).pipe(
first(),
mergeMap((buyer) => this._setBuyer({ processId, buyer }))
);
const setPayer$ = this.getPayer({ processId }).pipe(
first(),
mergeMap((payer) => this._setPayer({ processId, payer }))
);
const checkAvailabilities$ = this.checkAvailabilities({ processId });
const updateAvailabilities$ = this.updateAvailabilities({ processId });
return refreshShoppingCart$.pipe(
mergeMap((_) => refreshCheckout$),
mergeMap((_) => checkAvailabilities$),
mergeMap((_) => updateAvailabilities$),
mergeMap((_) => setBuyer$),
mergeMap((_) => setPayer$),
mergeMap((checkout) =>
this.orderCheckoutService.OrderCheckoutCreateKulturPassOrder({
payload: {
checkoutId: checkout.id,
orderItemSubsetId: String(orderItemSubsetId),
},
})
)
.pipe(mergeMap((_) => completeOrder$.pipe(tap(console.log.bind(window, 'completeOrder$')))));
);
}
updateDestination({
@@ -747,6 +1021,7 @@ export class DomainCheckoutService {
//#region Common
@memorize()
canSetCustomer({
processId,
customerFeatures,
@@ -754,24 +1029,26 @@ export class DomainCheckoutService {
processId: number;
customerFeatures?: { [key: string]: string };
}): Observable<{ ok?: boolean; filter?: { [key: string]: string }; message?: string; create?: InputDTO }> {
return this.getShoppingCart({ processId }).pipe(
first(),
mergeMap((shoppingCart) =>
this._shoppingCartService
.StoreCheckoutShoppingCartCanAddBuyer({
shoppingCartId: shoppingCart.id,
payload: { customerFeatures },
})
.pipe(
map((response) => ({
ok: response.result.ok,
filter: response.result.queryToken?.filter || {},
message: response.message,
create: response.result.create,
}))
)
return this.getShoppingCart({ processId })
.pipe(
first(),
mergeMap((shoppingCart) =>
this._shoppingCartService
.StoreCheckoutShoppingCartCanAddBuyer({
shoppingCartId: shoppingCart.id,
payload: { customerFeatures },
})
.pipe(
map((response) => ({
ok: response.result.ok,
filter: response.result.queryToken?.filter || {},
message: response.message,
create: response.result.create,
}))
)
)
)
);
.pipe(shareReplay(1));
}
setNotificationChannels({ processId, notificationChannels }: { processId: number; notificationChannels: NotificationChannel }): void {
@@ -930,6 +1207,5 @@ export class DomainCheckoutService {
private updateProcessCount(processId: number, count: number) {
this.applicationService.patchProcessData(processId, { count });
}
//#endregion
}

View File

@@ -1,4 +1,12 @@
import { BuyerDTO, CheckoutDTO, NotificationChannel, PayerDTO, ShippingAddressDTO, ShoppingCartDTO } from '@swagger/checkout';
import {
AvailabilityDTO,
BuyerDTO,
CheckoutDTO,
NotificationChannel,
PayerDTO,
ShippingAddressDTO,
ShoppingCartDTO,
} from '@swagger/checkout';
import { CustomerDTO } from '@swagger/crm';
import { DisplayOrderDTO } from '@swagger/oms';
@@ -14,4 +22,5 @@ export interface CheckoutEntity {
specialComment: string;
notificationChannels: NotificationChannel;
olaErrorIds: number[];
itemAvailabilityTimestamp: Record<string, number | undefined>;
}

View File

@@ -7,6 +7,7 @@ import {
ShippingAddressDTO,
BuyerDTO,
PayerDTO,
AvailabilityDTO,
} from '@swagger/checkout';
import { CustomerDTO } from '@swagger/crm';
import { DisplayOrderDTO, DisplayOrderItemDTO } from '@swagger/oms';
@@ -61,3 +62,13 @@ export const setSpecialComment = createAction(`${prefix} Set Agent Comment`, pro
export const setOlaError = createAction(`${prefix} Set Ola Error`, props<{ processId: number; olaErrorIds: number[] }>());
export const setCustomer = createAction(`${prefix} Set Customer`, props<{ processId: number; customer: CustomerDTO }>());
export const addShoppingCartItemAvailabilityToHistory = createAction(
`${prefix} Add Shopping Cart Item Availability To History`,
props<{ processId: number; shoppingCartItemId: number; availability: AvailabilityDTO }>()
);
export const addShoppingCartItemAvailabilityToHistoryByShoppingCartId = createAction(
`${prefix} Add Shopping Cart Item Availability To History By Shopping Cart Id`,
props<{ shoppingCartId: number; shoppingCartItemId: number; availability: AvailabilityDTO }>()
);

View File

@@ -10,7 +10,22 @@ const _domainCheckoutReducer = createReducer(
initialCheckoutState,
on(DomainCheckoutActions.setShoppingCart, (s, { processId, shoppingCart }) => {
const entity = getOrCreateCheckoutEntity({ processId, entities: s.entities });
const addedShoppingCartItems =
shoppingCart?.items?.filter((item) => !entity.shoppingCart?.items?.find((i) => i.id === item.id))?.map((item) => item.data) ?? [];
entity.shoppingCart = shoppingCart;
entity.itemAvailabilityTimestamp = entity.itemAvailabilityTimestamp ? { ...entity.itemAvailabilityTimestamp } : {};
const now = Date.now();
for (let shoppingCartItem of addedShoppingCartItems) {
if (shoppingCartItem.features?.orderType) {
entity.itemAvailabilityTimestamp[`${shoppingCartItem.id}_${shoppingCartItem.features.orderType}`] = now;
}
}
return storeCheckoutAdapter.setOne(entity, s);
}),
on(DomainCheckoutActions.setCheckout, (s, { processId, checkout }) => {
@@ -100,7 +115,40 @@ const _domainCheckoutReducer = createReducer(
const entity = getOrCreateCheckoutEntity({ processId, entities: s.entities });
entity.customer = customer;
return storeCheckoutAdapter.setOne(entity, s);
})
}),
on(DomainCheckoutActions.addShoppingCartItemAvailabilityToHistory, (s, { processId, shoppingCartItemId, availability }) => {
const entity = getOrCreateCheckoutEntity({ processId, entities: s.entities });
const itemAvailabilityTimestamp = entity?.itemAvailabilityTimestamp ? { ...entity?.itemAvailabilityTimestamp } : {};
const item = entity?.shoppingCart?.items?.find((i) => i.id === shoppingCartItemId)?.data;
if (!item?.features?.orderType) return s;
itemAvailabilityTimestamp[`${item.id}_${item?.features?.orderType}`] = Date.now();
entity.itemAvailabilityTimestamp = itemAvailabilityTimestamp;
return storeCheckoutAdapter.setOne(entity, s);
}),
on(
DomainCheckoutActions.addShoppingCartItemAvailabilityToHistoryByShoppingCartId,
(s, { shoppingCartId, shoppingCartItemId, availability }) => {
const entity = getCheckoutEntityByShoppingCartId({ shoppingCartId, entities: s.entities });
const itemAvailabilityTimestamp = entity?.itemAvailabilityTimestamp ? { ...entity?.itemAvailabilityTimestamp } : {};
const item = entity?.shoppingCart?.items?.find((i) => i.id === shoppingCartItemId)?.data;
if (!item?.features?.orderType) return s;
itemAvailabilityTimestamp[`${item.id}_${item?.features?.orderType}`] = Date.now();
entity.itemAvailabilityTimestamp = itemAvailabilityTimestamp;
return storeCheckoutAdapter.setOne(entity, s);
}
)
);
export function domainCheckoutReducer(state, action) {
@@ -123,8 +171,20 @@ function getOrCreateCheckoutEntity({ entities, processId }: { entities: Dictiona
notificationChannels: 0,
olaErrorIds: [],
customer: undefined,
// availabilityHistory: [],
itemAvailabilityTimestamp: {},
};
}
return { ...entity };
}
function getCheckoutEntityByShoppingCartId({
entities,
shoppingCartId,
}: {
entities: Dictionary<CheckoutEntity>;
shoppingCartId: number;
}): CheckoutEntity {
return Object.values(entities).find((entity) => entity.shoppingCart?.id === shoppingCartId);
}

View File

@@ -18,14 +18,15 @@ import {
NotificationChannel,
PayerDTO,
PayerService,
QueryTokenDTO,
ResponseArgsOfIEnumerableOfBonusCardInfoDTO,
ShippingAddressDTO,
ShippingAddressService,
} from '@swagger/crm';
import { isArray } from '@utils/common';
import { isArray, memorize } from '@utils/common';
import { PagedResult, Result } from 'apps/domain/defs/src/public-api';
import { Observable, of, ReplaySubject } from 'rxjs';
import { catchError, map, mergeMap, retry } from 'rxjs/operators';
import { catchError, map, mergeMap, retry, shareReplay } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CrmCustomerService {
@@ -38,6 +39,14 @@ export class CrmCustomerService {
private loyaltyCardService: LoyaltyCardService
) {}
@memorize()
filterSettings() {
return this.customerService.CustomerCustomerQuerySettings().pipe(
map((res) => res.result),
shareReplay(1)
);
}
complete(queryString: string, filter?: { [key: string]: string }): Observable<Result<AutocompleteDTO[]>> {
return this.customerService.CustomerCustomerAutocomplete({
input: queryString,
@@ -66,6 +75,15 @@ export class CrmCustomerService {
});
}
getCustomersWithQueryToken(queryToken: QueryTokenDTO) {
if (queryToken.skip === undefined) queryToken.skip = 0;
if (queryToken.take === undefined) queryToken.take = 20;
if (queryToken.input === undefined) queryToken.input = { qs: '' };
if (queryToken.filter === undefined) queryToken.filter = {};
return this.customerService.CustomerListCustomers(queryToken);
}
getCustomersByCustomerCardNumber(queryString: string): Observable<PagedResult<CustomerInfoDTO>> {
return this.customerService.CustomerGetCustomerByBonuscard(!!queryString ? queryString : undefined);
}

View File

@@ -0,0 +1,88 @@
import { ActionHandler } from '@core/command';
import {
AcceptedActionHandler,
ArrivedActionHandler,
AssembledActionHandler,
AvailableForDownloadActionHandler,
BackToStockActionHandler,
CanceledByBuyerActionHandler,
CanceledByRetailerActionHandler,
CanceledBySupplierActionHandler,
CreateShippingNoteActionHandler,
DeliveredActionHandler,
DetermineSupplierActionHandler,
DispatchedActionHandler,
DownloadedActionHandler,
FetchedActionHandler,
InProcessActionHandler,
NotAvailableActionHandler,
NotFetchedActionHandler,
OrderAtSupplierActionHandler,
OrderingActionHandler,
OverdueActionHandler,
PackedActionHandler,
ParkedActionHandler,
PlacedActionHandler,
PreparationForShippingActionHandler,
PrintCompartmentLabelActionHandler,
PrintShippingNoteActionHandler,
ReOrderActionHandler,
RedirectedInternaqllyActionHandler,
RequestedActionHandler,
ReserverdActionHandler,
ReturnedByBuyerActionHandler,
ShippingNoteActionHandler,
SupplierTemporarilyOutOfStockActionHandler,
ReOrderedActionHandler,
CollectOnDeliveryNoteActionHandler,
PrintPriceDiffQrCodeLabelActionHandler,
CollectWithSmallAmountinvoiceActionHandler,
PrintSmallamountinvoiceActionHandler,
ShopWithKulturpassActionHandler,
ChangeOrderItemStatusBaseActionHandler,
CreateReturnItemActionHandler,
} from './action-handlers';
import { Type } from '@angular/core';
export const ActionHandlerServices: Type<ActionHandler>[] = [
AcceptedActionHandler,
ArrivedActionHandler,
AssembledActionHandler,
AvailableForDownloadActionHandler,
BackToStockActionHandler,
CanceledByBuyerActionHandler,
CanceledByRetailerActionHandler,
CanceledBySupplierActionHandler,
CreateShippingNoteActionHandler,
DeliveredActionHandler,
DetermineSupplierActionHandler,
DispatchedActionHandler,
DownloadedActionHandler,
FetchedActionHandler,
InProcessActionHandler,
NotAvailableActionHandler,
NotFetchedActionHandler,
OrderAtSupplierActionHandler,
OrderingActionHandler,
OverdueActionHandler,
PackedActionHandler,
ParkedActionHandler,
PlacedActionHandler,
PreparationForShippingActionHandler,
PrintCompartmentLabelActionHandler,
PrintShippingNoteActionHandler,
ReOrderActionHandler,
RedirectedInternaqllyActionHandler,
RequestedActionHandler,
ReserverdActionHandler,
ReturnedByBuyerActionHandler,
ShippingNoteActionHandler,
SupplierTemporarilyOutOfStockActionHandler,
ReOrderedActionHandler,
CollectOnDeliveryNoteActionHandler,
PrintPriceDiffQrCodeLabelActionHandler,
CollectWithSmallAmountinvoiceActionHandler,
PrintSmallamountinvoiceActionHandler,
ShopWithKulturpassActionHandler,
CreateReturnItemActionHandler,
];

View File

@@ -21,6 +21,7 @@ export class CollectOnDeliveryNoteActionHandler extends ActionHandler<OrderItems
const response = await this.orderService
.OrderCollectOnDeliveryNote({
data,
eagerLoading: 1,
})
.toPromise();
@@ -29,7 +30,7 @@ export class CollectOnDeliveryNoteActionHandler extends ActionHandler<OrderItems
return {
...context,
receipts: response.result,
receipts: response.result.map((r) => r.data),
};
}
}

View File

@@ -0,0 +1,35 @@
import { Injectable } from '@angular/core';
import { ActionHandler } from '@core/command';
import { OrderService } from '@swagger/oms';
import { OrderItemsContext } from './order-items.context';
@Injectable()
export class CollectWithSmallAmountinvoiceActionHandler extends ActionHandler<OrderItemsContext> {
constructor(private orderService: OrderService) {
super('COLLECT_WITH_SMALLAMOUNTINVOICE');
}
async handler(context: OrderItemsContext): Promise<OrderItemsContext> {
const data: Record<number, number> = {};
context.items.forEach((orderItemSubsetId) => {
data[orderItemSubsetId.orderItemSubsetId] =
context.itemQuantity?.get(orderItemSubsetId.orderItemSubsetId) ?? orderItemSubsetId.quantity;
});
const response = await this.orderService
.OrderCollectWithSmallAmountInvoice({
data,
eagerLoading: 1,
})
.toPromise();
// Für korrekte Navigation nach Aufruf, da ProcessingStatus Serverseitig auf abgeholt gesetzt wird
context.items?.forEach((i) => (i.processingStatus = 256));
return {
...context,
receipts: response.result.map((r) => r.data),
};
}
}

View File

@@ -1,4 +1,3 @@
// start:ng42.barrel
export * from './accepted.action-handler';
export * from './arrived.action-handler';
export * from './assembled.action-handler';
@@ -7,6 +6,10 @@ export * from './back-to-stock.action-handler';
export * from './canceled-by-buyer.action-handler';
export * from './canceled-by-retailer.action-handler';
export * from './canceled-by-supplier.action-handler';
export * from './change-order-item-status-base.action-handler';
export * from './collect-on-deliverynote.action-handler';
export * from './collect-with-smallamountinvoice.action-handler';
export * from './create-returnitem.action-handler';
export * from './create-shipping-note.action-handler';
export * from './delivered.action-handler';
export * from './determine-supplier.action-handler';
@@ -25,16 +28,15 @@ export * from './parked.action-handler';
export * from './placed.action-handler';
export * from './preperation-for-shipping.action-handler';
export * from './print-compartment-label.action-handler';
export * from './print-pricediffqrcodelabel.action-handler';
export * from './print-shipping-note.action-handler';
export * from './re-ordered.action-handler';
export * from './print-smallamountinvoice.action-handler';
export * from './re-order.action-handler';
export * from './re-ordered.action-handler';
export * from './redirected-internally.action-handler';
export * from './requested.action-handler';
export * from './reserved.action-handler';
export * from './returned-by-buyer.action-handler';
export * from './shipping-note.action-handler';
export * from './shop-with-kulturpass.action-handler';
export * from './supplier-temporarily-out-of-stock.action-handler copy';
export * from './collect-on-deliverynote.action-handler';
export * from './create-returnitem.action-handler';
export * from './print-pricediffqrcodelabel.action-handler';
// end:ng42.barrel

View File

@@ -1,4 +1,4 @@
import { OrderItemListItemDTO, ReceiptDTO } from '@swagger/oms';
import { OrderItemListItemDTO, ReceiptDTO, OrderDTO } from '@swagger/oms';
export interface OrderItemsContext {
items: OrderItemListItemDTO[];
@@ -12,4 +12,6 @@ export interface OrderItemsContext {
receipts?: ReceiptDTO[];
shippingDelayComment?: string;
order?: OrderDTO;
}

View File

@@ -27,7 +27,8 @@ export class PrintShippingNoteActionHandler extends ActionHandler<OrderItemsCont
printerType: 'Label',
print: async (printer) => {
try {
for (const group of groupBy(data?.receipts, (receipt) => receipt?.buyer?.buyerNumber)) {
const receipts = data?.receipts?.filter((r) => r?.receiptType & 1);
for (const group of groupBy(receipts, (receipt) => receipt?.buyer?.buyerNumber)) {
await this.domainPrinterService.printShippingNote({ printer, receipts: group?.items?.map((r) => r?.id) }).toPromise();
}
return {

View File

@@ -0,0 +1,56 @@
import { Injectable } from '@angular/core';
import { ActionHandler } from '@core/command';
import { OrderItemsContext } from './order-items.context';
import { OMSPrintService } from '@swagger/print';
import { UiModalService } from '@ui/modal';
import { PrintModalComponent, PrintModalData } from '@modal/printer';
import { NativeContainerService } from 'native-container';
import { groupBy } from '@ui/common';
@Injectable()
export class PrintSmallamountinvoiceActionHandler extends ActionHandler<OrderItemsContext> {
constructor(
private uiModal: UiModalService,
private omsPrintService: OMSPrintService,
private nativeContainerService: NativeContainerService
) {
super('PRINT_SMALLAMOUNTINVOICE');
}
async handler(data: OrderItemsContext): Promise<OrderItemsContext> {
await this.uiModal
.open({
content: PrintModalComponent,
config: { showScrollbarY: false },
data: {
printImmediately: !this.nativeContainerService.isNative,
printerType: 'Label',
print: async (printer) => {
try {
const receipts = data?.receipts?.filter((r) => r?.receiptType & 128);
for (const group of groupBy(receipts, (receipt) => receipt?.buyer?.buyerNumber)) {
await this.omsPrintService
.OMSPrintKleinbetragsrechnung({
data: group?.items?.map((r) => r?.id),
printer,
})
.toPromise();
}
return {
error: false,
};
} catch (error) {
console.error(error);
return {
error: true,
message: error?.message || error,
};
}
},
} as PrintModalData,
})
.afterClosed$.toPromise();
return data;
}
}

View File

@@ -5,7 +5,7 @@ import { UiModalService } from '@ui/modal';
import { ReorderModalComponent, ReorderResult } from '@modal/reorder';
import { DomainCheckoutService } from '@domain/checkout';
import { AvailabilityDTO2, OrderItemListItemDTO } from '@swagger/oms';
import { ToastService } from '@core/toast';
import { ToasterService } from '@shared/shell';
@Injectable()
export class ReOrderActionHandler extends ActionHandler<OrderItemsContext> {
@@ -13,7 +13,7 @@ export class ReOrderActionHandler extends ActionHandler<OrderItemsContext> {
private _command: CommandService,
private _domainCheckoutService: DomainCheckoutService,
private _uiModal: UiModalService,
private _toastService: ToastService
private _toastService: ToasterService
) {
super('REORDER');
}
@@ -71,8 +71,8 @@ export class ReOrderActionHandler extends ActionHandler<OrderItemsContext> {
case 'Falscher Titel geliefert (richtiges Etikett)':
break;
default:
this._toastService.create({
title: 'Artikel wurde nachbestellt',
this._toastService.open({
message: 'Artikel wurde nachbestellt',
});
}
}

View File

@@ -0,0 +1,82 @@
import { Injectable } from '@angular/core';
import { OrderItemsContext } from './order-items.context';
import { ActionHandler, CommandService } from '@core/command';
import { KulturpassOrderModalService } from '@shared/modals/kulturpass-order-modal';
import { DisplayOrderItemSubsetDTO, OrderItemListItemDTO, ReceiptDTO } from '@swagger/oms';
import { DomainReceiptService } from '../receipt.service';
import { DomainGoodsService } from '../goods.service';
import { map } from 'rxjs/operators';
@Injectable()
export class ShopWithKulturpassActionHandler extends ActionHandler<OrderItemsContext> {
constructor(
private _modal: KulturpassOrderModalService,
private _receiptService: DomainReceiptService,
private _goodsService: DomainGoodsService
) {
super('SHOP_WITH_KULTURPASS');
}
async handler(data: OrderItemsContext, service: CommandService): Promise<OrderItemsContext> {
const items: OrderItemListItemDTO[] = [];
const receipts: ReceiptDTO[] = [];
let command: string;
for (const item of data.items) {
const result = await this._modal.open({ orderItemListItem: item, order: data.order }).afterClosed$.toPromise();
if (result.data == null) {
return data;
}
const displayOrder = result.data[0];
command = result.data[1];
if (displayOrder) {
const subsetItems = displayOrder.items.reduce((acc, item) => [...acc, ...item.subsetItems], [] as DisplayOrderItemSubsetDTO[]);
const orderItems = await this.getItems(displayOrder.orderNumber);
items.push(...orderItems);
const subsetItemIds = subsetItems.map((item) => item.id);
const r = await this.getReceipts(subsetItemIds);
receipts.push(...r);
}
}
if (!command) {
return {
...data,
items,
receipts,
};
} else {
return service.handleCommand(command, {
...data,
items,
receipts,
});
}
}
getReceipts(ids: number[]) {
return this._receiptService
.getReceipts({
receiptType: 128,
eagerLoading: 1,
ids,
})
.pipe(map((res) => res.result.map((data) => data.item3.data).filter((data) => !!data)))
.toPromise();
}
getItems(orderNumber: string) {
return this._goodsService
.getWarenausgabeItemByOrderNumber(orderNumber, false)
.pipe(map((res) => res.result))
.toPromise();
}
}

View File

@@ -1,5 +1,7 @@
import { Injectable } from '@angular/core';
import { AutocompleteTokenDTO, OrderService, QueryTokenDTO } from '@swagger/oms';
import { memorize } from '@utils/common';
import { map, shareReplay } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class DomainCustomerOrderService {
@@ -14,16 +16,18 @@ export class DomainCustomerOrderService {
// branch_id'
}
getOrderItemsByOrderNumber(orderNumber: string) {
getOrderItemsByOrderNumber(params: { compartmentCode?: string; orderId: number }) {
return this._orderService.OrderKundenbestellungen({
filter: { all_branches: 'true', archive: 'true' },
input: {
qs: orderNumber,
},
input: { order_id: String(params.orderId), compartment_code: params.compartmentCode },
});
}
@memorize()
settings() {
return this._orderService.OrderKundenbestellungenSettings();
return this._orderService.OrderKundenbestellungenSettings().pipe(
map((res) => res?.result),
shareReplay()
);
}
}

View File

@@ -2,6 +2,7 @@
* Public API Surface of oms
*/
export * from './lib/action-handler-services';
export * from './lib/goods.service';
export * from './lib/receipt.service';
export * from './lib/oms.service';

View File

@@ -0,0 +1,11 @@
import { PackageArrivalStatusDTO } from '@swagger/wws';
export abstract class PackageInspectionEvent {
constructor(public readonly type: string) {}
}
export class PackageStatusChangedEvent extends PackageInspectionEvent {
constructor(public readonly packageId: string, public readonly status: PackageArrivalStatusDTO) {
super('PackageStatusChangedEvent');
}
}

View File

@@ -1,10 +1,8 @@
import { Injectable } from '@angular/core';
import {
ListResponseArgsOfPackageDTO,
ListResponseArgsOfPackageDTO2,
PackageArrivalStatusDTO,
PackageDetailResponseDTO,
PackageDTO,
PackageDTO2,
QuerySettingsDTO,
QueryTokenDTO,
@@ -13,13 +11,18 @@ import {
ResponseArgsOfQuerySettingsDTO,
WareneingangService,
} from '@swagger/wws';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Observable, Subject } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { PackageInspectionEvent, PackageStatusChangedEvent } from './events';
@Injectable({
providedIn: 'root',
})
export class DomainPackageInspectionService {
private _events = new Subject<PackageInspectionEvent>();
events = this._events.asObservable();
constructor(private _wareneingang: WareneingangService) {}
getQuerySettingsResponse(): Observable<ResponseArgsOfQuerySettingsDTO> {
@@ -47,23 +50,26 @@ export class DomainPackageInspectionService {
}
changePackageStatusResponse(pkg: PackageDTO2, modifier: string): Observable<ResponseArgsOfPackageArrivalStatusDTO> {
return this._wareneingang.WareneingangChangePackageStatus({
packageId: pkg.id,
payload: {
id: pkg.id,
annotation: pkg.annotation,
area: pkg.area,
arrivalChecked: pkg.arrivalChecked,
arrivalStatus: pkg.arrivalStatus,
deliveryNoteNumber: pkg.deliveryNoteNumber,
deliveryTarget: pkg.deliveryTarget,
estimatedDeliveryDate: pkg.estimatedDeliveryDate,
packageNumber: pkg.packageNumber,
supplier: pkg.supplier,
trackingNumber: pkg.trackingNumber,
},
modifier,
});
return this._wareneingang
.WareneingangChangePackageStatus({
packageId: pkg.id,
payload: {
id: pkg.id,
annotation: pkg.annotation,
area: pkg.area,
arrivalChecked: pkg.arrivalChecked,
arrivalStatus: pkg.arrivalStatus,
deliveryNoteNumber: pkg.deliveryNoteNumber,
deliveryTarget: pkg.deliveryTarget,
estimatedDeliveryDate: pkg.estimatedDeliveryDate,
packageNumber: pkg.packageNumber,
supplier: pkg.supplier,
trackingNumber: pkg.trackingNumber,
scanId: pkg.scanId,
},
modifier,
})
.pipe(tap((res) => this._events.next(new PackageStatusChangedEvent(pkg.id, res.result))));
}
changePackageStatus(pkg: PackageDTO2, modifier: string): Observable<PackageArrivalStatusDTO> {

View File

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

View File

@@ -0,0 +1,60 @@
import { Injectable, inject } from '@angular/core';
import { AbholfachService, AutocompleteTokenDTO, ListResponseArgsOfDBHOrderItemListItemDTO, QueryTokenDTO } from '@swagger/oms';
import { PickupShelfIOService } from './pickup-shelf-io.service';
import { Observable, throwError } from 'rxjs';
import { Filter } from '@shared/components/filter';
@Injectable({ providedIn: 'root' })
export class PickupShelfInService extends PickupShelfIOService {
private _abholfachService = inject(AbholfachService);
name() {
return 'PickupShelfInService';
}
getQuerySettings() {
return this._abholfachService.AbholfachWareneingangQuerySettings();
}
search(queryToken: QueryTokenDTO) {
return this._abholfachService.AbholfachWareneingang(queryToken);
}
complete(autocompleteToken: AutocompleteTokenDTO) {
return this._abholfachService.AbholfachWareneingangAutocomplete(autocompleteToken);
}
getOrderItemsByOrderNumberOrCompartmentCode(args: {
orderNumber?: string;
compartmentCode?: string;
filter?: Filter;
}): Observable<ListResponseArgsOfDBHOrderItemListItemDTO> {
if (!args.orderNumber && !args.compartmentCode) {
return throwError(
'PickupShelfInService.getOrderItemsByOrderNumberOrCompartmentCode(): Either orderNumber or compartmentCode must be provided.'
);
}
const { orderdate } = args.filter?.getQueryToken()?.filter ?? {};
return this._abholfachService.AbholfachWareneingang({
input: {
qs: args.compartmentCode ?? args.orderNumber,
},
filter: {
archive: String(true),
all_branches: String(true),
orderdate,
},
});
}
getOrderItemsByCustomerNumber(args: { customerNumber: string }): Observable<ListResponseArgsOfDBHOrderItemListItemDTO> {
return this._abholfachService.AbholfachWareneingang({
filter: { orderitemprocessingstatus: '16;128;8192;1048576' },
input: {
customer_name: args.customerNumber,
},
});
}
}

View File

@@ -0,0 +1,29 @@
import { Injectable } from '@angular/core';
import { Filter } from '@shared/components/filter';
import {
AutocompleteTokenDTO,
ListResponseArgsOfDBHOrderItemListItemDTO,
QueryTokenDTO,
ResponseArgsOfIEnumerableOfAutocompleteDTO,
ResponseArgsOfQuerySettingsDTO,
} from '@swagger/oms';
import { Observable } from 'rxjs';
@Injectable()
export abstract class PickupShelfIOService {
abstract name(): string;
abstract getQuerySettings(): Observable<ResponseArgsOfQuerySettingsDTO>;
abstract search(queryToken: QueryTokenDTO): Observable<ListResponseArgsOfDBHOrderItemListItemDTO>;
abstract complete(autocompleteToken: AutocompleteTokenDTO): Observable<ResponseArgsOfIEnumerableOfAutocompleteDTO>;
abstract getOrderItemsByOrderNumberOrCompartmentCode(args: {
orderNumber?: string;
compartmentCode?: string;
filter?: Filter;
}): Observable<ListResponseArgsOfDBHOrderItemListItemDTO>;
abstract getOrderItemsByCustomerNumber(args: { customerNumber: string }): Observable<ListResponseArgsOfDBHOrderItemListItemDTO>;
}

View File

@@ -0,0 +1,55 @@
import { Injectable, inject } from '@angular/core';
import { AbholfachService, AutocompleteTokenDTO, ListResponseArgsOfDBHOrderItemListItemDTO, QueryTokenDTO } from '@swagger/oms';
import { PickupShelfIOService } from './pickup-shelf-io.service';
import { Observable, throwError } from 'rxjs';
import { Filter } from '@shared/components/filter';
@Injectable({ providedIn: 'root' })
export class PickupShelfOutService extends PickupShelfIOService {
private _abholfachService = inject(AbholfachService);
name() {
return 'PickupShelfOutService';
}
getQuerySettings() {
return this._abholfachService.AbholfachWarenausgabeQuerySettings();
}
search(queryToken: QueryTokenDTO) {
return this._abholfachService.AbholfachWarenausgabe(queryToken);
}
complete(autocompleteToken: AutocompleteTokenDTO) {
return this._abholfachService.AbholfachWarenausgabeAutocomplete(autocompleteToken);
}
getOrderItemsByOrderNumberOrCompartmentCode(args: {
orderNumber?: string;
compartmentCode?: string;
filter?: Filter;
}): Observable<ListResponseArgsOfDBHOrderItemListItemDTO> {
if (!args.orderNumber && !args.compartmentCode) {
return throwError(
'PickupShelfOutService.getOrderItemsByOrderNumberOrCompartmentCode(): Either orderNumber or compartmentCode must be provided.'
);
}
const { orderdate } = args.filter?.getQueryToken()?.filter ?? {};
return this._abholfachService.AbholfachWarenausgabe({
input: {
qs: args.compartmentCode ?? args.orderNumber,
},
filter: {
archive: String(true),
all_branches: String(true),
orderdate,
},
});
}
getOrderItemsByCustomerNumber(args: { customerNumber: string }): Observable<ListResponseArgsOfDBHOrderItemListItemDTO> {
throw new Error('Method not implemented.');
}
}

View File

@@ -0,0 +1,27 @@
import { Injectable, inject } from '@angular/core';
import { DBHOrderItemListItemDTO, OrderItemDTO, OrderItemSubsetDTO, OrderService } from '@swagger/oms';
@Injectable({ providedIn: 'root' })
export class PickupShelfService {
private _orderService = inject(OrderService);
getOrderByOrderId(orderId: number) {
return this._orderService.OrderGetOrder(orderId);
}
patchOrderItemSubset(item: DBHOrderItemListItemDTO, changes: Partial<OrderItemSubsetDTO>) {
return this._orderService.OrderPatchOrderItemSubset({
orderId: item.orderId,
orderItemId: item.orderItemId,
orderItemSubsetId: item.orderItemSubsetId,
orderItemSubset: changes,
});
}
getOrderItemSubsetTasks(item: DBHOrderItemListItemDTO) {
return this._orderService.OrderGetOrderItemSubsetTasks({
orderId: item.orderId,
orderItemId: item.orderItemId,
orderItemSubsetId: item.orderItemSubsetId,
});
}
}

View File

@@ -0,0 +1,4 @@
export * from './lib/pickup-shelf-in.service';
export * from './lib/pickup-shelf-io.service';
export * from './lib/pickup-shelf-out.service';
export * from './lib/pickup-shelf.service';

View File

@@ -1,4 +1,5 @@
// start:ng42.barrel
export * from './hub-notification.module';
export * from './notifications.hub';
export * from './defs';
// end:ng42.barrel

View File

@@ -4,61 +4,118 @@ import { SignalrHub, SignalRHubOptions } from '@core/signalr';
import { BehaviorSubject, merge, of } from 'rxjs';
import { filter, map, shareReplay, tap, withLatestFrom } from 'rxjs/operators';
import { EnvelopeDTO, MessageBoardItemDTO } from './defs';
import { cloneDeep } from 'lodash';
export const NOTIFICATIONS_HUB_OPTIONS = new InjectionToken<SignalRHubOptions>('hub.notifications.options');
@Injectable()
export class NotificationsHub extends SignalrHub {
updateNotification$ = new BehaviorSubject<MessageBoardItemDTO>(undefined);
get branchNo() {
return String(this._auth.getClaimByKey('branch_no') || this._auth.getClaimByKey('sub'));
}
// get sessionStoragesessionStorageKey() {
// return `NOTIFICATIONS_BOARD_${this.branchNo}`;
// }
get sessionStoragesessionStorageKey() {
return `NOTIFICATIONS_BOARD_${this.branchNo}`;
return `NOTIFICATIONS_BOARD_AREA_${this.branchNo}`;
}
messageBoardItems$ = new BehaviorSubject<Record<string, MessageBoardItemDTO[]>>({});
constructor(@Inject(NOTIFICATIONS_HUB_OPTIONS) options: SignalRHubOptions, private _auth: AuthService) {
super(options);
this.messageBoardItems$.next(this._getNotifications());
this.messageBoardItems$.subscribe((data) => {
this._storeNotifactions(data);
});
this.listen<EnvelopeDTO<MessageBoardItemDTO[]>>('messageBoard').subscribe((envelope) => {
if (envelope.action === 'refresh') {
this.refreshMessageBoardItems(envelope.target.area, envelope.data);
}
});
}
notifications$ = merge(
of(this._getNotifications()).pipe(filter((f) => !!f)),
this.listen<EnvelopeDTO<MessageBoardItemDTO[]>>('messageBoard')
).pipe(
withLatestFrom(this.updateNotification$),
map(([d, update]) => {
const data = d;
if (update && !!data && !data?.data?.find((message) => message?.category === 'ISA-Update')) {
data.data.push(update);
refreshMessageBoardItems(targetArea: string, messages: MessageBoardItemDTO[]) {
const current = cloneDeep(this.messageBoardItems$.value);
current[targetArea] = messages ?? [];
this.messageBoardItems$.next(current);
}
notifications$ = this.messageBoardItems$.asObservable().pipe(
map((data) => {
const messages = { ...data };
const keys = Object.keys(data);
for (let key of keys) {
if (data[key].length === 0 || data[key] === undefined) {
delete messages[key];
}
}
return data;
}),
tap((data) => this._storeNotifactions(data)),
shareReplay(1)
return messages;
})
);
private _storeNotifactions(data: EnvelopeDTO<MessageBoardItemDTO[]>) {
if (data) {
sessionStorage.setItem(this.sessionStoragesessionStorageKey, JSON.stringify(data));
}
}
// notifications$ = merge(
// of(this._getNotifications()).pipe(filter((f) => !!f)),
// this.listen<EnvelopeDTO<MessageBoardItemDTO[]>>('messageBoard')
// ).pipe(
// withLatestFrom(this.updateNotification$),
// map(([d, update]) => {
// console.log('notifications$', d, update);
// const data = d;
// if (update && !!data && !data?.data?.find((message) => message?.category === 'ISA-Update')) {
// data.data.push(update);
// }
// return data;
// }),
// tap((data) => this._storeNotifactions(data)),
// shareReplay(1)
// );
private _getNotifications(): EnvelopeDTO<MessageBoardItemDTO[]> {
// private _storeNotifactions(data: EnvelopeDTO<MessageBoardItemDTO[]>) {
// if (data) {
// sessionStorage.setItem(this.sessionStoragesessionStorageKey, JSON.stringify(data));
// }
// }
// private _getNotifications(): EnvelopeDTO<MessageBoardItemDTO[]> {
// const stringData = sessionStorage.getItem(this.sessionStoragesessionStorageKey);
// if (stringData) {
// return JSON.parse(stringData);
// }
// return undefined;
// }
private _getNotifications(): Record<string, MessageBoardItemDTO[]> {
const stringData = sessionStorage.getItem(this.sessionStoragesessionStorageKey);
if (stringData) {
return JSON.parse(stringData);
}
return undefined;
return {};
}
private _storeNotifactions(data: Record<string, MessageBoardItemDTO[]>) {
if (data) {
delete data['messageBoard/isa-update'];
sessionStorage.setItem(this.sessionStoragesessionStorageKey, JSON.stringify(data));
}
}
updateNotification() {
this.updateNotification$.next({
category: 'ISA-Update',
type: 'update',
headline: 'Update Benachrichtigung',
text: 'Es steht eine aktuellere Version der ISA bereit. Bitte aktualisieren Sie die Anwendung.',
});
this.refreshMessageBoardItems('messageBoard/isa-update', [
{
category: 'ISA-Update',
type: 'update',
headline: 'Update Benachrichtigung',
text: 'Es steht eine aktuellere Version der ISA bereit. Bitte aktualisieren Sie die Anwendung.',
},
]);
}
}

View File

@@ -1,9 +1,11 @@
import { isDevMode, NgModule } from '@angular/core';
import { inject, isDevMode, NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import {
CanActivateCartGuard,
CanActivateCartWithProcessIdGuard,
CanActivateCustomerGuard,
CanActivateCustomerOrdersGuard,
CanActivateCustomerOrdersWithProcessIdGuard,
CanActivateCustomerWithProcessIdGuard,
CanActivateGoodsInGuard,
CanActivateGoodsOutGuard,
@@ -20,6 +22,9 @@ import { MainComponent } from './main.component';
import { PreviewComponent } from './preview';
import { BranchSectionResolver, CustomerSectionResolver, ProcessIdResolver } from './resolvers';
import { TokenLoginComponent, TokenLoginModule } from './token-login';
import { ApplicationService } from '@core/application';
import { ProcessIdGuard } from './guards/process-id.guard';
import { ActivateProcessIdGuard, ActivateProcessIdWithConfigKeyGuard } from './guards/activate-process-id.guard';
const routes: Routes = [
{
@@ -34,111 +39,111 @@ const routes: Routes = [
canActivate: [IsAuthenticatedGuard],
children: [
{
path: '',
canActivate: [],
path: 'kunde',
component: MainComponent,
children: [
{
path: 'kunde',
component: MainComponent,
children: [
{
path: 'dashboard',
loadChildren: () => import('@page/dashboard').then((m) => m.DashboardModule),
},
{
path: 'product',
loadChildren: () => import('@page/catalog').then((m) => m.PageCatalogModule),
canActivate: [CanActivateProductGuard],
},
{
path: ':processId/product',
loadChildren: () => import('@page/catalog').then((m) => m.PageCatalogModule),
canActivate: [CanActivateProductWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{
path: 'order',
loadChildren: () => import('@page/customer-order').then((m) => m.CustomerOrderModule),
canActivate: [CanActivateGoodsOutGuard],
},
{
path: ':processId/order',
loadChildren: () => import('@page/customer-order').then((m) => m.CustomerOrderModule),
canActivate: [CanActivateGoodsOutWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{
path: 'customer',
loadChildren: () => import('@page/customer').then((m) => m.PageCustomerModule),
canActivate: [CanActivateCustomerGuard],
},
{
path: ':processId/customer',
loadChildren: () => import('@page/customer').then((m) => m.PageCustomerModule),
canActivate: [CanActivateCustomerWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{
path: 'cart',
loadChildren: () => import('@page/checkout').then((m) => m.PageCheckoutModule),
canActivate: [CanActivateCartGuard],
},
{
path: ':processId/cart',
loadChildren: () => import('@page/checkout').then((m) => m.PageCheckoutModule),
canActivate: [CanActivateCartWithProcessIdGuard],
},
{
path: 'goods/out',
loadChildren: () => import('@page/goods-out').then((m) => m.GoodsOutModule),
canActivate: [CanActivateGoodsOutGuard],
},
{
path: ':processId/goods/out',
loadChildren: () => import('@page/goods-out').then((m) => m.GoodsOutModule),
canActivate: [CanActivateGoodsOutWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{ path: '**', redirectTo: 'dashboard', pathMatch: 'full' },
],
resolve: { section: CustomerSectionResolver },
path: 'dashboard',
loadChildren: () => import('@page/dashboard').then((m) => m.DashboardModule),
},
{
path: 'filiale',
component: MainComponent,
children: [
{
path: 'task-calendar',
loadChildren: () => import('@page/task-calendar').then((m) => m.PageTaskCalendarModule),
canActivate: [CanActivateTaskCalendarGuard],
},
{
path: 'goods/in',
loadChildren: () => import('@page/goods-in').then((m) => m.GoodsInModule),
canActivate: [CanActivateGoodsInGuard],
},
{
path: 'remission',
loadChildren: () => import('@page/remission').then((m) => m.PageRemissionModule),
canActivate: [CanActivateRemissionGuard],
},
{
path: 'package-inspection',
loadChildren: () => import('@page/package-inspection').then((m) => m.PackageInspectionModule),
canActivate: [CanActivatePackageInspectionGuard],
},
{
path: 'assortment',
loadChildren: () => import('@page/assortment').then((m) => m.AssortmentModule),
canActivate: [CanActivateAssortmentGuard],
},
{ path: '**', redirectTo: 'task-calendar', pathMatch: 'full' },
],
resolve: { section: BranchSectionResolver },
path: 'product',
loadChildren: () => import('@page/catalog').then((m) => m.PageCatalogModule),
canActivate: [CanActivateProductGuard],
},
{ path: '**', redirectTo: 'kunde', pathMatch: 'full' },
{
path: ':processId/product',
loadChildren: () => import('@page/catalog').then((m) => m.PageCatalogModule),
canActivate: [CanActivateProductWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{
path: 'order',
loadChildren: () => import('@page/customer-order').then((m) => m.CustomerOrderModule),
canActivate: [CanActivateCustomerOrdersGuard],
},
{
path: ':processId/order',
loadChildren: () => import('@page/customer-order').then((m) => m.CustomerOrderModule),
canActivate: [CanActivateCustomerOrdersWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{
path: 'customer',
loadChildren: () => import('@page/customer').then((m) => m.CustomerModule),
canActivate: [CanActivateCustomerGuard],
},
{
path: ':processId/customer',
loadChildren: () => import('@page/customer').then((m) => m.CustomerModule),
canActivate: [CanActivateCustomerWithProcessIdGuard],
resolve: { processId: ProcessIdResolver },
},
{
path: 'cart',
loadChildren: () => import('@page/checkout').then((m) => m.PageCheckoutModule),
canActivate: [CanActivateCartGuard],
},
{
path: ':processId/cart',
loadChildren: () => import('@page/checkout').then((m) => m.PageCheckoutModule),
canActivate: [CanActivateCartWithProcessIdGuard],
},
{
path: 'pickup-shelf',
canActivate: [ProcessIdGuard],
// NOTE: This is a workaround for the canActivate guard not being called
loadChildren: () => import('@page/pickup-shelf').then((m) => m.PickupShelfOutModule),
},
{
path: ':processId/pickup-shelf',
canActivate: [ActivateProcessIdGuard],
loadChildren: () => import('@page/pickup-shelf').then((m) => m.PickupShelfOutModule),
},
{ path: '**', redirectTo: 'dashboard', pathMatch: 'full' },
],
resolve: { section: CustomerSectionResolver },
},
{
path: 'filiale',
component: MainComponent,
children: [
{
path: 'task-calendar',
loadChildren: () => import('@page/task-calendar').then((m) => m.PageTaskCalendarModule),
canActivate: [CanActivateTaskCalendarGuard],
},
{
path: 'pickup-shelf',
canActivate: [ActivateProcessIdWithConfigKeyGuard('pickupShelf')],
// NOTE: This is a workaround for the canActivate guard not being called
loadChildren: () => import('@page/pickup-shelf').then((m) => m.PickupShelfInModule),
},
{
path: 'goods/in',
loadChildren: () => import('@page/goods-in').then((m) => m.GoodsInModule),
canActivate: [CanActivateGoodsInGuard],
},
{
path: 'remission',
loadChildren: () => import('@page/remission').then((m) => m.PageRemissionModule),
canActivate: [CanActivateRemissionGuard],
},
{
path: 'package-inspection',
loadChildren: () => import('@page/package-inspection').then((m) => m.PackageInspectionModule),
canActivate: [CanActivatePackageInspectionGuard],
},
{
path: 'assortment',
loadChildren: () => import('@page/assortment').then((m) => m.AssortmentModule),
canActivate: [CanActivateAssortmentGuard],
},
{ path: '**', redirectTo: 'task-calendar', pathMatch: 'full' },
],
resolve: { section: BranchSectionResolver },
},
{ path: '**', redirectTo: 'kunde', pathMatch: 'full' },
],
},
];

View File

@@ -116,6 +116,7 @@ export class AppComponent implements OnInit {
checkForUpdate() {
interval(this._checkForUpdates).subscribe(() => {
this._swUpdate.checkForUpdate().then((value) => {
console.log('check for update', value);
if (value) {
this._notifications.updateNotification();
}
@@ -125,6 +126,7 @@ export class AppComponent implements OnInit {
initialCheckForUpdate() {
this._swUpdate.checkForUpdate().then((value) => {
console.log('initial check for update', value);
if (value) {
location.reload();
}

View File

@@ -32,11 +32,11 @@ import { IsaErrorHandler } from './providers/isa.error-handler';
import { ScanAdapterModule, ScanAdapterService, ScanditScanAdapterModule } from '@adapter/scan';
import { RootStateService } from './store/root-state.service';
import * as Commands from './commands';
import { UiIconModule, UI_ICON_CFG } from '@ui/icon';
import { PreviewComponent } from './preview';
import { NativeContainerService } from 'native-container';
import { ShellModule } from '@shared/shell';
import { MainComponent } from './main.component';
import { IconModule } from '@shared/components/icon';
registerLocaleData(localeDe, localeDeExtra);
registerLocaleData(localeDe, 'de', localeDeExtra);
@@ -106,7 +106,7 @@ export function _notificationsHubOptionsFactory(config: Config, auth: AuthServic
ScanAdapterModule.forRoot(),
ScanditScanAdapterModule.forRoot(),
PlatformModule,
UiIconModule.forRoot(),
IconModule.forRoot(),
],
providers: [
{
@@ -135,11 +135,6 @@ export function _notificationsHubOptionsFactory(config: Config, auth: AuthServic
useClass: IsaErrorHandler,
},
{ provide: LOCALE_ID, useValue: 'de-DE' },
{
provide: UI_ICON_CFG,
useFactory: (config: Config) => config.get('@ui/icon'),
deps: [Config],
},
],
bootstrap: [AppComponent],
})

View File

@@ -0,0 +1,46 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Config } from '@core/config';
import { take } from 'rxjs/operators';
export const ActivateProcessIdGuard: CanActivateFn = async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
const application = inject(ApplicationService);
const processIdStr = route.params.processId;
if (!processIdStr) {
return false;
}
const processId = Number(processIdStr);
// Check if Process already exists
const process = await application.getProcessById$(processId).pipe(take(1)).toPromise();
if (!process) {
application.createCustomerProcess(processId);
}
application.activateProcess(processId);
return true;
};
export const ActivateProcessIdWithConfigKeyGuard: (key: string) => CanActivateFn = (key) => async (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
) => {
const application = inject(ApplicationService);
const config = inject(Config);
const processId = config.get(`process.ids.${key}`);
if (isNaN(processId)) {
return false;
}
application.activateProcess(processId);
return true;
};

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Config } from '@core/config';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateAssortmentGuard implements CanActivate {
export class CanActivateAssortmentGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _config: Config) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -1,10 +1,10 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateCartWithProcessIdGuard implements CanActivate {
export class CanActivateCartWithProcessIdGuard {
constructor(private readonly _applicationService: ApplicationService) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -1,11 +1,12 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { CheckoutNavigationService } from '@shared/services';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateCartGuard implements CanActivate {
constructor(private readonly _applicationService: ApplicationService, private readonly _router: Router) {}
export class CanActivateCartGuard {
constructor(private readonly _applicationService: ApplicationService, private _checkoutNavigationService: CheckoutNavigationService) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const processes = await this._applicationService.getProcesses$('customer').pipe(first()).toPromise();
@@ -21,7 +22,7 @@ export class CanActivateCartGuard implements CanActivate {
name: `Vorgang ${processes.length + 1}`,
});
}
await this._router.navigate(['/kunde', lastActivatedProcessId, 'cart']);
await this._checkoutNavigationService.getCheckoutReviewPath(lastActivatedProcessId).path;
return false;
}
}

View File

@@ -0,0 +1,64 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { BreadcrumbService } from '@core/breadcrumb';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateCustomerOrdersWithProcessIdGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _breadcrumbService: BreadcrumbService) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const process = await this._applicationService
.getProcessById$(+route.params.processId)
.pipe(first())
.toPromise();
if (!process) {
const processes = await this._applicationService.getProcesses$('customer').pipe(first()).toPromise();
await this._applicationService.createProcess({
id: +route.params.processId,
type: 'cart',
section: 'customer',
name: `Vorgang ${this.processNumber(processes.filter((process) => process.type === 'cart'))}`,
});
}
await this.removeBreadcrumbWithSameProcessId(route);
this._applicationService.activateProcess(+route.params.processId);
return true;
}
// Fix #3292: Alle Breadcrumbs die nichts mit dem aktuellen Prozess zu tun haben, müssen removed werden
async removeBreadcrumbWithSameProcessId(route: ActivatedRouteSnapshot) {
const crumbs = await this._breadcrumbService
.getBreadcrumbByKey$(+route.params.processId)
.pipe(first())
.toPromise();
// Entferne alle Crumbs die nichts mit den Kundenbestellungen zu tun haben
if (crumbs.length > 1) {
const crumbsToRemove = crumbs.filter((crumb) => crumb.tags.find((tag) => tag === 'customer-order') === undefined);
for (const crumb of crumbsToRemove) {
await this._breadcrumbService.removeBreadcrumb(crumb.id);
}
}
}
processNumber(processes: ApplicationProcess[]) {
const processNumbers = processes?.map((process) => Number(process?.name?.replace(/\D/g, '')));
return !!processNumbers && processNumbers.length > 0 ? this.findMissingNumber(processNumbers) : 1;
}
findMissingNumber(processNumbers: number[]) {
// Ticket #3272 Bei Klick auf "+" bzw. neuen Prozess hinzufügen soll der neue Tab immer die höchste Nummer haben (wie aktuell im Produktiv)
// ----------------------------------------------------------------------------------------------------------------------------------------
// for (let missingNumber = 1; missingNumber < Math.max(...processNumbers); missingNumber++) {
// if (!processNumbers.find((number) => number === missingNumber)) {
// return missingNumber;
// }
// }
return Math.max(...processNumbers) + 1;
}
}

View File

@@ -0,0 +1,97 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { DomainCheckoutService } from '@domain/checkout';
import { CustomerOrdersNavigationService } from '@shared/services';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateCustomerOrdersGuard {
constructor(
private readonly _applicationService: ApplicationService,
private readonly _checkoutService: DomainCheckoutService,
private readonly _navigationService: CustomerOrdersNavigationService
) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const processes = await this._applicationService.getProcesses$('customer').pipe(first()).toPromise();
let lastActivatedProcessId = (
await this._applicationService.getLastActivatedProcessWithSectionAndType$('customer', 'cart').pipe(first()).toPromise()
)?.id;
const lastActivatedCartCheckoutProcessId = (
await this._applicationService.getLastActivatedProcessWithSectionAndType$('customer', 'cart-checkout').pipe(first()).toPromise()
)?.id;
const activatedProcessId = await this._applicationService.getActivatedProcessId$().pipe(first()).toPromise();
// Darf nur reinkommen wenn der aktuell aktive Tab ein Bestellabschluss Tab ist
if (!!lastActivatedCartCheckoutProcessId && lastActivatedCartCheckoutProcessId === activatedProcessId) {
await this.fromCartCheckoutProcess(processes, route, lastActivatedCartCheckoutProcessId);
return false;
}
if (!lastActivatedProcessId) {
await this.fromGoodsOutProcess(processes, route);
return false;
} else {
await this._navigationService.getCustomerOrdersBasePath(lastActivatedProcessId).navigate();
}
return false;
}
// Bei offenen Kundenbestellungen und Klick auf Kundenbestellungen
async fromGoodsOutProcess(processes: ApplicationProcess[], route: ActivatedRouteSnapshot) {
const newProcessId = Date.now();
await this._applicationService.createProcess({
id: newProcessId,
type: 'cart',
section: 'customer',
name: `Vorgang ${this.processNumber(processes.filter((process) => process.type === 'cart'))}`,
});
await this._navigationService.getCustomerOrdersBasePath(newProcessId).navigate();
}
// Bei offener Bestellbestätigung und Klick auf Kundenbestellungen
async fromCartCheckoutProcess(processes: ApplicationProcess[], route: ActivatedRouteSnapshot, processId: number) {
// Um alle Checkout Daten zu resetten die mit dem Prozess assoziiert sind
this._checkoutService.removeProcess({ processId });
// Ändere type cart-checkout zu customer-order
this._applicationService.patchProcess(processId, {
id: processId,
type: 'cart',
section: 'customer',
name: `Vorgang ${this.processNumber(processes.filter((process) => process.type === 'cart'))}`,
data: {},
});
// Navigation
await this._navigationService.getCustomerOrdersBasePath(processId).navigate();
}
getUrlFromSnapshot(route: ActivatedRouteSnapshot, url: string[] = []): string[] {
url.push(...route.url.map((segment) => segment.path));
if (route.firstChild) {
return this.getUrlFromSnapshot(route.firstChild, url);
}
return url.filter((segment) => !!segment);
}
processNumber(processes: ApplicationProcess[]) {
const processNumbers = processes?.map((process) => Number(process?.name?.replace(/\D/g, '')));
return !!processNumbers && processNumbers.length > 0 ? this.findMissingNumber(processNumbers) : 1;
}
findMissingNumber(processNumbers: number[]) {
for (let missingNumber = 1; missingNumber < Math.max(...processNumbers); missingNumber++) {
if (!processNumbers.find((number) => number === missingNumber)) {
return missingNumber;
}
}
return Math.max(...processNumbers) + 1;
}
}

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { BreadcrumbService } from '@core/breadcrumb';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateCustomerWithProcessIdGuard implements CanActivate {
export class CanActivateCustomerWithProcessIdGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _breadcrumbService: BreadcrumbService) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -1,15 +1,17 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { DomainCheckoutService } from '@domain/checkout';
import { CustomerSearchNavigation } from '@shared/services';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateCustomerGuard implements CanActivate {
export class CanActivateCustomerGuard {
constructor(
private readonly _applicationService: ApplicationService,
private readonly _checkoutService: DomainCheckoutService,
private readonly _router: Router
private readonly _router: Router,
private readonly _navigation: CustomerSearchNavigation
) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
@@ -41,11 +43,17 @@ export class CanActivateCustomerGuard implements CanActivate {
await this.fromCartProcess(processes);
return false;
} else {
await this._router.navigate(['/kunde', String(lastActivatedProcessId), 'customer']);
await this.navigateToDefaultRoute(lastActivatedProcessId);
}
return false;
}
async navigateToDefaultRoute(processId: number) {
const route = this._navigation.defaultRoute({ processId });
await this._router.navigate(route.path, { queryParams: route.queryParams });
}
// Bei offener Artikelsuche/Kundensuche und Klick auf Footer Kundensuche
async fromCartProcess(processes: ApplicationProcess[]) {
const newProcessId = Date.now();
@@ -56,7 +64,7 @@ export class CanActivateCustomerGuard implements CanActivate {
name: `Vorgang ${this.processNumber(processes.filter((process) => process.type === 'cart'))}`,
});
await this._router.navigate(['/kunde', String(newProcessId), 'customer']);
await this.navigateToDefaultRoute(newProcessId);
}
// Bei offener Bestellbestätigung und Klick auf Footer Kundensuche
@@ -74,7 +82,7 @@ export class CanActivateCustomerGuard implements CanActivate {
});
// Navigation
await this._router.navigate(['/kunde', String(processId), 'customer']);
await this.navigateToDefaultRoute(processId);
}
// Bei offener Warenausgabe und Klick auf Footer Kundensuche
@@ -98,7 +106,7 @@ export class CanActivateCustomerGuard implements CanActivate {
});
// Navigation
await this._router.navigate(['/kunde', String(processId), 'customer']);
await this.navigateToDefaultRoute(processId);
}
processNumber(processes: ApplicationProcess[]) {

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Config } from '@core/config';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateGoodsInGuard implements CanActivate {
export class CanActivateGoodsInGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _config: Config) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
@@ -15,7 +15,7 @@ export class CanActivateGoodsInGuard implements CanActivate {
id: this._config.get('process.ids.goodsIn'),
type: 'goods-in',
section: 'branch',
name: 'Abholfach',
name: '',
});
}
this._applicationService.activateProcess(this._config.get('process.ids.goodsIn'));

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { BreadcrumbService } from '@core/breadcrumb';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateGoodsOutWithProcessIdGuard implements CanActivate {
export class CanActivateGoodsOutWithProcessIdGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _breadcrumbService: BreadcrumbService) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { DomainCheckoutService } from '@domain/checkout';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateGoodsOutGuard implements CanActivate {
export class CanActivateGoodsOutGuard {
constructor(
private readonly _applicationService: ApplicationService,
private readonly _checkoutService: DomainCheckoutService,

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Config } from '@core/config';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivatePackageInspectionGuard implements CanActivate {
export class CanActivatePackageInspectionGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _config: Config) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { BreadcrumbService } from '@core/breadcrumb';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateProductWithProcessIdGuard implements CanActivate {
export class CanActivateProductWithProcessIdGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _breadcrumbService: BreadcrumbService) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -1,17 +1,16 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationProcess, ApplicationService } from '@core/application';
import { DomainCheckoutService } from '@domain/checkout';
import { ProductCatalogNavigationService } from '@shared/services';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateProductGuard implements CanActivate {
export class CanActivateProductGuard {
constructor(
private readonly _applicationService: ApplicationService,
private readonly _checkoutService: DomainCheckoutService,
private readonly _navigationService: ProductCatalogNavigationService,
private readonly _router: Router
private readonly _navigationService: ProductCatalogNavigationService
) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
@@ -43,7 +42,7 @@ export class CanActivateProductGuard implements CanActivate {
await this.fromCartProcess(processes);
return false;
} else {
await this._router.navigate(this.getUrlFromSnapshot(route, ['/kunde', String(lastActivatedProcessId)]));
await this._navigationService.getArticleSearchBasePath(lastActivatedProcessId).navigate();
}
return false;
@@ -59,7 +58,7 @@ export class CanActivateProductGuard implements CanActivate {
name: `Vorgang ${this.processNumber(processes.filter((process) => process.type === 'cart'))}`,
});
await this._navigationService.navigateToProductSearch({ processId: newProcessId });
await this._navigationService.getArticleSearchBasePath(newProcessId).navigate();
}
// Bei offener Warenausgabe und Klick auf Footer Artikelsuche
@@ -83,7 +82,7 @@ export class CanActivateProductGuard implements CanActivate {
});
// Navigation
await this._router.navigate(this.getUrlFromSnapshot(route, ['/kunde', String(processId)]));
await this._navigationService.getArticleSearchBasePath(processId).navigate();
}
// Bei offener Bestellbestätigung und Klick auf Footer Artikelsuche
@@ -101,7 +100,7 @@ export class CanActivateProductGuard implements CanActivate {
});
// Navigation
await this._router.navigate(this.getUrlFromSnapshot(route, ['/kunde', String(processId)]));
await this._navigationService.getArticleSearchBasePath(processId).navigate();
}
getUrlFromSnapshot(route: ActivatedRouteSnapshot, url: string[] = []): string[] {

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Config } from '@core/config';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateRemissionGuard implements CanActivate {
export class CanActivateRemissionGuard {
constructor(
private readonly _applicationService: ApplicationService,
private readonly _config: Config,

View File

@@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Config } from '@core/config';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class CanActivateTaskCalendarGuard implements CanActivate {
export class CanActivateTaskCalendarGuard {
constructor(private readonly _applicationService: ApplicationService, private readonly _config: Config) {}
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

View File

@@ -5,6 +5,8 @@ export * from './can-activate-customer.guard';
export * from './can-activate-goods-in.guard';
export * from './can-activate-goods-out-with-process-id.guard';
export * from './can-activate-goods-out.guard';
export * from './can-activate-customer-orders.guard';
export * from './can-activate-customer-orders-with-process-id.guard';
export * from './can-activate-product-with-process-id.guard';
export * from './can-activate-product.guard';
export * from './can-activate-remission.guard';

View File

@@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthService } from '@core/auth';
import { ScanAdapterService } from '@adapter/scan';
import { AuthService as IsaAuthService } from '@swagger/isa';
@@ -7,7 +7,7 @@ import { UiConfirmModalComponent, UiErrorModalComponent, UiModalService } from '
import { EnvironmentService } from '@core/environment';
@Injectable({ providedIn: 'root' })
export class IsAuthenticatedGuard implements CanActivate {
export class IsAuthenticatedGuard {
constructor(
private _authService: AuthService,
private _scanService: ScanAdapterService,
@@ -52,11 +52,7 @@ export class IsAuthenticatedGuard implements CanActivate {
return undefined;
}
const result = await this._scanService
.scan({
exclude: ['Dev'],
})
?.toPromise();
const result = await this._scanService.scan()?.toPromise();
if (typeof result === 'string') {
try {

View File

@@ -0,0 +1,33 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
import { ApplicationService } from '@core/application';
import { take } from 'rxjs/operators';
export const ProcessIdGuard: CanActivateFn = async (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Promise<boolean | UrlTree> => {
const application = inject(ApplicationService);
const router = inject(Router);
const process = await application.getLastActivatedProcessWithSection$('customer').pipe(take(1)).toPromise();
const processId = process?.id ?? Date.now();
const originalUrl = state.url?.split('?')[0] ?? '';
let url: string = '';
if (originalUrl.startsWith('/kunde')) {
url = originalUrl.replace('/kunde', `/kunde/${processId}`);
} else {
url = originalUrl;
}
if (originalUrl === url) {
return true;
}
await router.navigateByUrl(url);
return false;
};

View File

@@ -1,9 +1,9 @@
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class ProcessIdResolver implements Resolve<number> {
export class ProcessIdResolver {
constructor() {}
resolve(route: ActivatedRouteSnapshot): Observable<number> | Promise<number> | number {

View File

@@ -1,9 +1,9 @@
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot } from '@angular/router';
import { ApplicationService } from '@core/application';
import { Observable } from 'rxjs';
export abstract class SectionResolver implements Resolve<string> {
export abstract class SectionResolver {
constructor(protected section: 'customer' | 'branch', protected applicationService: ApplicationService) {}
resolve(route: ActivatedRouteSnapshot): Observable<string> | Promise<string> | string {

View File

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="18px" viewBox="0 0 22 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch -->
<title>Icon_HC</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Hugendubel_Icons" transform="translate(-29.000000, -177.000000)" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.3">
<path d="M32.725699,178.000628 C32.7430505,177.999791 32.7604307,177.999791 32.7777823,178.000628 L37.5260449,178.000628 C38.53109,178.000628 39.44018,178.547926 40.0000026,179.340692 C40.5598253,178.547926 41.4689153,178.000628 42.4739603,178.000628 L47.222223,178.000628 C47.529035,178.00066 47.7777477,178.256627 47.7777784,178.572389 L47.7777784,179.71591 L49.4444446,179.71591 C49.7512567,179.715942 49.9999694,179.971909 50,180.287671 L50,192.008763 C49.9999694,192.324524 49.7512567,192.580492 49.4444446,192.580523 L42.4739603,192.580523 C41.4766486,192.580523 40.8524541,192.949423 40.4947942,193.688309 C40.3998428,193.879608 40.208727,194 40.0000026,194 C39.7912783,194 39.6001624,193.879608 39.5052111,193.688309 C39.1475512,192.949423 38.5233566,192.580523 37.5260449,192.580523 L30.5555607,192.580523 C30.2487486,192.580492 30.0000359,192.324524 30.0000053,192.008763 L30.0000053,180.287671 C29.9987652,179.991708 30.2171687,179.743681 30.5034773,179.71591 C30.5208289,179.715072 30.5382091,179.715072 30.5555607,179.71591 L32.2222269,179.71591 L32.2222269,178.572389 C32.2209869,178.276426 32.4393904,178.028399 32.725699,178.000628 Z M33.3333377,179.14415 L33.3333377,189.43584 L36.6232674,189.43584 C37.6190746,189.43584 38.5547188,189.729711 39.2621556,190.356017 C39.3270606,190.413476 39.3849347,190.480265 39.4444472,190.543626 L39.4444472,180.957703 C39.4433388,180.936873 39.4433388,180.915996 39.4444472,180.895166 C39.4444472,180.068361 38.4768339,179.14415 37.5260449,179.14415 L33.3333377,179.14415 Z M42.4739603,179.14415 C41.5231714,179.14415 40.555558,180.068361 40.555558,180.895166 C40.5555806,180.898144 40.5555806,180.901122 40.555558,180.9041 L40.555558,190.543626 C40.6150705,190.480265 40.6729447,190.413476 40.7378497,190.356017 C41.4452864,189.729711 42.3809306,189.43584 43.3767379,189.43584 L46.6666675,189.43584 L46.6666675,179.14415 L42.4739603,179.14415 Z M31.1111161,180.859431 L31.1111161,191.437002 L37.5260449,191.437002 C38.0365968,191.437002 38.5189494,191.531483 38.9496557,191.713949 C38.8273679,191.527334 38.6888269,191.36055 38.5329891,191.222592 C38.0547048,190.799175 37.405738,190.579361 36.6232674,190.579361 L32.7777823,190.579361 C32.4709702,190.57933 32.2222575,190.323362 32.2222269,190.007601 L32.2222269,180.859431 L31.1111161,180.859431 Z M47.7777784,180.859431 L47.7777784,190.007601 C47.7777477,190.323362 47.529035,190.57933 47.222223,190.579361 L43.3767379,190.579361 C42.5942672,190.579361 41.9453004,190.799175 41.4670161,191.222592 C41.3107359,191.360944 41.1725734,191.526903 41.0503496,191.713949 C41.4810558,191.531483 41.9634085,191.437002 42.4739603,191.437002 L48.8888892,191.437002 L48.8888892,180.859431 L47.7777784,180.859431 Z M35.5,182.116677 L37.5,182.116677 C37.7761424,182.116677 38,182.340535 38,182.616677 L38,182.645847 C38,182.921989 37.7761424,183.145847 37.5,183.145847 L35.5,183.145847 C35.2238576,183.145847 35,182.921989 35,182.645847 L35,182.616677 C35,182.340535 35.2238576,182.116677 35.5,182.116677 Z M35.5,184.175016 L37.5,184.175016 C37.7761424,184.175016 38,184.398874 38,184.675016 L38,184.704185 C38,184.980328 37.7761424,185.204185 37.5,185.204185 L35.5,185.204185 C35.2238576,185.204185 35,184.980328 35,184.704185 L35,184.675016 C35,184.398874 35.2238576,184.175016 35.5,184.175016 Z M35.5,186.233355 L37.5,186.233355 C37.7761424,186.233355 38,186.457212 38,186.733355 L38,186.762524 C38,187.038666 37.7761424,187.262524 37.5,187.262524 L35.5,187.262524 C35.2238576,187.262524 35,187.038666 35,186.762524 L35,186.733355 C35,186.457212 35.2238576,186.233355 35.5,186.233355 Z M42.5,182.116677 L44.5,182.116677 C44.7761424,182.116677 45,182.340535 45,182.616677 L45,182.645847 C45,182.921989 44.7761424,183.145847 44.5,183.145847 L42.5,183.145847 C42.2238576,183.145847 42,182.921989 42,182.645847 L42,182.616677 C42,182.340535 42.2238576,182.116677 42.5,182.116677 Z M42.5,184.175016 L44.5,184.175016 C44.7761424,184.175016 45,184.398874 45,184.675016 L45,184.704185 C45,184.980328 44.7761424,185.204185 44.5,185.204185 L42.5,185.204185 C42.2238576,185.204185 42,184.980328 42,184.704185 L42,184.675016 C42,184.398874 42.2238576,184.175016 42.5,184.175016 Z M42.5,186.233355 L44.5,186.233355 C44.7761424,186.233355 45,186.457212 45,186.733355 L45,186.762524 C45,187.038666 44.7761424,187.262524 44.5,187.262524 L42.5,187.262524 C42.2238576,187.262524 42,187.038666 42,186.762524 L42,186.733355 C42,186.457212 42.2238576,186.233355 42.5,186.233355 Z" id="Icon_HC"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="18px" viewBox="0 0 22 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch -->
<title>Icon_HC</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Hugendubel_Icons" transform="translate(-29.000000, -177.000000)" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.3">
<path d="M32.725699,178.000628 C32.7430505,177.999791 32.7604307,177.999791 32.7777823,178.000628 L37.5260449,178.000628 C38.53109,178.000628 39.44018,178.547926 40.0000026,179.340692 C40.5598253,178.547926 41.4689153,178.000628 42.4739603,178.000628 L47.222223,178.000628 C47.529035,178.00066 47.7777477,178.256627 47.7777784,178.572389 L47.7777784,179.71591 L49.4444446,179.71591 C49.7512567,179.715942 49.9999694,179.971909 50,180.287671 L50,192.008763 C49.9999694,192.324524 49.7512567,192.580492 49.4444446,192.580523 L42.4739603,192.580523 C41.4766486,192.580523 40.8524541,192.949423 40.4947942,193.688309 C40.3998428,193.879608 40.208727,194 40.0000026,194 C39.7912783,194 39.6001624,193.879608 39.5052111,193.688309 C39.1475512,192.949423 38.5233566,192.580523 37.5260449,192.580523 L30.5555607,192.580523 C30.2487486,192.580492 30.0000359,192.324524 30.0000053,192.008763 L30.0000053,180.287671 C29.9987652,179.991708 30.2171687,179.743681 30.5034773,179.71591 C30.5208289,179.715072 30.5382091,179.715072 30.5555607,179.71591 L32.2222269,179.71591 L32.2222269,178.572389 C32.2209869,178.276426 32.4393904,178.028399 32.725699,178.000628 Z M33.3333377,179.14415 L33.3333377,189.43584 L36.6232674,189.43584 C37.6190746,189.43584 38.5547188,189.729711 39.2621556,190.356017 C39.3270606,190.413476 39.3849347,190.480265 39.4444472,190.543626 L39.4444472,180.957703 C39.4433388,180.936873 39.4433388,180.915996 39.4444472,180.895166 C39.4444472,180.068361 38.4768339,179.14415 37.5260449,179.14415 L33.3333377,179.14415 Z M42.4739603,179.14415 C41.5231714,179.14415 40.555558,180.068361 40.555558,180.895166 C40.5555806,180.898144 40.5555806,180.901122 40.555558,180.9041 L40.555558,190.543626 C40.6150705,190.480265 40.6729447,190.413476 40.7378497,190.356017 C41.4452864,189.729711 42.3809306,189.43584 43.3767379,189.43584 L46.6666675,189.43584 L46.6666675,179.14415 L42.4739603,179.14415 Z M31.1111161,180.859431 L31.1111161,191.437002 L37.5260449,191.437002 C38.0365968,191.437002 38.5189494,191.531483 38.9496557,191.713949 C38.8273679,191.527334 38.6888269,191.36055 38.5329891,191.222592 C38.0547048,190.799175 37.405738,190.579361 36.6232674,190.579361 L32.7777823,190.579361 C32.4709702,190.57933 32.2222575,190.323362 32.2222269,190.007601 L32.2222269,180.859431 L31.1111161,180.859431 Z M47.7777784,180.859431 L47.7777784,190.007601 C47.7777477,190.323362 47.529035,190.57933 47.222223,190.579361 L43.3767379,190.579361 C42.5942672,190.579361 41.9453004,190.799175 41.4670161,191.222592 C41.3107359,191.360944 41.1725734,191.526903 41.0503496,191.713949 C41.4810558,191.531483 41.9634085,191.437002 42.4739603,191.437002 L48.8888892,191.437002 L48.8888892,180.859431 L47.7777784,180.859431 Z M35.5,182.116677 L37.5,182.116677 C37.7761424,182.116677 38,182.340535 38,182.616677 L38,182.645847 C38,182.921989 37.7761424,183.145847 37.5,183.145847 L35.5,183.145847 C35.2238576,183.145847 35,182.921989 35,182.645847 L35,182.616677 C35,182.340535 35.2238576,182.116677 35.5,182.116677 Z M35.5,184.175016 L37.5,184.175016 C37.7761424,184.175016 38,184.398874 38,184.675016 L38,184.704185 C38,184.980328 37.7761424,185.204185 37.5,185.204185 L35.5,185.204185 C35.2238576,185.204185 35,184.980328 35,184.704185 L35,184.675016 C35,184.398874 35.2238576,184.175016 35.5,184.175016 Z M35.5,186.233355 L37.5,186.233355 C37.7761424,186.233355 38,186.457212 38,186.733355 L38,186.762524 C38,187.038666 37.7761424,187.262524 37.5,187.262524 L35.5,187.262524 C35.2238576,187.262524 35,187.038666 35,186.762524 L35,186.733355 C35,186.457212 35.2238576,186.233355 35.5,186.233355 Z M42.5,182.116677 L44.5,182.116677 C44.7761424,182.116677 45,182.340535 45,182.616677 L45,182.645847 C45,182.921989 44.7761424,183.145847 44.5,183.145847 L42.5,183.145847 C42.2238576,183.145847 42,182.921989 42,182.645847 L42,182.616677 C42,182.340535 42.2238576,182.116677 42.5,182.116677 Z M42.5,184.175016 L44.5,184.175016 C44.7761424,184.175016 45,184.398874 45,184.675016 L45,184.704185 C45,184.980328 44.7761424,185.204185 44.5,185.204185 L42.5,185.204185 C42.2238576,185.204185 42,184.980328 42,184.704185 L42,184.675016 C42,184.398874 42.2238576,184.175016 42.5,184.175016 Z M42.5,186.233355 L44.5,186.233355 C44.7761424,186.233355 45,186.457212 45,186.733355 L45,186.762524 C45,187.038666 44.7761424,187.262524 44.5,187.262524 L42.5,187.262524 C42.2238576,187.262524 42,187.038666 42,186.762524 L42,186.733355 C42,186.457212 42.2238576,186.233355 42.5,186.233355 Z" id="Icon_HC"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="18px" viewBox="0 0 22 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch -->
<title>Icon_HC</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Hugendubel_Icons" transform="translate(-29.000000, -177.000000)" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.3">
<path d="M32.725699,178.000628 C32.7430505,177.999791 32.7604307,177.999791 32.7777823,178.000628 L37.5260449,178.000628 C38.53109,178.000628 39.44018,178.547926 40.0000026,179.340692 C40.5598253,178.547926 41.4689153,178.000628 42.4739603,178.000628 L47.222223,178.000628 C47.529035,178.00066 47.7777477,178.256627 47.7777784,178.572389 L47.7777784,179.71591 L49.4444446,179.71591 C49.7512567,179.715942 49.9999694,179.971909 50,180.287671 L50,192.008763 C49.9999694,192.324524 49.7512567,192.580492 49.4444446,192.580523 L42.4739603,192.580523 C41.4766486,192.580523 40.8524541,192.949423 40.4947942,193.688309 C40.3998428,193.879608 40.208727,194 40.0000026,194 C39.7912783,194 39.6001624,193.879608 39.5052111,193.688309 C39.1475512,192.949423 38.5233566,192.580523 37.5260449,192.580523 L30.5555607,192.580523 C30.2487486,192.580492 30.0000359,192.324524 30.0000053,192.008763 L30.0000053,180.287671 C29.9987652,179.991708 30.2171687,179.743681 30.5034773,179.71591 C30.5208289,179.715072 30.5382091,179.715072 30.5555607,179.71591 L32.2222269,179.71591 L32.2222269,178.572389 C32.2209869,178.276426 32.4393904,178.028399 32.725699,178.000628 Z M33.3333377,179.14415 L33.3333377,189.43584 L36.6232674,189.43584 C37.6190746,189.43584 38.5547188,189.729711 39.2621556,190.356017 C39.3270606,190.413476 39.3849347,190.480265 39.4444472,190.543626 L39.4444472,180.957703 C39.4433388,180.936873 39.4433388,180.915996 39.4444472,180.895166 C39.4444472,180.068361 38.4768339,179.14415 37.5260449,179.14415 L33.3333377,179.14415 Z M42.4739603,179.14415 C41.5231714,179.14415 40.555558,180.068361 40.555558,180.895166 C40.5555806,180.898144 40.5555806,180.901122 40.555558,180.9041 L40.555558,190.543626 C40.6150705,190.480265 40.6729447,190.413476 40.7378497,190.356017 C41.4452864,189.729711 42.3809306,189.43584 43.3767379,189.43584 L46.6666675,189.43584 L46.6666675,179.14415 L42.4739603,179.14415 Z M31.1111161,180.859431 L31.1111161,191.437002 L37.5260449,191.437002 C38.0365968,191.437002 38.5189494,191.531483 38.9496557,191.713949 C38.8273679,191.527334 38.6888269,191.36055 38.5329891,191.222592 C38.0547048,190.799175 37.405738,190.579361 36.6232674,190.579361 L32.7777823,190.579361 C32.4709702,190.57933 32.2222575,190.323362 32.2222269,190.007601 L32.2222269,180.859431 L31.1111161,180.859431 Z M47.7777784,180.859431 L47.7777784,190.007601 C47.7777477,190.323362 47.529035,190.57933 47.222223,190.579361 L43.3767379,190.579361 C42.5942672,190.579361 41.9453004,190.799175 41.4670161,191.222592 C41.3107359,191.360944 41.1725734,191.526903 41.0503496,191.713949 C41.4810558,191.531483 41.9634085,191.437002 42.4739603,191.437002 L48.8888892,191.437002 L48.8888892,180.859431 L47.7777784,180.859431 Z M35.5,182.116677 L37.5,182.116677 C37.7761424,182.116677 38,182.340535 38,182.616677 L38,182.645847 C38,182.921989 37.7761424,183.145847 37.5,183.145847 L35.5,183.145847 C35.2238576,183.145847 35,182.921989 35,182.645847 L35,182.616677 C35,182.340535 35.2238576,182.116677 35.5,182.116677 Z M35.5,184.175016 L37.5,184.175016 C37.7761424,184.175016 38,184.398874 38,184.675016 L38,184.704185 C38,184.980328 37.7761424,185.204185 37.5,185.204185 L35.5,185.204185 C35.2238576,185.204185 35,184.980328 35,184.704185 L35,184.675016 C35,184.398874 35.2238576,184.175016 35.5,184.175016 Z M35.5,186.233355 L37.5,186.233355 C37.7761424,186.233355 38,186.457212 38,186.733355 L38,186.762524 C38,187.038666 37.7761424,187.262524 37.5,187.262524 L35.5,187.262524 C35.2238576,187.262524 35,187.038666 35,186.762524 L35,186.733355 C35,186.457212 35.2238576,186.233355 35.5,186.233355 Z M42.5,182.116677 L44.5,182.116677 C44.7761424,182.116677 45,182.340535 45,182.616677 L45,182.645847 C45,182.921989 44.7761424,183.145847 44.5,183.145847 L42.5,183.145847 C42.2238576,183.145847 42,182.921989 42,182.645847 L42,182.616677 C42,182.340535 42.2238576,182.116677 42.5,182.116677 Z M42.5,184.175016 L44.5,184.175016 C44.7761424,184.175016 45,184.398874 45,184.675016 L45,184.704185 C45,184.980328 44.7761424,185.204185 44.5,185.204185 L42.5,185.204185 C42.2238576,185.204185 42,184.980328 42,184.704185 L42,184.675016 C42,184.398874 42.2238576,184.175016 42.5,184.175016 Z M42.5,186.233355 L44.5,186.233355 C44.7761424,186.233355 45,186.457212 45,186.733355 L45,186.762524 C45,187.038666 44.7761424,187.262524 44.5,187.262524 L42.5,187.262524 C42.2238576,187.262524 42,187.038666 42,186.762524 L42,186.733355 C42,186.457212 42.2238576,186.233355 42.5,186.233355 Z" id="Icon_HC"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
{
"title": "ISA - Integration",
"silentRefresh": {
"interval": 300000
"interval": 60000
},
"@cdn/product-image": {
"url": "https://produktbilder.paragon-data.net"
@@ -15,6 +15,9 @@
"@core/logger": {
"logLevel": "debug"
},
"@domain/checkout": {
"olaExpiration": "5m"
},
"@swagger/isa": {
"rootUrl": "https://isa-integration.paragon-data.net/isa/v1"
},
@@ -63,11 +66,13 @@
"taskCalendar": 3000,
"remission": 4000,
"packageInspection": 5000,
"assortment": 6000
"assortment": 6000,
"pickupShelf": 7000
}
},
"checkForUpdates": 3600000,
"checkForUpdates": 900000,
"licence": {
"scandit": "AQZyKCc+BEkNL00Y3h3FjawGLF+INUj7cVb0My91hl8ffiW873T8FTV1k4TIZJx5RwcJlYxhgsxHVcnM4AJgSwJhbAfxJmP/3XGijLlLp3XUIRjQwFtf7UlZAFZ7Vrt1/WSf7kxxrFQ2SE2AQwLqPg9DL+hHEfd4xT/15n8p2q7qUlCKLsV6jF12Pd7koFNSWNL3ZIkRtd1ma99/321dnwAJHFGXqWg5nprJ7sYtqUqNQ8Er9SlvKbhnw3AipHzKpz0O3oNfUsr6NlZivRBhMhCZLo5WpXo1m9uIU8zLEWMNDJ+wGUctcGxE3eCptP2zLXUgxxjB+0EXOUtT/GWUc/Ip61CMiyUf7Paz026E2eYil2yWgfkTP5CUgDMNGZFuAA1T5PhB9FRW51CjAIvwOKVMCvfixJiVoUsXHnWH2ZnXqtbDR/uEZBE7OKoBlaPL4G3Lvgdqym5EjROAztUXb6wOmVDiGzzqgizyZnIcxFBSKJAownGj9Vh4/Y/Ag1xzGzNtjz3ngSRfMfIIq/q2Q51uiLiv7mBVliPvPWMUTfTjnqnK/OSBlR2ID+COJqnUKpQMedPyOT3IMznmM6gQCmyYO5KE0MkfhFh6+pdNi6oJM2iZsxK1Z1V+GRSOIwrJEoajjDJkh439XjXk8NExFvplrLjK/oL/dsHIZiG6U5GVWW92kGkuXkJCeUz1CET3paxbGqwrd53r5d6gFABbC12CtcP2JeH4YYCpHYyPQacf0prj9Hdq3wDztShC9tH+4UQS/GbaDHKcS1ANIyPuTxHmBFtPuCJ9Uagy5QBEc8eAz2nfsbfaUxYzco6u/zhNsFbqp6zgQIxs5OcqDQ=="
}
"scandit": "Ae7z0WDdRDFqG6oYuAXzesYGJpDLDqt+xWtQHOESiOjaSkB7IEIDJAk534U+cg1zGnk++4hOEK9hXEGR01NLTjh76w1fDL0U63OUjo50EHBXIUvzAVSur3pRY+1ER7SvSEWaT0hDOLYvYrTpdECtt1graN9yMvJzXD38VJKUfssT92p+YENV2Hul3eXIvaVjHqXE/yvupF+MlOMMUMhX0/Km/yTU9H9SjBdsXYihZmYWbt2JotO3Zs1ojXb0+3La10xb01S1q0XdDN6El3XMVilEtdmrP3WoGois8vpQBvOCEvduxCfILFAqjeWXTZvXSut9u+kQKpK8uHW4rVV6iVClpZfPYqKJqTh78AI9gpnfb/zO9GfQEDS3g7wI5WbQKqaNRzhTVowFRri4Ep9R5TRC1bnd00RC4zVaMkbu5kBOA7YoRjgUiYWHKJpi/VokZWyN6u1lsi5mTUbQkm1ZWfX5I/iUVYBgyHZYl+8kfFkwLPXGZNrF4xqubjKiCZRQj0oyNjHOBeHqvAekzhk7scX2g/NN+liRQv4ur413b+uXacSiiYIrLhtGgzrz1KRrtu19uB5odk3LoerDoiYXat7wEg9zUYT/+uBfO2X+uS7L5LW0PMI3hV+joQVpDk5SlA2868Nx0KWtPWmMf7xCuFIhDskfBsXZNRTblqxkk0RzzSqtjx9ihGr+/Tuzm8Pm0s4OQqV7b+++/Zn+Vo4rCqMTwutjOO7dqhah5hbOT1MqY/6VcjCXyDad3BXXr+WYU4GtYTe8Ytjkm/ZTG3fImoDbMchEcqnCw3oxG5e/gkdurE8g/mZlFOtzAN7KkqIsg6qLaC5COjfLPXsi/A=="
},
"@shared/icon": "/assets/icons.json"
}

View File

File diff suppressed because one or more lines are too long

View File

@@ -16,6 +16,9 @@
"@core/logger": {
"logLevel": "debug"
},
"@domain/checkout": {
"olaExpiration": "5m"
},
"@swagger/isa": {
"rootUrl": "https://isa.paragon-systems.de/isa/v1"
},
@@ -64,11 +67,13 @@
"taskCalendar": 3000,
"remission": 4000,
"packageInspection": 5000,
"assortment": 6000
"assortment": 6000,
"pickupShelf": 7000
}
},
"checkForUpdates": 3600000,
"licence": {
"scandit": "AfHi/mY+RbwJD5nC7SuWn3I14pFUOfSbQ2QG//4aV3zWQjwix30kHqsqraA8ZiipDBql8YlwIyV6VPBMUiAX4s9YHDxHHsWwq2BUB3ImzDEcU1jmMH/5yakGUYpCQ68D0iZ8SG9sS0QBb3iFdCHc1r9DFr1cMTxM7zOvb/AUoIVmieHZXnx9ioUgCvczsLiuX3hwvTW3lhbvJ4uUyqTWK4sWFVwoY4AIWSFrPwwrkV2DksMKT5fMJT3GWgPypvTIGwWvpRfLWwKlc1Z3ckyb84khsnaWD2wr+hdgu/K8YIMmgGszm5KIZ/G05YfDNZtQ4jby+5RZvQwWR8rxM35rJgf73OkMSpuL9jw3T0TTAlvpkGRLzVVuCw9VjlBLqfPNEZ6VsEwFuAla9IYUvFHCsjypg2J6UpxHXrTYmbsSu5Jm8frVfS5znPPTO9D/4rF6ZVv2PxY9PgUgJUvwMa/VMc/nse3RRRf8RGT4rUItfJDFO8pujD76vVEWq/KixQRoMdLgDLyxhsFVftkxqhZhyEfFZzsEy49LSojJ28vpHpBWLeCQBmnZ7JZ4C5yOQiqSQV/assBq2zJN2q+vCDp8qy5j1rED1SX5Ec7JpgpgnU4chLIf5Zn7bP/hNGT3pEYBuXeDXXN8ke1pcc3fc3m0FysDG0o56XVCUqImZ8Ezi8eujZciKDrWbtljhKTj7cnfuJx0sVHF6Bh5i4YfgA/Z+NL+MtH2EVIF67e6hEz6PWYTcoh3ybBaJfxb2FNvGJutNKg04GwMhYq6K2IddBt0fDiBt0SGM0oSBlUP3DKCUmXcf2a6ASbrcqv6Wz1jHt0pY4U8bEpg7qSbW3VDyvdPgyQ="
}
"scandit": "AVljxT/dG+TAIDDL2jTxm843juR2OtZ6lHLxRpYR7x9uYiSvY2IAHdRx8tjsf9KU7wK0F5cAeb/nLMHF6Vor9ps79wvuBQw6G3N0IW978b78ZUgPOFzxHUAMuD8dbkDZlX8r9y1cOd9sT3UNEwGrQ4siUt2oCkigyTxJAgYs1ijnjQid7q42hHk3tMXywrAYeu5MhF0TV1H77DRDMxPHD/xiR0zhFQRB2Dtnm1+e3LHKCyQjZ/zknEpQB6HS7UbCBoEDj4tohb83E6oqmQFWwt85/Jk9f49gxXakIcNODnQI5H63kSqpEmV9Al1a5L+WGZ6Bq1gwBbnD8FBXlVqxoooiFXW7jzzBa9LNmQiQ5J8yEkIsPeyOHec7F4ERvVONSMYwWyH39ZweSiRsZRM1UsFPhN96bCT5MEwkjPFn4gji6TPGEceJZvV3HwsiCT5Bgjla4bvDsZ2jYvAr9tSij8kIii9dHvsWlrimt+szHJLSz+8uNI6jAvXyr2f3oRxZD/F9osZHVWkgtAc+vVWqkxVJCqmpmoHOXI6TFSqSjYHddhZyU5r2lgQt0+NI6k/bV3iN7Le1RJCP/wuSDCTZjzsU1igB7UnIN2Y70CqCjIeVH9qlxaI1YAC9lwFv1FZvsiueYeJP1n39mmXCSELVtzxgIBEX5yaIHNbbGXd+e8JUgcO8vJ2JA2kJudaU+xfYR5SY//+J1kPsNSbnBnM25LL+LjeRB3QTfqV5sFq8ORWcIMITvkEaRfP3PVcOzb+hO4Ren4ezhJuyADulmvG8a9Kxxk6ymzBbE7a93SGVbxp7OQNEmvTn5+B9wJ7/l1mtvZL2TilrDZBQVMYWrGuUGpA="
},
"@shared/icon": "/assets/icons.json"
}

View File

@@ -16,6 +16,9 @@
"@core/logger": {
"logLevel": "debug"
},
"@domain/checkout": {
"olaExpiration": "5m"
},
"@swagger/isa": {
"rootUrl": "https://isa-staging.paragon-systems.de/isa/v1"
},
@@ -64,11 +67,13 @@
"taskCalendar": 3000,
"remission": 4000,
"packageInspection": 5000,
"assortment": 6000
"assortment": 6000,
"pickupShelf": 7000
}
},
"checkForUpdates": 3600000,
"licence": {
"scandit": "AfHi/mY+RbwJD5nC7SuWn3I14pFUOfSbQ2QG//4aV3zWQjwix30kHqsqraA8ZiipDBql8YlwIyV6VPBMUiAX4s9YHDxHHsWwq2BUB3ImzDEcU1jmMH/5yakGUYpCQ68D0iZ8SG9sS0QBb3iFdCHc1r9DFr1cMTxM7zOvb/AUoIVmieHZXnx9ioUgCvczsLiuX3hwvTW3lhbvJ4uUyqTWK4sWFVwoY4AIWSFrPwwrkV2DksMKT5fMJT3GWgPypvTIGwWvpRfLWwKlc1Z3ckyb84khsnaWD2wr+hdgu/K8YIMmgGszm5KIZ/G05YfDNZtQ4jby+5RZvQwWR8rxM35rJgf73OkMSpuL9jw3T0TTAlvpkGRLzVVuCw9VjlBLqfPNEZ6VsEwFuAla9IYUvFHCsjypg2J6UpxHXrTYmbsSu5Jm8frVfS5znPPTO9D/4rF6ZVv2PxY9PgUgJUvwMa/VMc/nse3RRRf8RGT4rUItfJDFO8pujD76vVEWq/KixQRoMdLgDLyxhsFVftkxqhZhyEfFZzsEy49LSojJ28vpHpBWLeCQBmnZ7JZ4C5yOQiqSQV/assBq2zJN2q+vCDp8qy5j1rED1SX5Ec7JpgpgnU4chLIf5Zn7bP/hNGT3pEYBuXeDXXN8ke1pcc3fc3m0FysDG0o56XVCUqImZ8Ezi8eujZciKDrWbtljhKTj7cnfuJx0sVHF6Bh5i4YfgA/Z+NL+MtH2EVIF67e6hEz6PWYTcoh3ybBaJfxb2FNvGJutNKg04GwMhYq6K2IddBt0fDiBt0SGM0oSBlUP3DKCUmXcf2a6ASbrcqv6Wz1jHt0pY4U8bEpg7qSbW3VDyvdPgyQ="
}
"scandit": "AVljxT/dG+TAIDDL2jTxm843juR2OtZ6lHLxRpYR7x9uYiSvY2IAHdRx8tjsf9KU7wK0F5cAeb/nLMHF6Vor9ps79wvuBQw6G3N0IW978b78ZUgPOFzxHUAMuD8dbkDZlX8r9y1cOd9sT3UNEwGrQ4siUt2oCkigyTxJAgYs1ijnjQid7q42hHk3tMXywrAYeu5MhF0TV1H77DRDMxPHD/xiR0zhFQRB2Dtnm1+e3LHKCyQjZ/zknEpQB6HS7UbCBoEDj4tohb83E6oqmQFWwt85/Jk9f49gxXakIcNODnQI5H63kSqpEmV9Al1a5L+WGZ6Bq1gwBbnD8FBXlVqxoooiFXW7jzzBa9LNmQiQ5J8yEkIsPeyOHec7F4ERvVONSMYwWyH39ZweSiRsZRM1UsFPhN96bCT5MEwkjPFn4gji6TPGEceJZvV3HwsiCT5Bgjla4bvDsZ2jYvAr9tSij8kIii9dHvsWlrimt+szHJLSz+8uNI6jAvXyr2f3oRxZD/F9osZHVWkgtAc+vVWqkxVJCqmpmoHOXI6TFSqSjYHddhZyU5r2lgQt0+NI6k/bV3iN7Le1RJCP/wuSDCTZjzsU1igB7UnIN2Y70CqCjIeVH9qlxaI1YAC9lwFv1FZvsiueYeJP1n39mmXCSELVtzxgIBEX5yaIHNbbGXd+e8JUgcO8vJ2JA2kJudaU+xfYR5SY//+J1kPsNSbnBnM25LL+LjeRB3QTfqV5sFq8ORWcIMITvkEaRfP3PVcOzb+hO4Ren4ezhJuyADulmvG8a9Kxxk6ymzBbE7a93SGVbxp7OQNEmvTn5+B9wJ7/l1mtvZL2TilrDZBQVMYWrGuUGpA="
},
"@shared/icon": "/assets/icons.json"
}

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,4 @@
export const environment = {
production: true,
debug: false,
};

View File

@@ -4,6 +4,7 @@
export const environment = {
production: false,
debug: false,
};
/*

View File

@@ -14,26 +14,28 @@ if (environment.production) {
const debugService = new DebugService();
const consoleLog = console.log;
if (environment.debug) {
const consoleLog = console.log;
console.log = (...args) => {
debugService.add({ type: 'log', args });
consoleLog(...args);
};
console.log = (...args) => {
debugService.add({ type: 'log', args });
consoleLog(...args);
};
const consoleWarn = console.warn;
const consoleWarn = console.warn;
console.warn = (...args) => {
debugService.add({ type: 'warn', args });
consoleWarn(...args);
};
console.warn = (...args) => {
debugService.add({ type: 'warn', args });
consoleWarn(...args);
};
const consoleError = console.error;
const consoleError = console.error;
console.error = (...args) => {
debugService.add({ type: 'error', args });
consoleError(...args);
};
console.error = (...args) => {
debugService.add({ type: 'error', args });
consoleError(...args);
};
}
platformBrowserDynamic([{ provide: DebugService, useValue: debugService }])
.bootstrapModule(AppModule)

View File

@@ -12,16 +12,6 @@
@import './scss/branch';
@layer base {
:root {
font-size: 16px;
}
@media screen and (min-width: 1680px) {
:root {
font-size: 19px;
}
}
body {
@apply bg-background;
}
@@ -67,3 +57,18 @@
@apply block bg-gray-300 h-6;
animation: load 1s ease-in-out infinite;
}
@layer components {
.input-control {
@apply rounded border border-solid border-[#AEB7C1] px-4 py-[1.125rem] outline-none;
}
// .input-control:focus,
// .input-control:not(:placeholder-shown) {
// @apply bg-white;
// }
.input-control.ng-touched.ng-invalid {
@apply border-brand;
}
}

View File

@@ -1,8 +1,11 @@
<div class="notification-headline">
<h1>{{ item.headline }}</h1>
<button class="notification-edit-cta" (click)="itemSelected.emit(item)">
Bearbeiten
</button>
<div class="grid grid-cols-[1fr_auto] items-center gap-4">
<div class="grid grid-flow-row gap-4">
<h1 class="text-left font-bold text-lg">{{ item.headline }}</h1>
<div class="notification-text">{{ item.text }}</div>
</div>
<div>
<button *ngIf="editButton" class="notification-edit-cta text-brand font-bold text-lg px-4 py-3" (click)="itemSelected.emit(item)">
{{ editButtonLabel }}
</button>
</div>
</div>
<div class="notification-text">{{ item.text }}</div>

View File

@@ -13,5 +13,11 @@ export class ModalNotificationsListItemComponent {
@Output()
itemSelected = new EventEmitter<MessageBoardItemDTO>();
@Input()
editButton = true;
@Input()
editButtonLabel = 'Bearbeiten';
constructor() {}
}

View File

@@ -0,0 +1,11 @@
<div class="notification-list scroll-bar">
<ng-container *ngFor="let notification of notifications">
<modal-notifications-list-item
(click)="itemSelected(notification)"
[editButtonLabel]="'Packstück-Prüfung'"
[item]="notification"
(itemSelected)="itemSelected($event)"
></modal-notifications-list-item>
<hr />
</ng-container>
</div>

View File

@@ -0,0 +1,23 @@
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { Router } from '@angular/router';
import { MessageBoardItemDTO } from 'apps/hub/notifications/src/lib/defs';
@Component({
selector: 'modal-notifications-package-inspection-group',
templateUrl: 'notifications-package-inspection-group.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ModalNotificationsPackageInspectionGroupComponent {
@Input()
notifications: MessageBoardItemDTO[];
@Output()
navigated = new EventEmitter<void>();
constructor(private _router: Router) {}
itemSelected(item: MessageBoardItemDTO) {
this._router.navigate(['/filiale/package-inspection/packages']);
this.navigated.emit();
}
}

View File

@@ -1,13 +1,3 @@
<div class="header">
<div class="notification-icon">
<span class="notification-counter">{{ notifications.length }}</span>
<ui-icon icon="notification" size="26px"></ui-icon>
</div>
<h2>Remission</h2>
</div>
<hr />
<div class="notification-list scroll-bar">
<ng-container *ngFor="let notification of notifications">
<modal-notifications-list-item [item]="notification" (itemSelected)="itemSelected($event)"></modal-notifications-list-item>

View File

@@ -1,101 +0,0 @@
import { createComponentFactory, Spectator, SpyObject } from '@ngneat/spectator';
import { CommonModule } from '@angular/common';
import { RouterTestingModule } from '@angular/router/testing';
import { UiIconModule } from '@ui/icon';
import { Router } from '@angular/router';
import { UiFilter } from '@ui/filter';
import { MessageBoardItemDTO } from 'apps/hub/notifications/src/lib/defs';
import { Component } from '@angular/core';
import { ModalNotificationsListItemComponent } from '../notifications-list-item/notifications-list-item.component';
import { ModalNotificationsRemissionGroupComponent } from './notifications-remission-group.component';
// DummyComponent Class
@Component({
selector: 'dummy-component',
template: '<div></div>',
})
class DummyComponent {
constructor() {}
}
describe('ModalNotificationsRemissionGroupComponent', () => {
let spectator: Spectator<ModalNotificationsRemissionGroupComponent>;
let uiFilterMock: SpyObject<UiFilter>;
let router: Router;
const createComponent = createComponentFactory({
component: ModalNotificationsRemissionGroupComponent,
declarations: [ModalNotificationsListItemComponent],
imports: [
CommonModule,
RouterTestingModule.withRoutes([
{ path: 'filiale/goods/in/results', component: DummyComponent },
{ path: 'filiale/remission/create', component: DummyComponent },
]),
UiIconModule,
],
providers: [],
mocks: [UiFilter],
});
beforeEach(() => {
spectator = createComponent({ props: { notifications: [] } });
router = spectator.inject(Router);
uiFilterMock = spectator.inject(UiFilter);
});
it('should create', () => {
expect(spectator.component).toBeTruthy();
});
describe('notifications input', () => {
it('should display the right notification-counter value based on the length of the input array', () => {
spectator.setInput({ notifications: [{}, {}, {}] });
expect(spectator.query('.notification-counter')).toHaveText('3');
});
it('should not display notification-counter if input array has length 0', () => {
spectator.setInput({ notifications: [] });
expect(spectator.query('.notification-counter')).toHaveText('');
});
it('should render modal-notifications-list-item based on the input array', () => {
const notifications = [{}, {}];
spectator.setInput({ notifications });
spectator.detectComponentChanges();
expect(spectator.queryAll('modal-notifications-list-item')).toHaveLength(notifications.length);
});
});
describe('itemSelected()', () => {
it('should navigate to results with queryParams from UiFilter.getQueryParamsFromQueryTokenDTO()', () => {
const item: MessageBoardItemDTO = { queryToken: { input: { main_qs: 'test' } } };
spyOn(UiFilter, 'getQueryParamsFromQueryTokenDTO').and.returnValue(item.queryToken.input);
spyOn(router, 'navigate');
spectator.component.itemSelected(item);
expect(router.navigate).toHaveBeenCalledWith(['/filiale/goods/in/results'], { queryParams: item.queryToken.input });
});
it('should emit the navigated event after select item', () => {
const item: MessageBoardItemDTO = { queryToken: { input: { main_qs: 'test' } } };
spyOn(spectator.component.navigated, 'emit');
spectator.component.itemSelected(item);
expect(spectator.component.navigated.emit).toHaveBeenCalled();
});
});
describe('actions CTA', () => {
it('should navigate to remission page after clicking the CTA', () => {
const cta = spectator.query('.cta-primary');
expect(cta).toHaveText('Zur Remission');
expect(cta).toHaveAttribute('href', '/filiale/remission/create');
});
it('should emit the navigated event after clicking the CTA', () => {
const cta = spectator.query('.cta-primary') as HTMLAnchorElement;
spyOn(spectator.component.navigated, 'emit');
spectator.click(cta);
expect(spectator.component.navigated.emit).toHaveBeenCalled();
});
});
});

View File

@@ -1,5 +1,6 @@
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, inject } from '@angular/core';
import { Router } from '@angular/router';
import { PickupShelfInNavigationService } from '@shared/services';
import { UiFilter } from '@ui/filter';
import { MessageBoardItemDTO } from 'apps/hub/notifications/src/lib/defs';
@@ -9,6 +10,8 @@ import { MessageBoardItemDTO } from 'apps/hub/notifications/src/lib/defs';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ModalNotificationsRemissionGroupComponent {
private _pickupShelfInNavigationService = inject(PickupShelfInNavigationService);
@Input()
notifications: MessageBoardItemDTO[];
@@ -18,8 +21,14 @@ export class ModalNotificationsRemissionGroupComponent {
constructor(private _router: Router) {}
itemSelected(item: MessageBoardItemDTO) {
const defaultNav = this._pickupShelfInNavigationService.listRoute();
const queryParams = UiFilter.getQueryParamsFromQueryTokenDTO(item.queryToken);
this._router.navigate(['/filiale/goods/in/results'], { queryParams });
this._router.navigate(defaultNav.path, {
queryParams: {
...defaultNav.queryParams,
...queryParams,
},
});
this.navigated.emit();
}
}

View File

@@ -1,13 +1,3 @@
<div class="header">
<div class="notification-icon">
<div class="notification-counter">{{ notifications.length }}</div>
<ui-icon icon="notification" size="26px"></ui-icon>
</div>
<h2>Reservierungsanfragen</h2>
</div>
<hr />
<div class="notification-list scroll-bar">
<ng-container *ngFor="let notification of notifications">
<modal-notifications-list-item [item]="notification" (itemSelected)="itemSelected($event)"></modal-notifications-list-item>

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