Skip to content

Release v0.4.26 - #151

Merged
roncodes merged 30 commits into
mainfrom
release/v0.4.26
Oct 16, 2026
Merged

roncodes merged 30 commits into
mainfrom
release/v0.4.26

Conversation

@roncodes

@roncodes roncodes commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

Release branch for v0.4.26, cut from main after v0.4.25. Versions are bumped in composer.json, extension.json and package.json, and RELEASE.md has the notes.

This branch collects:

Before merging

Merging this tags v0.4.26. The version comes from the branch name and is checked against the version files and the first line of RELEASE.md.

The context switcher lists the stores and networks the application route
loaded once at boot. A network created from the switcher opened its overview
without reloading that list, so it only showed after a page reload. The first
store had the same problem: the engine loaded with no stores and nothing
reloaded after it was saved.

The storefront service now remembers the stores and networks it creates, and
the switcher lists them alongside the loaded ones, leaving deleted records out.
Saving the first store also refreshes the engine, so the dashboard, order
alerts and counts load for it.
…rder panel scrolls

The network's orders opened an order in the resource context panel, which has
no URL, so the open order could not be reloaded or shared. They now open it at
networks/:network/orders/:order with the store's order route and template, over
the network's list.

The in-place panel (dashboard, customer panel, network overview, checkout
siblings, redemptions) never scrolled: ember-ui's tab wrapper is a flex item,
but the overlay body's inner wrapper around it was not a flex column, so the
tab content had no height to scroll within. The panel now uses Storefront's
overlay body layout with the inner wrapper as a column.
Checkout stamps meta.food_truck_id on a truck order, but the order list and
detail resources dropped it, so the console could not tell a truck order from
a store order. Both resources now send food_truck_id and food_truck ({ id,
name }), the truck named by its vehicle as the console names trucks. A page of
orders looks its company's trucks up once.

The fulfillment cell (store and network orders) shows a truck badge with the
truck's name, a checkout from one truck carries it on its group row, and the
order panel header shows it next to the store.
…, not on a fixed day

The store's message is stamped with the real clock and the reply was fixed at
2026-10-14 11:00, so from 15 Oct the reply sorted first and the test failed.
…d store settings

The save bar re-renders when the form's input and change events bump a
revision, or when an action does. Toggles fire neither (ember-ui's Toggle is a
span with a click handler), and the network settings set every toggle with
(mut @model...) directly, so switching a network online, or any of its rules,
left Save disabled. Ember Data's changedAttributes() is not tracked, so the
store's Online toggle and the currency, order config, phone and POD selects
of both pages had the same gap.

Both pages now set those values through setAttribute and setOption, which
bump the revision the save bar reads.
Whether a truck is available came from its Fleet-Ops vehicle's online flag,
set by the driver's Navigator app or a telematics device. A store that added
its trucks to a network found them all offline with no way to switch them on
in Storefront. A truck's status (active or inactive) now decides it alone:

- The API's truck online, and a catalog's truck subjects, report
  status === 'active', whatever the vehicle reports.
- The console's truck card, panel, trucks page tabs (all, active, inactive)
  and identity indicator follow the status; the vehicle online badge and
  'last online' are gone.
- The dashboard's attention count is trucks_inactive (was trucks_offline:
  active trucks whose vehicle was offline).
…and-networks

fix(switcher): show newly created stores and networks without a page reload
fix(orders): network orders open at their own URL, and the in-place order panel scrolls
feat(orders): show the food truck an order was placed at
fix(settings): toggles, selects and pickers enable Save on network and store settings
fix(trucks): a truck takes orders by its Storefront status alone
@codecov

codecov Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (90c89ab) to head (c49c286).

Additional details and impacted files
@@             Coverage Diff             @@
##                main      #151   +/-   ##
===========================================
  Coverage     100.00%   100.00%           
- Complexity      3853      3927   +74     
===========================================
  Files            222       224    +2     
  Lines          14005     13989   -16     
===========================================
- Hits           14005     13989   -16     
Flag Coverage Δ
backend 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

roncodes and others added 16 commits October 15, 2026 19:17
…els after a refresh

The network settings page lists network.gateways and network.notification_channels,
but only the networks list requested them, and entering a network skips that list
(3160a75). After a refresh the page showed none of the saved ones. The settings
route now loads the gateways and channels the network owns, gated by the list
permissions.
…els (server)

Product categories and catalog (menu) categories nest: Drinks › Coffee ›
Cold brew. A parent is in the same store or catalog and of the same kind, and
a tree is at most three levels deep; CategoryTreeObserver refuses anything
else with a 422 and moves a removed category's subcategories up a level.

- Public categories carry parent (public id) and depth; with_subcategories
  lists the categories under each one; with_products&rollup=1 brings every
  product under a category.
- Products filtered by a category (public category=, console category and
  category_slug) include its subcategories' products; category_direct=1 keeps
  an exact match. Public products carry their category's public id.
- A catalog saves its categories as a tree (parent_uuid, or parent_key for a
  category created in the same save), validated whole and attached top-down;
  the public catalog payload gives each category's parent.
…n a modal

The catalog editor's pencil button only renamed a category inline, so a menu
category could not get an icon. It now opens the product category modal on the
catalog category (name, description, icon upload). Changes stay on the page
until the catalog is saved, like every other editor change; cancel restores
them. A set icon shows in the category row, and Duplicate copies each
category's description and icon.

Catalog::setCategories() now writes description, icon, icon_color and
icon_file_uuid when the payload carries them (left alone when it does not),
and the catalog category resource returns icon and icon_color, plus
icon_file_uuid on internal requests, so the editor's save round trip keeps them.
- Product categories: the category form has a parent picker (the store's
  tree, minus the category itself, its subcategories and anything past three
  levels); the sidebar's rows offer New subcategory up to the second level;
  the category page's header shows its path and rolled-up product count; the
  product form names each category option by its path.
- Bulk move to category now shows the store's categories in tree order (the
  modal ignored the categories it was given and showed the network picker).
- Catalog editor: categories show as a tree with indent, outdent, add
  subcategory and move within siblings; removing one moves its subcategories
  up; new categories carry a key so a subcategory can sit under one before it
  is saved; a duplicated catalog keeps its tree.
- A refused parent (the server's 422) is shown and the form stays open.
The console builds the category tree and the parent picker from parent_uuid,
which core's internal Category resource sends from 1.6.71 (core-api#316).
Without it a nested category would read as top-level and be saved as one.
The catalog editor's category edit modal (#155) replaces the inline rename;
a new subcategory now opens in it to be named, and duplicating a catalog keeps
both the tree and each category's description and icon.
…ory's icon

Uploading an icon in the new and edit product category modals set the
category's `icon` string attribute to the uploaded File record as well as
`icon_file_uuid` and `icon_url`. The string transform turned the record into
"<model::file:{uuid}>", which the save sent and core-api stored in
`categories.icon`, in place of any icon name the category had. The upload now
sets only `icon_file_uuid` and `icon_url`, as the catalog category modal does.
…persist

fix(networks): saved gateways and notification channels disappear from network settings after a refresh
fix(catalogs): edit a catalog category's name, description and icon in a modal
feat(categories): nest product and catalog categories up to three levels
fix(products): stop saving the uploaded icon file record into a category's icon
…atus as soon as QPay confirms the payment

The published Storefront app (1.2.x) asks GET checkouts/status once when the customer
returns from the bank app, without verify, and completes only on an order. Since status
stopped asking QPay without verify=1 and created the order only 15 seconds after the
payment was recorded, those customers were left waiting. A request without verify now
verifies with QPay (still at most once every 5 seconds per checkout) and creates the order
straight away, as before. Apps that send verify are unchanged.

(cherry picked from commit bdbed81)
fix(qpay): QPay orders complete in the published app again
…hosen status

Every keystroke rebuilt the promotion builder's open step, so a field lost
focus after one character: each step's summary reads the form, the steps
getter returned new objects, and the unkeyed {{#each}} matched them by
identity. The steps are now keyed by id.

Creating a promotion failed with "The selected status is invalid": the
Save button called save() with its click event, which became the status.
save() takes a status only when given a string ("draft").
@roncodes
roncodes merged commit 68d06a9 into main Oct 16, 2026
11 checks passed
@roncodes
roncodes deleted the release/v0.4.26 branch October 16, 2026 08:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant