iobroker.shoppingroute 0.4.4 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +172 -23
  2. package/README_DE.md +43 -2
  3. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteAdminSet__mf_owner__1-DPLVD4vF.js +1 -0
  4. package/admin/custom/assets/helpers-CsVkgmeS.js +1 -0
  5. package/admin/custom/assets/hostInit-BOPgFMXR.js +1 -0
  6. package/admin/custom/assets/index-0cn00gCp.js +1 -0
  7. package/admin/custom/{markets/assets/index-2HOz3j7B.js → assets/index-12xv0FYP.js} +5 -5
  8. package/admin/custom/{review/assets/pendingShares-Cpf2lozX.js → assets/pendingShares-1oZLrQ_M.js} +2 -2
  9. package/admin/custom/assets/route-editor-components-ByNhyLfv.js +64 -0
  10. package/admin/custom/catalogManager/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteCatalogSet__mf_owner__1-DINIg-s7.js +1 -0
  11. package/admin/custom/catalogManager/assets/_virtual_mf___mfe_internal__ShoppingRouteCatalogSet__mf_owner__270978611965008__loadShare__react__loadShare__.js-Bw3vMJzu.js +1 -0
  12. package/admin/custom/catalogManager/assets/_virtual_mf___mfe_internal__ShoppingRouteCatalogSet__mf_owner__270978611965008__prebuild__react__prebuild__-B27G_6sf.js +9 -0
  13. package/admin/custom/catalogManager/assets/catalog-manager-components-D_8JNQyd.js +156 -0
  14. package/admin/custom/catalogManager/assets/helpers-CsVkgmeS.js +1 -0
  15. package/admin/custom/catalogManager/assets/hostInit-CX4Yac1I.js +1 -0
  16. package/admin/custom/catalogManager/assets/index-0cn00gCp.js +1 -0
  17. package/admin/custom/{productGroups/assets/index-2HOz3j7B.js → catalogManager/assets/index-12xv0FYP.js} +5 -5
  18. package/admin/custom/{assets/pendingShares-JrGCtzTF.js → catalogManager/assets/pendingShares-iypADtDA.js} +2 -2
  19. package/admin/custom/catalogManager/assets/vite-preload-helper-Dp1pzeXC.js +1 -0
  20. package/admin/custom/catalogManager/catalogManager.js +13 -0
  21. package/admin/custom/catalogManager/mf-manifest.json +1 -0
  22. package/admin/custom/catalogManager/mf-stats.json +1 -0
  23. package/admin/custom/markets/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteMarketsSet__mf_owner__1-DWD9ARvx.js +1 -0
  24. package/admin/custom/markets/assets/helpers-CsVkgmeS.js +1 -0
  25. package/admin/custom/markets/assets/hostInit-O4vB_3aJ.js +1 -0
  26. package/admin/custom/markets/assets/index-0cn00gCp.js +1 -0
  27. package/admin/custom/{assets/index-2HOz3j7B.js → markets/assets/index-12xv0FYP.js} +5 -5
  28. package/admin/custom/markets/assets/markets-editor-components-YlC_VFAa.js +67 -0
  29. package/admin/custom/markets/assets/pendingShares-mvCLhLzv.js +2 -0
  30. package/admin/custom/markets/marketsEditor.js +2 -2
  31. package/admin/custom/markets/mf-manifest.json +1 -1
  32. package/admin/custom/markets/mf-stats.json +1 -1
  33. package/admin/custom/mf-manifest.json +1 -1
  34. package/admin/custom/mf-stats.json +1 -1
  35. package/admin/custom/productGroups/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteProductGroupsSet__mf_owner__1-CuVRE3L9.js +1 -0
  36. package/admin/custom/productGroups/assets/helpers-CsVkgmeS.js +1 -0
  37. package/admin/custom/productGroups/assets/hostInit-BO6YEhS7.js +1 -0
  38. package/admin/custom/productGroups/assets/index-0cn00gCp.js +1 -0
  39. package/admin/custom/{review/assets/index-2HOz3j7B.js → productGroups/assets/index-12xv0FYP.js} +5 -5
  40. package/admin/custom/productGroups/assets/{pendingShares-Cmc6I2xN.js → pendingShares-CnxCGNGe.js} +2 -2
  41. package/admin/custom/productGroups/assets/product-groups-editor-components-D1GW1Ii0.js +44 -0
  42. package/admin/custom/productGroups/mf-manifest.json +1 -1
  43. package/admin/custom/productGroups/mf-stats.json +1 -1
  44. package/admin/custom/productGroups/productGroupsEditor.js +2 -2
  45. package/admin/custom/review/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteReviewSet__mf_owner__1-FjU0cujc.js +1 -0
  46. package/admin/custom/review/assets/helpers-CsVkgmeS.js +1 -0
  47. package/admin/custom/review/assets/hostInit-B25pGNwS.js +1 -0
  48. package/admin/custom/review/assets/index-0cn00gCp.js +1 -0
  49. package/admin/custom/review/assets/index-12xv0FYP.js +7 -0
  50. package/admin/custom/{markets/assets/pendingShares-DaxGcdrd.js → review/assets/pendingShares-DIMEss5x.js} +2 -2
  51. package/admin/custom/review/assets/{review-editor-components-BrjR0Z85.js → review-editor-components-BD-k-o3i.js} +2 -2
  52. package/admin/custom/review/mf-manifest.json +1 -1
  53. package/admin/custom/review/mf-stats.json +1 -1
  54. package/admin/custom/review/reviewEditor.js +2 -2
  55. package/admin/custom/routeEditor.js +2 -2
  56. package/admin/custom/shoppingList/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteShoppingListSet__mf_owner__1-a7n9bT1O.js +1 -0
  57. package/admin/custom/shoppingList/assets/helpers-CsVkgmeS.js +1 -0
  58. package/admin/custom/shoppingList/assets/hostInit-D9RbSpMP.js +1 -0
  59. package/admin/custom/shoppingList/assets/index-0cn00gCp.js +1 -0
  60. package/admin/custom/shoppingList/assets/index-12xv0FYP.js +7 -0
  61. package/admin/custom/shoppingList/assets/{pendingShares-DUnOFOkU.js → pendingShares-CrfC535i.js} +2 -2
  62. package/admin/custom/shoppingList/assets/shopping-list-editor-components-qCtkT06l.js +73 -0
  63. package/admin/custom/shoppingList/mf-manifest.json +1 -1
  64. package/admin/custom/shoppingList/mf-stats.json +1 -1
  65. package/admin/custom/shoppingList/shoppingListEditor.js +2 -2
  66. package/admin/jsonConfig.json +16 -17
  67. package/admin/jsonTab.json +18 -0
  68. package/build/lib/alexa-direct.js +21 -0
  69. package/build/lib/config-protection.js +50 -0
  70. package/build/main.js +277 -24
  71. package/io-package.json +80 -28
  72. package/package.json +2 -2
  73. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteAdminSet__mf_owner__1-CifzZTJE.js +0 -1
  74. package/admin/custom/assets/hostInit-BFP_9qwB.js +0 -1
  75. package/admin/custom/assets/route-editor-components-rW7iuBNT.js +0 -21
  76. package/admin/custom/assets/virtualExposes-D8D1innc.js +0 -1
  77. package/admin/custom/markets/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteMarketsSet__mf_owner__1-CdXcBfjG.js +0 -1
  78. package/admin/custom/markets/assets/hostInit-CrDCY7SQ.js +0 -1
  79. package/admin/custom/markets/assets/markets-editor-components-CUcyPBPl.js +0 -67
  80. package/admin/custom/markets/assets/virtualExposes-BhGZWOBB.js +0 -1
  81. package/admin/custom/productGroups/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteProductGroupsSet__mf_owner__1-DXUHDGDp.js +0 -1
  82. package/admin/custom/productGroups/assets/hostInit-D8t8XJ7f.js +0 -1
  83. package/admin/custom/productGroups/assets/product-groups-editor-components-CLVNuU40.js +0 -44
  84. package/admin/custom/productGroups/assets/virtualExposes-Cci9-KkN.js +0 -1
  85. package/admin/custom/review/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteReviewSet__mf_owner__1-CSWI0Knk.js +0 -1
  86. package/admin/custom/review/assets/hostInit-Bi90nPL8.js +0 -1
  87. package/admin/custom/review/assets/virtualExposes-C4BXYjQJ.js +0 -1
  88. package/admin/custom/shoppingList/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteShoppingListSet__mf_owner__1-DRCeDtVc.js +0 -1
  89. package/admin/custom/shoppingList/assets/hostInit-usOXh1g1.js +0 -1
  90. package/admin/custom/shoppingList/assets/index-2HOz3j7B.js +0 -7
  91. package/admin/custom/shoppingList/assets/shopping-list-editor-components-DdXx3Xxu.js +0 -27
  92. package/admin/custom/shoppingList/assets/virtualExposes-9FoWCC98.js +0 -1
package/README.md CHANGED
@@ -1,45 +1,194 @@
1
1
  # ShoppingRoute for ioBroker
2
2
 
3
- ![ShoppingRoute](admin/shoppingroute.png)
3
+ <p align="center">
4
+ <img src="admin/shoppingroute.png" alt="ShoppingRoute" width="160">
5
+ </p>
4
6
 
5
- **Current version: 0.4.4**
7
+ <p align="center">
8
+ <strong>Smart Alexa shopping lists — sorted by store, product group and your real walking route.</strong>
9
+ </p>
6
10
 
7
- ShoppingRoute sorts Alexa shopping-list entries by market, product group and each store's individual walking route. It assigns visible two-digit keys such as `20> Bananas` and `40> ═════ ALDI ═════`; managed lists must therefore be set to **A–Z** in the Alexa app. ShoppingRoute reuses the local Alexa2 authentication for direct item updates, deletes and batch creates, while Alexa2 list states remain the external change trigger.
11
+ <p align="center">
12
+ <img src="http://iobroker.live/badges/shoppingroute-installed.svg" alt="ioBroker installations">
13
+ <img src="http://iobroker.live/badges/shoppingroute-stable.svg" alt="ioBroker stable installations">
14
+ <a href="https://www.npmjs.com/package/iobroker.shoppingroute"><img src="https://img.shields.io/npm/v/iobroker.shoppingroute.svg" alt="npm version"></a>
15
+ <a href="https://www.npmjs.com/package/iobroker.shoppingroute"><img src="https://img.shields.io/npm/dm/iobroker.shoppingroute.svg" alt="npm downloads"></a>
16
+ <a href="https://github.com/RaviniZib/ioBroker.shoppingroute/actions/workflows/test-and-release.yml"><img src="https://github.com/RaviniZib/ioBroker.shoppingroute/actions/workflows/test-and-release.yml/badge.svg" alt="Test and Release"></a>
17
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT license"></a>
18
+ </p>
8
19
 
9
- ## User guide / Bedienungsanleitung
20
+ > **Current version: 0.5.1**
21
+ > ShoppingRoute is available in the ioBroker **latest** repository.
10
22
 
11
- 🇬🇧 [**English user guide**](USER_GUIDE_EN.md)
12
- 🇩🇪 [**Deutsche Bedienungsanleitung**](BEDIENUNGSANLEITUNG_DE.md)
23
+ ## What ShoppingRoute does
13
24
 
14
- ## Highlights
25
+ ShoppingRoute turns an ordinary Alexa shopping list into a practical shopping assistant. **All stores can share one Alexa list, or you can deliberately split them across several lists.** Its key feature is configurable **market routing**: for every store, you define your own walking order through the sections. ShoppingRoute then arranges the list to match the way you actually move through the shop — reducing backtracking and searching for **faster, more efficient shopping**.
15
26
 
16
- - multiple Alexa lists with per-list priority markets
17
- - global, per-list and temporary market priorities
18
- - market aliases and common market-name variants
19
- - optional automatically managed market headings such as `═════ ALDI ═════`
20
- - optional cross-market consolidation using a minimum-item threshold; explicit market requests are never moved
21
- - configurable product groups and store-specific routes
22
- - product catalogue with aliases, preferred and available markets
23
- - quantity parser for digits, number words, packs, half-kilo and `6x` forms
24
- - duplicate-resistant product learning
27
+ Instead of keeping items only in the order Alexa received them, the adapter can assign them to stores, product groups and a configurable walking route inside each store. It uses visible two-digit prefixes such as `20> Bananas` and optional market headings such as `40> ═════ ALDI ═════`.
28
+
29
+ That means a list can automatically become something like:
30
+
31
+ ```text
32
+ 10> Apples
33
+ 20> Bananas
34
+ 30> Bread
35
+ 40> ═════ ALDI ═════
36
+ 50> Milk
37
+ 60> Cheese
38
+ 70> Coffee
39
+ ```
40
+
41
+ Managed Alexa lists must be set to **A–Z** in the Alexa app. ShoppingRoute then controls the effective order through its prefixes.
42
+
43
+ ShoppingRoute reuses the local authentication of the ioBroker **Alexa2** adapter for direct item updates, deletions and batch creation. Alexa2 list states remain the external change trigger.
44
+
45
+ **Service / manufacturer reference:** ShoppingRoute works with Amazon Alexa shopping lists. Amazon documents Alexa lists as a customer feature of the Alexa ecosystem; customers can access Alexa shopping and to-do lists through the Alexa app, Amazon app and Amazon retail site. See the [official Amazon Alexa developer documentation](https://www.developer.amazon.com/en-US/docs/alexa/ask-overviews/deprecated-features.html#list-skills-and-alexa-shopping-and-to-do-lists).
46
+
47
+ ## Documentation
48
+
49
+ Choose your language:
50
+
51
+ - 🇬🇧 **English:** [User guide](USER_GUIDE_EN.md)
52
+ - 🇩🇪 **Deutsch:** [Bedienungsanleitung](BEDIENUNGSANLEITUNG_DE.md) · [Ausführliche README](README_DE.md)
53
+
54
+ Community and support:
55
+
56
+ - 🧪 [ioBroker tester forum – ShoppingRoute](https://forum.iobroker.net/topic/85510/test-adapter-shoppingroute-v0.4.4)
57
+ - 🐞 [GitHub issues](https://github.com/RaviniZib/ioBroker.shoppingroute/issues)
58
+
59
+ Adapter settings and the backup utility include all 11 standard ioBroker Admin languages. Shopping-list feedback is available in German and English.
60
+
61
+ ## What's new in 0.5.1
62
+
63
+ This release fixes the saving and moving problems reported with the new management page and makes shopping from a phone more comfortable:
64
+
65
+ - **Create usable Alexa lists:** a new list is created and confirmed in Alexa before ShoppingRoute uses it. An invalid new binding is rejected before it can affect healthy lists.
66
+ - **Add items while shopping:** add an item directly on the Shopping list page, including to an empty list.
67
+ - **Move to the end and back:** dedicated end-drop areas, touch drag handles, corrected insertion positions and empty return markets make moves easier. Use “Show other markets as drop targets” to reveal additional destinations.
68
+ - **Understand longer updates:** a visible message explains the pending Alexa update immediately. The adapter reports the final result separately, so a longer operation is not mistaken for an immediate failure.
69
+ - **Keep catalogue changes:** deletions, ordering changes and selections on the management page save automatically. Typed edits wait for the **Save** button; **Add** submits a new entry. Saved data survives reopening the page.
70
+ - **Avoid interrupted saves:** local catalogue saves no longer make unnecessary Amazon checks, and learned catalogue data no longer causes an instance restart. Rapid edits are queued, and unsuccessful saves retain your changes for retry.
71
+ - **Move an item back after an Alexa rebuild:** changed Amazon item IDs can be resolved by an unambiguous item name. Duplicate names are never guessed.
72
+
73
+ Open **ShoppingRoute** in the ioBroker sidebar on your phone. Use the `⋮⋮` handle to drag, or use the arrow buttons and market selector. After updating, fully reload the management page once to load the new interface. Alexa list writes still use the configured rate limits, Dry Run and verification safeguards.
74
+
75
+ ## Main features
76
+
77
+ - dedicated **ShoppingRoute management page** in the ioBroker sidebar for shopping list, products, markets, product groups, routes, lists and review items
78
+ - catalogue changes are persisted at runtime and do not require an adapter restart
79
+ - create confirmed Alexa lists and add shopping items directly from the phone
80
+ - automatic saving of structural changes, with explicit Save for typed edits
81
+ - market names are always stored in **UPPERCASE**, regardless of how they are entered, with all references normalized consistently
82
+ - defensive protection against accidental catalogue resets during Admin/update flows
83
+
84
+ ### Store and route based sorting
85
+
86
+ - configurable stores and store aliases
87
+ - individual walking route for every store
88
+ - product groups with independent sort order
89
+ - preferred and available markets per product
90
+ - global, per-list and temporary priority markets
91
+ - optional market headings such as `═════ ALDI ═════`
92
+ - optional cross-market consolidation using a minimum-item threshold
93
+ - explicit market requests are never moved to another store
94
+
95
+ ### Smart product handling
96
+
97
+ - product catalogue with aliases
98
+ - duplicate-resistant learning
25
99
  - review queue for unknown products
26
- - automatic/review/off learning modes
100
+ - automatic, review and off learning modes
27
101
  - category and alias suggestions
28
- - sorting preview before writes
29
- - incremental `00>`–`99>` prefix sorting with gap-preserving inserts and suffix-only rebuilds
30
- - direct Amazon responses plus one final list read as write confirmation
102
+ - quantity parsing for digits, number words, packs, half-kilo expressions and `6x` forms
103
+ - manual per-item market and position overrides
104
+
105
+ ### Alexa-safe list updates
106
+
107
+ - incremental `00>`–`99>` prefix sorting
108
+ - gap-preserving inserts to avoid unnecessary rewrites
109
+ - suffix-only rebuilds when a numeric gap is exhausted
110
+ - direct Amazon responses used to confirm operations
111
+ - final direct list read for verification
112
+ - exclusive transaction handling to prevent overlapping writes
113
+ - recovery journal for interrupted operations
31
114
  - API Safe Mode with configurable write-rate limiting
115
+ - bounded Alexa callbacks and polling with backoff
116
+
117
+ ### Admin and diagnostics
118
+
119
+ - interactive current shopping-list view
120
+ - drag & drop plus touch-friendly controls
121
+ - sorting preview before writes
32
122
  - local-only shopping statistics
33
- - configuration backup/restore
123
+ - configuration backup and restore
34
124
  - shareable market-route profiles
35
- - privacy-safe diagnostic/feedback report
125
+ - privacy-safe diagnostic and feedback report
36
126
  - Alexa2/alexa-remote2 direct-session diagnostics
37
127
  - Dry Run safety mode
38
128
 
39
- See `README_DE.md` for the detailed German documentation.
129
+ ## Requirements
130
+
131
+ - ioBroker with **Admin 8 or newer**
132
+ - **js-controller 7.1.0 or newer**
133
+ - a working ioBroker **Alexa2** adapter instance
134
+ - the Alexa shopping list managed by ShoppingRoute must be sorted **A–Z** in the Alexa app
135
+
136
+ ## How it works
137
+
138
+ 1. Alexa2 reports a shopping-list change to ioBroker.
139
+ 2. ShoppingRoute reads the affected list and normalizes the item names.
140
+ 3. Products are matched against aliases, product groups and market assignments.
141
+ 4. The adapter builds the best market and route plan.
142
+ 5. Only the required list changes are written back to Amazon.
143
+ 6. The final remote list is read again and verified.
144
+
145
+ The browser-based Admin interface never receives Alexa or Amazon credentials.
146
+
147
+ ## Privacy and safety
148
+
149
+ ShoppingRoute does not require its own Amazon login. It reuses the locally stored Alexa2 session and does not log authentication secrets.
150
+
151
+ Statistics are stored locally. The feedback report is designed to be privacy-safe, and Dry Run can be used to inspect planned changes without modifying the shopping list.
152
+
153
+ ## Installation
154
+
155
+ Install ShoppingRoute from the ioBroker **Adapters** page while using the **latest** repository.
156
+
157
+ After installation:
158
+
159
+ 1. create an instance of ShoppingRoute,
160
+ 2. select/configure the Alexa shopping list,
161
+ 3. define markets and product groups,
162
+ 4. configure the walking route for each store,
163
+ 5. set the managed Alexa list to **A–Z**,
164
+ 6. start with **Dry Run** if you want to inspect the result before enabling writes.
165
+
166
+ For all configuration details, see the [English user guide](USER_GUIDE_EN.md) or the [German user guide](BEDIENUNGSANLEITUNG_DE.md).
167
+
168
+ ## Feedback and support
169
+
170
+ ShoppingRoute is still young, so real-world feedback is especially valuable.
171
+
172
+ Please use the [ioBroker tester thread](https://forum.iobroker.net/topic/85510/test-adapter-shoppingroute-v0.4.4) for general testing feedback and the [GitHub issue tracker](https://github.com/RaviniZib/ioBroker.shoppingroute/issues) for reproducible bugs or feature requests.
40
173
 
41
174
  ## Changelog
42
175
 
176
+ ### 0.5.1 (2026-10-07)
177
+ - Create new lists in Alexa and verify them before saving their bindings; add shopping items directly, including to empty lists.
178
+ - Show immediate, readable progress for Alexa moves, retain optimistic positions while waiting, and track long operations without the previous UI timeout failure.
179
+ - Fix end-drop targets, row insertion positions, touch dragging and empty return markets in the shopping list; restore drag ordering for markets, product groups and walking routes.
180
+ - Save deletions, ordering and selections immediately on the management page; preserve typed drafts until Save and queue rapid structural changes without a retry loop.
181
+ - Keep local saves independent of unnecessary Amazon list checks; persist learned catalogues in runtime data instead of restarting the instance through native-object writes.
182
+ - Safely resolve uniquely named items after Amazon replaces their IDs, retaining rejection for ambiguous duplicate names and all write safeguards.
183
+ - Provide German and English shopping feedback, a language-aware help button and updated user guides and READMEs.
184
+
185
+ ### 0.5.0 (2026-10-05)
186
+ - Add a dedicated ShoppingRoute management page in the ioBroker sidebar with a fixed header and direct management of shopping list, products, markets, product groups, routes, lists and review queue.
187
+ - Persist large catalogue data outside normal instance configuration so catalogue edits no longer require an adapter restart.
188
+ - Add defensive recovery and regression coverage for the destructive Admin/default reset reported in issue #59, including a successful real-instance reproduction test.
189
+ - Normalize every market name to UPPERCASE on create, rename, load and save, and update market references consistently.
190
+ - Refine the management UI with a stable sticky header, logo and shaded/zebra list blocks.
191
+
43
192
  ### 0.4.4 (2026-09-25)
44
193
  - (RaviniZib) Use `No Market` for new fallback-market defaults, add all 11 admin languages to the backup utility, and remove six unused translation keys. Existing market names, routes and product data remain unchanged.
45
194
 
package/README_DE.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  ![ShoppingRoute](admin/shoppingroute.png)
4
4
 
5
- **Aktuelle Version: 0.4.4**
5
+ **Aktuelle Version: 0.5.1**
6
+
7
+ ShoppingRoute macht aus einer normalen Alexa-Einkaufsliste eine praktische Einkaufshilfe: **Alle Märkte können gemeinsam in einer einzigen Liste geführt oder bewusst auf mehrere Listen verteilt werden.** Das besondere Merkmal ist das frei einstellbare **Marktrouting**: Für jeden Markt legst du deinen persönlichen Laufweg durch die Abteilungen fest. Dadurch steht die Einkaufsliste in der Reihenfolge, in der du tatsächlich durch den Laden gehst – für weniger Zurücklaufen, weniger Suchen und **schnelleres, effizienteres Einkaufen**.
6
8
 
7
9
  ShoppingRoute sortiert Alexa-Einkaufslisteneinträge nach Markt, Produktgruppe und dem individuellen Laufweg durch den jeweiligen Markt. Dazu vergibt es sichtbare zweistellige Schlüssel wie `20> Bananen` und `40> ═════ ALDI ═════`; verwaltete Listen müssen deshalb in der Alexa-App auf **A–Z** stehen. ShoppingRoute übernimmt lokal die Alexa2-Authentifizierung für direkte Updates, Deletes und Batch-Creates; Alexa2-Listenstates bleiben die Triggerquelle für externe Änderungen.
8
10
 
@@ -11,8 +13,31 @@ ShoppingRoute sortiert Alexa-Einkaufslisteneinträge nach Markt, Produktgruppe u
11
13
  🇩🇪 [**Deutsche Bedienungsanleitung**](BEDIENUNGSANLEITUNG_DE.md)
12
14
  🇬🇧 [**English user guide**](USER_GUIDE_EN.md)
13
15
 
16
+ ## Neu in 0.5.1: bequem am Handy einkaufen
17
+
18
+ Diese Version behebt die gemeldeten Speicher- und Verschiebefehler der neuen Verwaltungsseite. Im Mittelpunkt steht die Bedienung am Handy während des Einkaufs:
19
+
20
+ - **Neue Listen tatsächlich in Alexa anlegen:** ShoppingRoute erstellt und bestätigt die Liste in Alexa, bevor sie verwendet wird. Eine ungültige neue Listenverknüpfung wird vor dem Speichern zurückgewiesen und beeinträchtigt keine funktionierenden Listen.
21
+ - **Artikel direkt hinzufügen:** Auf der Seite **Einkaufsliste** kannst du neue Artikel eintragen, auch wenn die Alexa-Liste noch leer ist.
22
+ - **Bis ans Ende und wieder zurück verschieben:** Eigene Ablageflächen am Listenende, Touch-Griffe, korrigierte Einfügepositionen und leere Rückkehr-Märkte erleichtern das Verschieben. Mit **Weitere Märkte als Ablageziel anzeigen** werden zusätzliche Zielmärkte eingeblendet.
23
+ - **Längere Vorgänge verstehen:** Ein gut lesbarer Hinweis erklärt sofort, dass Alexa gerade aktualisiert wird. Das endgültige Ergebnis wird gesondert abgefragt; ein längerer Vorgang wird nicht mehr durch den bisherigen Oberflächen-Timeout als fehlgeschlagen angezeigt.
24
+ - **Änderungen behalten:** Löschen, Umordnen und Auswahlen auf der Verwaltungsseite werden sofort gespeichert. Texteingaben bleiben bis zum Druck auf **Speichern** ein Entwurf; **Hinzufügen** übernimmt einen neuen Eintrag. Gespeicherte Änderungen bleiben beim erneuten Öffnen erhalten.
25
+ - **Unterbrochene Speicheraktionen vermeiden:** Lokale Katalogänderungen benötigen keine unnötige Amazon-Abfrage mehr. Lerndaten werden ohne Adapter-Neustart gespeichert. Schnelle Änderungen werden nacheinander verarbeitet; bei einem echten Speicherfehler bleiben die Eingaben für einen erneuten Versuch erhalten.
26
+ - **Artikel nach einer Alexa-Neunummerierung zurückschieben:** Geänderte Amazon-Artikel-IDs werden bei eindeutigem Artikelnamen sicher zugeordnet. Bei gleichnamigen Artikeln wird keine Zuordnung geraten.
27
+
28
+ Öffne **ShoppingRoute** in der ioBroker-Seitenleiste auf dem Handy. Zum Ziehen verwendest du den Griff `⋮⋮`; Pfeiltasten und Marktauswahl stehen weiterhin zur Verfügung. Nach dem Update bitte die Verwaltungsseite einmal vollständig neu laden. Alexa-Schreibzugriffe verwenden weiterhin die eingestellten Limits, Dry-Run und Ergebnisprüfungen.
29
+
30
+ Rückmeldungen zu 0.5.1 bitte im bestehenden [Tester-Thread](https://forum.iobroker.net/topic/85510/test-adapter-shoppingroute-v0.4.4) oder als [GitHub-Issue](https://github.com/RaviniZib/ioBroker.shoppingroute/issues) melden.
31
+
14
32
  ## Funktionen
15
33
 
34
+ - eigene **ShoppingRoute-Verwaltungsseite** in der ioBroker-Seitenleiste für Einkaufsliste, Artikel, Märkte, Produktgruppen, Laufwege, Listen und Prüfung
35
+ - Katalogänderungen werden zur Laufzeit gespeichert und benötigen keinen Adapter-Neustart
36
+ - bestätigte Alexa-Listen und neue Einkaufsartikel direkt am Handy anlegen
37
+ - sofortiges Speichern von Strukturänderungen; Texteingaben über den Button **Speichern** übernehmen
38
+ - Marktnamen werden unabhängig von der Eingabe automatisch in **GROSSBUCHSTABEN** gespeichert; alle Marktverweise werden konsistent mit normalisiert
39
+ - Schutz vor versehentlichem Zurücksetzen großer Katalogdaten durch Admin-/Update-Vorgänge
40
+
16
41
  - mehrere Alexa-Einkaufslisten mit eigenem Prioritätsmarkt
17
42
  - globale, listenbezogene und temporäre Marktpriorität
18
43
  - Markt-Aliase und automatische Erkennung häufiger Marktvarianten
@@ -50,7 +75,7 @@ Bei der Marktzuordnung gilt:
50
75
  6. erster erlaubter Markt aus „Verfügbare Märkte“
51
76
  7. Fallback-Markt
52
77
 
53
- Anschließend kann 0.3.0 flexible Artikel marktübergreifend zusammenlegen, wenn ein zusätzlicher Markt die konfigurierte Mindestanzahl nicht erreicht. Dafür werden ausschließlich im Artikelstamm hinterlegte alternative verfügbare Märkte verwendet. Explizite Angaben wie `Milch von LIDL` oder `Eier bei ALDI` werden niemals verschoben.
78
+ Anschließend kann ShoppingRoute flexible Artikel marktübergreifend zusammenlegen, wenn ein zusätzlicher Markt die konfigurierte Mindestanzahl nicht erreicht. Dafür werden ausschließlich im Artikelstamm hinterlegte alternative verfügbare Märkte verwendet. Explizite Angaben wie `Milch von LIDL` oder `Eier bei ALDI` werden niemals verschoben.
54
79
 
55
80
  ## Wichtige Datenpunkte
56
81
 
@@ -73,6 +98,22 @@ ShoppingRoute wird unter der **[MIT-Lizenz](LICENSE)** veröffentlicht. Frühere
73
98
 
74
99
  ## Changelog
75
100
 
101
+ ### 0.5.1 (2026-10-07)
102
+ - Neue Listen werden in Alexa angelegt und vor dem Speichern ihrer Verknüpfung bestätigt; Einkaufsartikel können direkt hinzugefügt werden, auch in leeren Listen.
103
+ - Alexa-Verschiebungen zeigen sofort eine gut lesbare Rückmeldung. Die gewählte Position bleibt während des Wartens sichtbar; lange Vorgänge werden ohne den bisherigen Oberflächen-Timeout verfolgt.
104
+ - Ablageflächen am Listenende, Einfügepositionen, Touch-Ziehen und leere Rückkehr-Märkte in der Einkaufsliste korrigiert; Drag & Drop für Märkte, Produktgruppen und Laufwege wiederhergestellt.
105
+ - Löschen, Umordnen und Auswahlen auf der Verwaltungsseite werden sofort gespeichert. Texteingaben bleiben bis zum Speichern erhalten; schnelle Strukturänderungen werden ohne Wiederholungsschleife verarbeitet.
106
+ - Unnötige Amazon-Listenprüfungen bei lokalen Speicheraktionen entfernt. Lerndaten werden als Laufzeitdaten gespeichert und lösen keine Neustarts über das Instanzobjekt mehr aus.
107
+ - Eindeutig benannte Artikel werden nach geänderten Amazon-IDs sicher wiedererkannt. Mehrdeutige Zuordnungen bleiben gesperrt; Schutzmechanismen für Alexa-Schreibzugriffe bleiben erhalten.
108
+ - Deutsche und englische Einkaufslisten-Rückmeldungen, sprachabhängigen Hilfe-Button, Bedienungsanleitungen und beide READMEs aktualisiert.
109
+
110
+ ### 0.5.0 (2026-10-05)
111
+ - Neue eigenständige ShoppingRoute-Verwaltungsseite in der ioBroker-Seitenleiste mit fester Kopfzeile sowie Einkaufsliste, Artikel-, Markt-, Produktgruppen-, Laufweg-, Listen- und Prüfverwaltung.
112
+ - Große Katalogdaten werden außerhalb der normalen Instanzkonfiguration als Laufzeitdaten gespeichert; Änderungen benötigen keinen Adapter-Neustart mehr.
113
+ - Schutzmechanismus und Regressionstests verhindern den in Issue #59 beobachteten Rückfall auf Paket-Standarddaten; zusätzlich auf einer realen ioBroker-Instanz geprüft.
114
+ - Marktnamen werden beim Anlegen, Umbenennen, Laden und Speichern immer in GROSSBUCHSTABEN normalisiert; Marktverweise werden konsistent mitgezogen.
115
+ - Überarbeitete Verwaltungsoberfläche mit festem Header, Logo und dezenter Block-/Zebra-Darstellung.
116
+
76
117
  ### 0.4.4 (2026-09-25)
77
118
  - (RaviniZib) `No Market` als Standard-Ausweichmarkt für neue Konfigurationen, Backup-Seite in allen 11 Admin-Sprachen und sechs ungenutzte Übersetzungsschlüssel entfernt. Vorhandene Marktnamen, Laufwege und Produktdaten bleiben unverändert.
78
119
 
@@ -0,0 +1 @@
1
+ import"./index-0cn00gCp.js";import"./index-12xv0FYP.js";const l=e=>{let t=e;for(let o=0;o<5;o++){const r=t==null?void 0:t.default;if(!r||typeof r!="object"||Object.keys(r).length===0)break;const n=Object.keys(t).filter(a=>a!=="default").map(a=>t[a]);if(n.length>0&&n.some(a=>a!==void 0))break;t=r}return t},s={react:async()=>await import("./_virtual_mf___mfe_internal__ShoppingRouteAdminSet__mf_owner__195137731327240__prebuild__react__prebuild__-Dj6dAy_K.js")},u={react:{name:"react",version:"18.3.1",scope:["default"],loaded:!1,materialize:!0,eager:!1,from:"ShoppingRouteAdminSet",canLiveRebind:!0,get(){const e=u.react;return e.lib?e.lib:(e.loading||(e.loading=(async()=>{try{const{react:t}=s,o=await t(),r=l({...o});return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),e.lib=function(){return r},e.loaded=!0,e.lib}finally{e.loading=void 0}})()),e.loading)},shareConfig:{singleton:!0,requiredVersion:">=18",strictVersion:!1,eager:!1}}},m=[];export{m as usedRemotes,u as usedShared};
@@ -0,0 +1 @@
1
+ import{h as s}from"./index-12xv0FYP.js";const e=s.share;export{e as s};
@@ -0,0 +1 @@
1
+ import{_ as G}from"./vite-preload-helper-Dp1pzeXC.js";import{s as Y}from"./helpers-CsVkgmeS.js";import"./index-12xv0FYP.js";const w="__mf_module_cache__";globalThis[w]||={share:{},remote:{}};globalThis[w].share||={};globalThis[w].remote||={};const l=globalThis[w];for(const _ of Object.keys(l.share))if(_.startsWith("default:")){const S=_.slice(8);l.share[S]===void 0&&(l.share[S]=l.share[_])}else if(!_.includes(":")){const S="default:"+_;l.share[S]===void 0&&(l.share[S]=l.share[_])}let v;async function Z(){return v||(v=(async()=>{const _=(o,e,t,s)=>{const n=(Array.isArray(s)?s[0]:s)||"default",i=e||!t?o:o+"@"+t,f={canonical:n+":"+i};return n==="default"&&(f.aliases=[i]),f},S=(o,e)=>{const t=o[e.canonical];if(t!==void 0)return t;const s=e.aliases||[];for(const r of s){if(!Object.prototype.hasOwnProperty.call(o,r))continue;const n=o[r];if(n!==void 0)return o[e.canonical]=n,n}},L=Symbol.for("module-federation.shared-cache-listeners"),j=Symbol.for("module-federation.shared-cache-owners"),B=o=>{let e=o[j];return e===void 0&&(e=Object.create(null),Object.defineProperty(o,j,{value:e,enumerable:!1,configurable:!1,writable:!1})),e},x=(o,e)=>{var t;return(t=o[j])==null?void 0:t[e.canonical]},W=(o,e,t,s)=>{var i;o[e.canonical]=t;const r=e.aliases||[];for(const f of r)Object.defineProperty(o,f,{value:t,enumerable:!0,configurable:!0,writable:!0});o[j],B(o)[e.canonical]=s;const n=(i=o[L])==null?void 0:i[e.canonical];if(n)for(const f of n)f(t);return t},m=await(await import("../routeEditor.js")).init(),{usedShared:k}=await G(async()=>{const{usedShared:o}=await import("./_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteAdminSet__mf_owner__1-DPLVD4vF.js");return{usedShared:o}},[],import.meta.url),F=o=>{let e=o;for(let t=0;t<5;t++){const s=e==null?void 0:e.default;if(!s||typeof s!="object"||Object.keys(s).length===0)break;const r=Object.keys(e).filter(n=>n!=="default").map(n=>e[n]);if(r.length>0&&r.some(n=>n!==void 0))break;e=s}return e},U=(o,e)=>A(e).some(t=>{var s,r;return Object.keys(((r=(s=m.shareScopeMap)==null?void 0:s[t])==null?void 0:r[o])||{}).some(n=>n!==e.version)}),q=[["react"]],E=Symbol("mf.originalSharedProvider"),J={emit:o=>o},A=o=>Array.isArray(o.scope)?o.scope:[o.scope||"default"],Q=(o,e)=>{const t={};for(const[s,r]of Object.entries(o))t[s]=Object.assign({},r,{[E]:r});return t},X=(o,e,t,s)=>{var C;if(!o||!t)return;const r=Object.fromEntries(Object.entries(o).filter(([,d])=>{var b;return((b=d==null?void 0:d.shareConfig)==null?void 0:b.import)!==!1}));if(Object.keys(r).length===0)return;const n=A(t),i=Q(r),f={};for(const d of n)f[d||"default"]={[e]:i};const p=(C=Y.getRegisteredShare(f,e,{...t,scope:n,strategy:s},J))==null?void 0:C.shared;return(p==null?void 0:p[E])||p},R=(o,e,t,s)=>{var r;return(r=t.shareConfig)!=null&&r.singleton?Object.values(o||{}).some(n=>{var i;return((i=n==null?void 0:n.shareConfig)==null?void 0:i.import)!==!1}):!!X(o,e,{...t,scope:[s]},"version-first")};for(const o of q)await Promise.all(o.map(async e=>{var r,n,i,f,p,C,d,b,K,N,T,I,V,H;const t=k[e];if(!t||t.materialize===!1||t.treeShaking)return;const s=_(e,(r=t.shareConfig)==null?void 0:r.singleton,t.version,t.scope);if(!(S(l.share,s)!==void 0&&(!((n=t.shareConfig)!=null&&n.singleton)&&x(l.share,s)==="ShoppingRouteAdminSet"||(i=t.shareConfig)!=null&&i.singleton&&!U(e,t)))){if(((f=t.shareConfig)==null?void 0:f.import)===!1){const u=A(t),O=c=>{var a,h;return!R((h=(a=m.shareScopeMap)==null?void 0:a[c])==null?void 0:h[e],e,t,c)};if(u.some(O)){m.__mfKeepAdoptedProviders||(m.__mfKeepAdoptedProviders=!0,(K=(b=(d=(C=(p=m.sharedHandler)==null?void 0:p.hooks)==null?void 0:C.lifecycle)==null?void 0:d.afterRegisterShare)==null?void 0:b.on)==null||K.call(b,c=>{var g,M,D,z;const{shared:a,previousShared:h,registeredShared:P}=c||{};if(((g=a==null?void 0:a.shareConfig)==null?void 0:g.import)!==!1||P!==a||!h||((M=h.shareConfig)==null?void 0:M.import)===!1)return;const y=(z=(D=m.shareScopeMap)==null?void 0:D[c.scope])==null?void 0:z[c.pkgName];y&&y[a.version]===a&&(y[a.version]=h)}));for(const c of((N=globalThis.__FEDERATION__)==null?void 0:N.__INSTANCES__)||[])for(const a of u){const h=(I=(T=c==null?void 0:c.shareScopeMap)==null?void 0:T[a])==null?void 0:I[e];if(!R(h,e,t,a)||!O(a))continue;const P=(m.shareScopeMap[a]||={})[e]||={};for(const[y,g]of Object.entries(h))((V=g==null?void 0:g.shareConfig)==null?void 0:V.import)!==!1&&(P[y]&&((H=P[y].shareConfig)==null?void 0:H.import)!==!1||(P[y]=g))}}if(u.every(O))return}await m.loadShare(e,{customShareInfo:{shareConfig:t.shareConfig}}).then(async u=>{if(u===!1)return;const O=typeof u=="function"?u():u;let c=F(await Promise.resolve(O));W(l.share,s,c,"ShoppingRouteAdminSet")})}}));return m})()),v}v=Z();export{v as hostInitPromise,Z as initHost};
@@ -0,0 +1 @@
1
+ import{C as a,M as o,g as u,s,a as d}from"./index-12xv0FYP.js";function l(){return typeof FEDERATION_BUILD_IDENTIFIER<"u"?FEDERATION_BUILD_IDENTIFIER:""}function f(e,n){const t=l();return a.__FEDERATION__.__INSTANCES__.find(r=>!!(t&&r.options.id===t||r.options.name===e&&!r.options.version&&!n||r.options.name===e&&n&&r.options.version===n))}function I(e){const n=new(u()||o)({id:`${e.name}@${e.version||Date.now()}`,...e});return s(n),n}let i=null;function _(e){const n=f(e.name,e.version),t={...e,id:e.id||""};return n?(n.initOptions(t),i||(i=n),n):(i=I(t),i)}d(o);export{_ as i};