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.
- package/README.md +172 -23
- package/README_DE.md +43 -2
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteAdminSet__mf_owner__1-DPLVD4vF.js +1 -0
- package/admin/custom/assets/helpers-CsVkgmeS.js +1 -0
- package/admin/custom/assets/hostInit-BOPgFMXR.js +1 -0
- package/admin/custom/assets/index-0cn00gCp.js +1 -0
- package/admin/custom/{markets/assets/index-2HOz3j7B.js → assets/index-12xv0FYP.js} +5 -5
- package/admin/custom/{review/assets/pendingShares-Cpf2lozX.js → assets/pendingShares-1oZLrQ_M.js} +2 -2
- package/admin/custom/assets/route-editor-components-ByNhyLfv.js +64 -0
- package/admin/custom/catalogManager/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteCatalogSet__mf_owner__1-DINIg-s7.js +1 -0
- package/admin/custom/catalogManager/assets/_virtual_mf___mfe_internal__ShoppingRouteCatalogSet__mf_owner__270978611965008__loadShare__react__loadShare__.js-Bw3vMJzu.js +1 -0
- package/admin/custom/catalogManager/assets/_virtual_mf___mfe_internal__ShoppingRouteCatalogSet__mf_owner__270978611965008__prebuild__react__prebuild__-B27G_6sf.js +9 -0
- package/admin/custom/catalogManager/assets/catalog-manager-components-D_8JNQyd.js +156 -0
- package/admin/custom/catalogManager/assets/helpers-CsVkgmeS.js +1 -0
- package/admin/custom/catalogManager/assets/hostInit-CX4Yac1I.js +1 -0
- package/admin/custom/catalogManager/assets/index-0cn00gCp.js +1 -0
- package/admin/custom/{productGroups/assets/index-2HOz3j7B.js → catalogManager/assets/index-12xv0FYP.js} +5 -5
- package/admin/custom/{assets/pendingShares-JrGCtzTF.js → catalogManager/assets/pendingShares-iypADtDA.js} +2 -2
- package/admin/custom/catalogManager/assets/vite-preload-helper-Dp1pzeXC.js +1 -0
- package/admin/custom/catalogManager/catalogManager.js +13 -0
- package/admin/custom/catalogManager/mf-manifest.json +1 -0
- package/admin/custom/catalogManager/mf-stats.json +1 -0
- package/admin/custom/markets/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteMarketsSet__mf_owner__1-DWD9ARvx.js +1 -0
- package/admin/custom/markets/assets/helpers-CsVkgmeS.js +1 -0
- package/admin/custom/markets/assets/hostInit-O4vB_3aJ.js +1 -0
- package/admin/custom/markets/assets/index-0cn00gCp.js +1 -0
- package/admin/custom/{assets/index-2HOz3j7B.js → markets/assets/index-12xv0FYP.js} +5 -5
- package/admin/custom/markets/assets/markets-editor-components-YlC_VFAa.js +67 -0
- package/admin/custom/markets/assets/pendingShares-mvCLhLzv.js +2 -0
- package/admin/custom/markets/marketsEditor.js +2 -2
- package/admin/custom/markets/mf-manifest.json +1 -1
- package/admin/custom/markets/mf-stats.json +1 -1
- package/admin/custom/mf-manifest.json +1 -1
- package/admin/custom/mf-stats.json +1 -1
- package/admin/custom/productGroups/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteProductGroupsSet__mf_owner__1-CuVRE3L9.js +1 -0
- package/admin/custom/productGroups/assets/helpers-CsVkgmeS.js +1 -0
- package/admin/custom/productGroups/assets/hostInit-BO6YEhS7.js +1 -0
- package/admin/custom/productGroups/assets/index-0cn00gCp.js +1 -0
- package/admin/custom/{review/assets/index-2HOz3j7B.js → productGroups/assets/index-12xv0FYP.js} +5 -5
- package/admin/custom/productGroups/assets/{pendingShares-Cmc6I2xN.js → pendingShares-CnxCGNGe.js} +2 -2
- package/admin/custom/productGroups/assets/product-groups-editor-components-D1GW1Ii0.js +44 -0
- package/admin/custom/productGroups/mf-manifest.json +1 -1
- package/admin/custom/productGroups/mf-stats.json +1 -1
- package/admin/custom/productGroups/productGroupsEditor.js +2 -2
- package/admin/custom/review/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteReviewSet__mf_owner__1-FjU0cujc.js +1 -0
- package/admin/custom/review/assets/helpers-CsVkgmeS.js +1 -0
- package/admin/custom/review/assets/hostInit-B25pGNwS.js +1 -0
- package/admin/custom/review/assets/index-0cn00gCp.js +1 -0
- package/admin/custom/review/assets/index-12xv0FYP.js +7 -0
- package/admin/custom/{markets/assets/pendingShares-DaxGcdrd.js → review/assets/pendingShares-DIMEss5x.js} +2 -2
- package/admin/custom/review/assets/{review-editor-components-BrjR0Z85.js → review-editor-components-BD-k-o3i.js} +2 -2
- package/admin/custom/review/mf-manifest.json +1 -1
- package/admin/custom/review/mf-stats.json +1 -1
- package/admin/custom/review/reviewEditor.js +2 -2
- package/admin/custom/routeEditor.js +2 -2
- package/admin/custom/shoppingList/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteShoppingListSet__mf_owner__1-a7n9bT1O.js +1 -0
- package/admin/custom/shoppingList/assets/helpers-CsVkgmeS.js +1 -0
- package/admin/custom/shoppingList/assets/hostInit-D9RbSpMP.js +1 -0
- package/admin/custom/shoppingList/assets/index-0cn00gCp.js +1 -0
- package/admin/custom/shoppingList/assets/index-12xv0FYP.js +7 -0
- package/admin/custom/shoppingList/assets/{pendingShares-DUnOFOkU.js → pendingShares-CrfC535i.js} +2 -2
- package/admin/custom/shoppingList/assets/shopping-list-editor-components-qCtkT06l.js +73 -0
- package/admin/custom/shoppingList/mf-manifest.json +1 -1
- package/admin/custom/shoppingList/mf-stats.json +1 -1
- package/admin/custom/shoppingList/shoppingListEditor.js +2 -2
- package/admin/jsonConfig.json +16 -17
- package/admin/jsonTab.json +18 -0
- package/build/lib/alexa-direct.js +21 -0
- package/build/lib/config-protection.js +50 -0
- package/build/main.js +277 -24
- package/io-package.json +80 -28
- package/package.json +2 -2
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteAdminSet__mf_owner__1-CifzZTJE.js +0 -1
- package/admin/custom/assets/hostInit-BFP_9qwB.js +0 -1
- package/admin/custom/assets/route-editor-components-rW7iuBNT.js +0 -21
- package/admin/custom/assets/virtualExposes-D8D1innc.js +0 -1
- package/admin/custom/markets/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteMarketsSet__mf_owner__1-CdXcBfjG.js +0 -1
- package/admin/custom/markets/assets/hostInit-CrDCY7SQ.js +0 -1
- package/admin/custom/markets/assets/markets-editor-components-CUcyPBPl.js +0 -67
- package/admin/custom/markets/assets/virtualExposes-BhGZWOBB.js +0 -1
- package/admin/custom/productGroups/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteProductGroupsSet__mf_owner__1-DXUHDGDp.js +0 -1
- package/admin/custom/productGroups/assets/hostInit-D8t8XJ7f.js +0 -1
- package/admin/custom/productGroups/assets/product-groups-editor-components-CLVNuU40.js +0 -44
- package/admin/custom/productGroups/assets/virtualExposes-Cci9-KkN.js +0 -1
- package/admin/custom/review/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteReviewSet__mf_owner__1-CSWI0Knk.js +0 -1
- package/admin/custom/review/assets/hostInit-Bi90nPL8.js +0 -1
- package/admin/custom/review/assets/virtualExposes-C4BXYjQJ.js +0 -1
- package/admin/custom/shoppingList/assets/_virtual_mf-localSharedImportMap___mfe_internal__ShoppingRouteShoppingListSet__mf_owner__1-DRCeDtVc.js +0 -1
- package/admin/custom/shoppingList/assets/hostInit-usOXh1g1.js +0 -1
- package/admin/custom/shoppingList/assets/index-2HOz3j7B.js +0 -7
- package/admin/custom/shoppingList/assets/shopping-list-editor-components-DdXx3Xxu.js +0 -27
- 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
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="admin/shoppingroute.png" alt="ShoppingRoute" width="160">
|
|
5
|
+
</p>
|
|
4
6
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20
|
+
> **Current version: 0.5.1**
|
|
21
|
+
> ShoppingRoute is available in the ioBroker **latest** repository.
|
|
10
22
|
|
|
11
|
-
|
|
12
|
-
🇩🇪 [**Deutsche Bedienungsanleitung**](BEDIENUNGSANLEITUNG_DE.md)
|
|
23
|
+
## What ShoppingRoute does
|
|
13
24
|
|
|
14
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
100
|
+
- automatic, review and off learning modes
|
|
27
101
|
- category and alias suggestions
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
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
|
|
123
|
+
- configuration backup and restore
|
|
34
124
|
- shareable market-route profiles
|
|
35
|
-
- privacy-safe diagnostic
|
|
125
|
+
- privacy-safe diagnostic and feedback report
|
|
36
126
|
- Alexa2/alexa-remote2 direct-session diagnostics
|
|
37
127
|
- Dry Run safety mode
|
|
38
128
|
|
|
39
|
-
|
|
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
|

|
|
4
4
|
|
|
5
|
-
**Aktuelle Version: 0.
|
|
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
|
|
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};
|