@propeller-commerce/propeller-v2-react-ui 0.6.1 → 0.7.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/CHANGELOG.md CHANGED
@@ -8,6 +8,53 @@ once it reaches 1.0. Until then (the `0.x` line) the public API may change
8
8
  between minor versions; breaking changes are called out below and in
9
9
  [MIGRATION.md](./MIGRATION.md).
10
10
 
11
+ ## [0.7.1] - 2026-07-28
12
+
13
+ ### Fixed
14
+
15
+ - **`cartUpdateAddress` rejected a blank email** — optional address fields were
16
+ sent as empty strings when left blank, and the API validates optional fields
17
+ whenever they are present, so a blank email failed with
18
+ `email must be an email` (400). This blocked the address step for a delivery
19
+ address, where the email legitimately lives on the contact / customer record
20
+ rather than the address. Optional fields are now omitted when blank, matching
21
+ how `useAddress` already built its payloads. Affects every optional field
22
+ (`email`, `phone`, `mobile`, `company`, `notes`, …), not just email.
23
+ - **`<AddressCard>` required an email on every address** — the edit and create
24
+ forms hardcoded `required` plus a `*` on the email input, contradicting the
25
+ field being optional on the address itself. Email is now optional in both
26
+ forms.
27
+ - **`<AddressCard>` accepted undeliverable emails** — `type="email"` alone
28
+ permits dotless domains such as `aa@gg` (valid per the HTML5 spec for
29
+ intranet hosts, but rejected by the API). Both email inputs now carry a
30
+ pattern requiring a dotted top-level domain, so invalid input is caught in
31
+ the form instead of surfacing as a failed mutation. Subdomains
32
+ (`user@sub.co.uk`) and tagged addresses (`user+tag@example.com`) remain
33
+ valid.
34
+
35
+ ## [0.7.0] - 2026-07-27
36
+
37
+ ### Added
38
+
39
+ - **`<QuickOrder>` component + `useQuickOrder` composable** — a bulk "quick
40
+ order" pad for B2B replenishment. Each row has a debounced SKU/code typeahead
41
+ (`ProductSearch`); selecting a match fills the row's name, net price and
42
+ minimum quantity. Quantities are editable, rows can be added/removed, and
43
+ duplicate SKUs are rejected. "Add to cart" resolves the user's cart (shared
44
+ `initCart` flow) and adds every resolved row in a single `CartItemBulk`
45
+ mutation (`CartService.bulkUpdateCartItems`). Ports the WordPress plugin's
46
+ quick-order/replenish flow.
47
+ - Optional XLSX upload: pass a `parseSpreadsheet(file)` handler (the app owns
48
+ the parser — the package ships no spreadsheet dependency) plus a
49
+ `templateUrl`; parsed code+quantity lines are resolved against the API and
50
+ unresolved codes reported via `onMissingCodes`.
51
+ - Fully label-driven (`labels` prop) and `configuration`-aware (image filters
52
+ so typeahead results carry thumbnails, same as `SearchBar`). Infra props
53
+ (`graphqlClient`/`user`/`companyId`/`language`) resolve from
54
+ `<PropellerProvider>` via `useInfraProps`.
55
+ - A typed code is only ever a *search term* — a row's product identity and
56
+ price always come from the API, never from the typed/uploaded value.
57
+
11
58
  ## [0.6.1] - 2026-07-23
12
59
 
13
60
  ### Fixed