Manager overview
Open Extras → msBundles from the menu or via manager/?a=index&namespace=msbundles. The UI runs on Vue 3 and PrimeVue through VueTools.

Step-by-step flows: Flows.
List screen
Top to bottom:
- Section title.
- Toolbar: name search, activity filter, counter, Add bundle.
- Table: DnD order, name with thumb, status, product count, actions.

| Action | How |
|---|---|
| Open editor | Click the name |
| Duplicate | Copy icon → inactive copy, editor opens |
| Delete | Trash icon → confirm |
| Reorder | Drag the left handle |
Filters: name search (debounced), activity (all / active / inactive). Empty list and “nothing found” show an empty state with a create CTA.
Create and edit
- Add bundle or click a name.
- Fill Name (required), description, image via the MODX media browser.
- Active toggle: with
activeOnly=1only active bundles appear on the storefront. - Add products by search (name, SKU, or ID). One product once per bundle.
- Per line: quantity, price mode, Required flag.
- Reorder products with DnD in the composition table.
- Save. Without products, Save stays disabled.

The bundle shows on pages for every product in the set.
Price mode examples in the editor
Desk set — several modes on one bundle:

Kitchen — fixed and optional lines:

Travel — percent / amount discount and optional:

Price mode select on a line:

Right column
| Block | Shows |
|---|---|
| Summary | Line and unit counts |
| As on storefront | Price, savings, stock for 1 bundle. “Preview only” badge |

Total and savings also appear in the dialog footer. A shortfall on required lines shows a warning above the form. Saving with stock issues asks for confirmation.
Line price modes
| Mode | Value field | Result |
|---|---|---|
| Original | ignored | Product price from miniShop3 |
| Fixed | amount | Fixed unit price |
| Discount % | 0–100 | Percent off product price |
| Discount amount | amount | Subtracted from product price |
| Free | ignored | 0 per unit |
Bundle total = sum of lines × bundle count. Savings = difference vs original prices. Zero price on the storefront shows as “Free”.
Required and optional products
- Required — without it the bundle is unavailable. Stock shortfalls follow
msbundles_stock_behavior. - Optional — skipped on add when short. API response includes
warnings.
Permissions
| Operation | Permission |
|---|---|
| Open section, list, view | msbundles_view |
| Create, edit, delete, reorder, duplicate | msbundles_save |
Cart behavior
The msBundles plugin listens to miniShop3:
msOnBeforeChangeInCart— changing one line qty syncs others with the samebundle_hashmsOnBeforeRemoveFromCart— removing one line removes the whole bundlemsOnGetCart— lead/member metadata for cart rows
Line quantity must be a multiple of the base quantity from bundle options.
On the storefront, load msBundles.initialize and call tplMsBundlesCartInfo in the cart chunk. Lead shows the badge and “Remove bundle”. Member qty is locked. After add/remove, msCart needs selector. Details: Frontend.
