From b928ed7fa2181551ebf936e146b3549fadfc1f87 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Thu, 6 Feb 2025 14:03:30 +0000 Subject: [PATCH 01/10] Umbraco Commerce v15.1.0-rc release notes --- 15/umbraco-commerce/SUMMARY.md | 2 + .../how-to-guides/configuring-cart-cleanup.md | 44 ++++++++++ .../ui-extensions/order-line-actions.md | 82 ++++++++++++++++++ .../v14/cart-conversion-rates-warning.png | Bin 0 -> 44610 bytes .../media/v14/order-line-action.png | Bin 0 -> 20005 bytes 15/umbraco-commerce/release-notes/README.md | 7 ++ .../release-notes/v15.1.0-rc.md | 43 +++++++++ 7 files changed, 178 insertions(+) create mode 100644 15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md create mode 100644 15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md create mode 100644 15/umbraco-commerce/media/v14/cart-conversion-rates-warning.png create mode 100644 15/umbraco-commerce/media/v14/order-line-action.png create mode 100644 15/umbraco-commerce/release-notes/v15.1.0-rc.md diff --git a/15/umbraco-commerce/SUMMARY.md b/15/umbraco-commerce/SUMMARY.md index 5cd068f5f48..8334c1f9d66 100644 --- a/15/umbraco-commerce/SUMMARY.md +++ b/15/umbraco-commerce/SUMMARY.md @@ -36,6 +36,7 @@ * [Update Cart](how-to-guides/update-cart.md) * [Delete item from Cart](how-to-guides/delete-item.md) * [Customizing Templates](how-to-guides/customizing-templates.md) +* [Configuring Store Cleanup](how-to-guides/configuring-cart-cleanup.md) ## Key Concepts @@ -71,6 +72,7 @@ * [UI Extensions](key-concepts/ui-extensions/README.md) * [Analytics Widgets](key-concepts/ui-extensions/analytics-widgets.md) * [Entity Quick Actions](key-concepts/ui-extensions/entity-quick-actions.md) + * [Order Line Actions](key-concepts/ui-extensions/order-line-actions.md) * [Order Properties](key-concepts/ui-extensions/order-properties.md) * [Order Collection Properties](key-concepts/ui-extensions/order-collection-properties.md) * [Order Line Properties](key-concepts/ui-extensions/order-line-properties.md) diff --git a/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md b/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md new file mode 100644 index 00000000000..6a320e0192a --- /dev/null +++ b/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md @@ -0,0 +1,44 @@ +--- +description: Learn how to configure a cart cleanup routine. +--- + +# Configuring Cart Cleanup + +{% hint style="info" %} +Available from Umbraco Commerce 15.1.0 +{% endhint %} + +By default Umbraco Commerce will keep all created carts indefinately. Over time this can obviously become an issue. To assist with this is it possible to configure a cart cleanup routine to delete carts older than a pre-configured time interval. + +This service can be enabled and configured in the `appSettings.json` + +```json +{ + "Umbraco" : { + "Commerce": { + "CartCleanupPolicy": { + "EnableCleanup": true, + "KeepCartsForDays": 800, + // Below settings are optional + "FirstRunTime": string; the time to first run the scheduled cleanup task, in crontab format + "Period": string; how often to run the task, in timespan format + // Configure diffrent policies per store + "PerStorePolicies": { + "StoreAlias": { + "KeepCartsForDays": 800, + } + } + } + } + } +} +``` + +## Cart Conversion Rates Widget + +When enabling the cart cleanup service, it's important to know that this can affect the cart conversion rates widget in the analytics section. If the widget is configured to show a time period that exceeds the cleanup policies time frame then a warning will be displayed. + +![Cart Conversion Rate date range exceeds the cart cleanup policy configuration warning](../media/v14/cart-conversion-rates-warning.png) + + + diff --git a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md new file mode 100644 index 00000000000..84c46129c0b --- /dev/null +++ b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md @@ -0,0 +1,82 @@ +--- +description: Order Line Actions UI Extension for Umbraco Commerce +--- + +# Order Line Actions + +{% hint style="info" %} +Available from Umbraco Commerce 15.1.0 +{% endhint %} + +Order Line Actions allow you to display buttons against each order line of a cart / order allowing you to perform custom actions per order line. + +![Custom Order Line Action](../../media/v14/order-line-action.png) + +## Registering an Order Line Action + +```typescript +import { UcManifestOrderLineAction } from "@umbraco-commerce/backoffice"; + +export const manifests : UcManifestOrderLineAction[] = [ + { + type: 'ucOrderLineAction', + kind: 'default', + alias: 'My.OrderLineAction.MyOrderLineAction', + name: 'My Order Line Action', + weight: 300, + forEntityTypes: [ 'uc:cart', 'uc:order' ], + api: () => import('./my-order-line-action.api.js'), + meta: { + label: "#orderLineActions_myOrderLineAction", + icon: 'icon-star' + } + } +]; + +extensionRegistry.register(manifests); +``` + +Each entry must have a type of `ucOrderLineAction` along with a unique `alias` and `name`. Unless you wish to override the button, the `kind` key should be set to `default`. An `api` key should be defined that imports the implementation of the `UcOrderLineActionApi` interface. + +A `meta` entry provides configuration options for order line actions: + +| Name | Description | +| -- | -- | +| `label` | A label for this action (supports the `#` prefix localization string syntax) | +| `icon` | In icon to display for the action | + +## The Order Line Action API + +In order to define the logic to perform when an order line action button is clicked, you'll need to implement the `UcOrderLineActionApi` interface. This interface is defined as + +```typescript +export interface UcOrderLineActionApi extends UmbApi { + manifest: UcManifestOrderLineAction; + storeId: string; + orderId: string; + orderLineId: string; + execute(): Promise; +} +``` + +This provides order line action implementations with access to the defined `manifest` and contextual information via the `storeId`, `orderId` and `orderLineId` properties and expects the implementation of an `execute` method to act. + +An example implementation would be + +```typescript +// my-order-line-action.api.js + +import { UcOrderLineActionApi, UcManifestOrderLineAction } from "@umbraco-commerce/backoffice"; +import { UmbControllerBase } from "@umbraco-cms/backoffice/class-api"; + +export default class MyOrderLineActionApi extends UmbControllerBase implements UcOrderLineActionApi { + manifest!: UcManifestOrderLineAction; + storeId!: string; + orderId!: string; + orderLineId!: string; + async execute() { + console.log(`You clicked ${this.manifest!.meta.label} for order line ${this.orderLineId}`); + return Promise.resolve(); + } +} +``` \ No newline at end of file diff --git a/15/umbraco-commerce/media/v14/cart-conversion-rates-warning.png b/15/umbraco-commerce/media/v14/cart-conversion-rates-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..233432e5c57c466ef1a536e35c5b17ff589abbd2 GIT binary patch literal 44610 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 literal 0 HcmV?d00001 diff --git a/15/umbraco-commerce/media/v14/order-line-action.png b/15/umbraco-commerce/media/v14/order-line-action.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d00e843d4efe99112c64ebbbd5cfe0a858630c GIT binary patch literal 20005 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 D8zzx| literal 0 HcmV?d00001 diff --git a/15/umbraco-commerce/release-notes/README.md b/15/umbraco-commerce/release-notes/README.md index 2a334364287..bfbf50c276e 100644 --- a/15/umbraco-commerce/release-notes/README.md +++ b/15/umbraco-commerce/release-notes/README.md @@ -17,6 +17,13 @@ If you are upgrading to a new major version, check the breaking changes in the [ This section contains the release notes for Umbraco Commerce 14 including all changes for this version. +#### 15.1.0-rc1 (TBD) + +Read the [v15.1.0-rc release post](./v15.1.0-rc.md) for further background on this release. + +* Added cart cleanup service +* Added order line actions UI extension point + #### 15.0.1 (5th Feb 2025) * Fixed `TranslatedValue` erroring if the language key was `null`, instead of falling back to the default value. diff --git a/15/umbraco-commerce/release-notes/v15.1.0-rc.md b/15/umbraco-commerce/release-notes/v15.1.0-rc.md new file mode 100644 index 00000000000..b37195aaaaa --- /dev/null +++ b/15/umbraco-commerce/release-notes/v15.1.0-rc.md @@ -0,0 +1,43 @@ +--- +description: Umbraco Commerce v15.1.0-RC release notes. +--- + +# v15.1.0-RC + +## Key Takeaways + +* [Cart Cleanup Service](v15.1.0-rc.md#cart-cleanup-service). +* [Order Line Actions](v15.1.0-rc.md#order-line-actions) + +## Cart Cleanup Service + +The cart cleanup service is a new background service that periodically cleans up old abandoned carts. This service is off by default, but can be enabled via app settings. + +```json +{ + "Umbraco" : { + "Commerce": { + "CartCleanupPolicy": { + "EnableCleanup": true, + "KeepCartsForDays": 800 + } + } + } +} +``` + +See the [Configuring Cart Cleanup guide](../how-to-guides/configuring-cart-cleanup.md) for more details. + +## Order Line Actions + +Order line actions are a new UI extension point that lets you register custom buttons to display against each order line of a cart / order. + +![Custom Order Line Action](../media/v14/order-line-action.png) + +See the [Order Line Actions docs](../key-concepts/ui-extensions/order-line-actions.md) for more details. + +## What to Test and How to Give Feedback + +We welcome any feedback on installation or upgrade issues, as well as any bugs found in the sections mentioned above. + +Issues can be raised on the Umbraco Commerce issue tracker at [https://github.com/umbraco/Umbraco.Commerce.Issues/issues](https://github.com/umbraco/Umbraco.Commerce.Issues/issues). From 35880f977086ee4054a24ce96e8093004109ad20 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Fri, 7 Feb 2025 13:59:31 +0000 Subject: [PATCH 02/10] Update 15.1.0-rc1 release date --- 15/umbraco-commerce/release-notes/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15/umbraco-commerce/release-notes/README.md b/15/umbraco-commerce/release-notes/README.md index bfbf50c276e..8f8afa06f59 100644 --- a/15/umbraco-commerce/release-notes/README.md +++ b/15/umbraco-commerce/release-notes/README.md @@ -17,7 +17,7 @@ If you are upgrading to a new major version, check the breaking changes in the [ This section contains the release notes for Umbraco Commerce 14 including all changes for this version. -#### 15.1.0-rc1 (TBD) +#### 15.1.0-rc1 (7th Feb 2025) Read the [v15.1.0-rc release post](./v15.1.0-rc.md) for further background on this release. From 96a8d1e773b38a74558b8d6ebfda5f21ff13cdde Mon Sep 17 00:00:00 2001 From: sofietoft Date: Mon, 10 Feb 2025 09:33:17 +0100 Subject: [PATCH 03/10] Update SUMMARY.md --- 15/umbraco-commerce/SUMMARY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/15/umbraco-commerce/SUMMARY.md b/15/umbraco-commerce/SUMMARY.md index 8334c1f9d66..97e8d1ba8c0 100644 --- a/15/umbraco-commerce/SUMMARY.md +++ b/15/umbraco-commerce/SUMMARY.md @@ -2,6 +2,7 @@ * [Umbraco Commerce Documentation](README.md) * [Release Notes](release-notes/README.md) + * [v15.1.0-Rc](release-notes/v15.1.0-rc.md) * [v15.0.0-Rc](release-notes/v15.0.0-rc.md) ## Commerce Products From fecd43c1cc8064ea876820764e1a3cd204d49048 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:49:01 +0000 Subject: [PATCH 04/10] Update 15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md Co-authored-by: sofietoft --- 15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md b/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md index 6a320e0192a..a56bac0b143 100644 --- a/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md +++ b/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md @@ -8,7 +8,8 @@ description: Learn how to configure a cart cleanup routine. Available from Umbraco Commerce 15.1.0 {% endhint %} -By default Umbraco Commerce will keep all created carts indefinately. Over time this can obviously become an issue. To assist with this is it possible to configure a cart cleanup routine to delete carts older than a pre-configured time interval. +By default Umbraco Commerce will keep all created carts indefinately. Over time this can become an issue. To assist with this is it possible to configure a cart cleanup routine to delete carts older than a pre-configured time interval. + This service can be enabled and configured in the `appSettings.json` From c1e8b518c8132d92e416a0ff03bc43b33b8768d0 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:49:22 +0000 Subject: [PATCH 05/10] Update 15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md Co-authored-by: sofietoft --- .../key-concepts/ui-extensions/order-line-actions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md index 84c46129c0b..11ff0ba9517 100644 --- a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md +++ b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md @@ -8,7 +8,8 @@ description: Order Line Actions UI Extension for Umbraco Commerce Available from Umbraco Commerce 15.1.0 {% endhint %} -Order Line Actions allow you to display buttons against each order line of a cart / order allowing you to perform custom actions per order line. +Order Line Actions allow you to display buttons against each order line of a cart/order enabling you to perform custom actions per order line. + ![Custom Order Line Action](../../media/v14/order-line-action.png) From 11121cb529ec099a635308359d43865de410c9db Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:49:39 +0000 Subject: [PATCH 06/10] Update 15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md Co-authored-by: sofietoft --- .../key-concepts/ui-extensions/order-line-actions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md index 11ff0ba9517..c0ce3ad836d 100644 --- a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md +++ b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md @@ -60,7 +60,8 @@ export interface UcOrderLineActionApi extends UmbApi { } ``` -This provides order line action implementations with access to the defined `manifest` and contextual information via the `storeId`, `orderId` and `orderLineId` properties and expects the implementation of an `execute` method to act. +This provides order line action implementations with access to the defined `manifest` and contextual information via the `storeId`, `orderId` and `orderLineId` properties. It expects the implementation of an `execute` method to act. + An example implementation would be From be6425a054f6c93e5a6f88d411408806274271c7 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:49:51 +0000 Subject: [PATCH 07/10] Update 15/umbraco-commerce/release-notes/v15.1.0-rc.md Co-authored-by: sofietoft --- 15/umbraco-commerce/release-notes/v15.1.0-rc.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-commerce/release-notes/v15.1.0-rc.md b/15/umbraco-commerce/release-notes/v15.1.0-rc.md index b37195aaaaa..321c127bda1 100644 --- a/15/umbraco-commerce/release-notes/v15.1.0-rc.md +++ b/15/umbraco-commerce/release-notes/v15.1.0-rc.md @@ -30,7 +30,8 @@ See the [Configuring Cart Cleanup guide](../how-to-guides/configuring-cart-clean ## Order Line Actions -Order line actions are a new UI extension point that lets you register custom buttons to display against each order line of a cart / order. +Order line actions are a new UI extension point that lets you register custom buttons to display against each order line of a cart/order. + ![Custom Order Line Action](../media/v14/order-line-action.png) From 9070e35dda3c11ec4dbc82831ba1c72b93104d58 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:50:00 +0000 Subject: [PATCH 08/10] Update 15/umbraco-commerce/release-notes/v15.1.0-rc.md Co-authored-by: sofietoft --- 15/umbraco-commerce/release-notes/v15.1.0-rc.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-commerce/release-notes/v15.1.0-rc.md b/15/umbraco-commerce/release-notes/v15.1.0-rc.md index 321c127bda1..ca36cdc7333 100644 --- a/15/umbraco-commerce/release-notes/v15.1.0-rc.md +++ b/15/umbraco-commerce/release-notes/v15.1.0-rc.md @@ -35,7 +35,8 @@ Order line actions are a new UI extension point that lets you register custom bu ![Custom Order Line Action](../media/v14/order-line-action.png) -See the [Order Line Actions docs](../key-concepts/ui-extensions/order-line-actions.md) for more details. +See the [Order Line Actions article](../key-concepts/ui-extensions/order-line-actions.md) for more details. + ## What to Test and How to Give Feedback From 90235cbdb77359f1a071ad338721532ebcb7af1e Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:50:30 +0000 Subject: [PATCH 09/10] Update 15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md Co-authored-by: sofietoft --- .../key-concepts/ui-extensions/order-line-actions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md index c0ce3ad836d..6bfbce1f221 100644 --- a/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md +++ b/15/umbraco-commerce/key-concepts/ui-extensions/order-line-actions.md @@ -37,7 +37,8 @@ export const manifests : UcManifestOrderLineAction[] = [ extensionRegistry.register(manifests); ``` -Each entry must have a type of `ucOrderLineAction` along with a unique `alias` and `name`. Unless you wish to override the button, the `kind` key should be set to `default`. An `api` key should be defined that imports the implementation of the `UcOrderLineActionApi` interface. +Each entry must have a type of `ucOrderLineAction` along with a unique `alias` and `name`. Unless you wish to override the button, the `kind` key should be set to `default`. An `api` key that imports the implementation of the `UcOrderLineActionApi` interface, should be defined. + A `meta` entry provides configuration options for order line actions: From 1a1a4a2c1929af0488442b225a24dafd9df1c100 Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Mon, 10 Feb 2025 10:56:58 +0000 Subject: [PATCH 10/10] Move config key explinations to a table --- .../how-to-guides/configuring-cart-cleanup.md | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md b/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md index a56bac0b143..e8f7e2f0194 100644 --- a/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md +++ b/15/umbraco-commerce/how-to-guides/configuring-cart-cleanup.md @@ -20,12 +20,11 @@ This service can be enabled and configured in the `appSettings.json` "CartCleanupPolicy": { "EnableCleanup": true, "KeepCartsForDays": 800, - // Below settings are optional - "FirstRunTime": string; the time to first run the scheduled cleanup task, in crontab format - "Period": string; how often to run the task, in timespan format - // Configure diffrent policies per store + // Optional settings + "FirstRunTime": "* 4 * * *", + "Period": "1.00:00:00", "PerStorePolicies": { - "StoreAlias": { + "{STORE_ALIAS}": { "KeepCartsForDays": 800, } } @@ -35,6 +34,17 @@ This service can be enabled and configured in the `appSettings.json` } ``` +The configuration supports the followin keys. + +| Key | Description | +| -- | -- | +| `EnableCleanup` | Enables or disabled the cart cleanup service. `false` by default. | +| `KeepCartsForDays` | The number of days to keep carts after the carts last modification date. | +| `FirstRunTime` | The time to first run the scheduled cleanup task, in crontab format. If empty, runs imediately on app startup. | +| `Period` | How often to run the task, in timespan format. Defaults to every 24 hours. | +| `PerStorePolicies` | Define store specific policies. | +| `PerStorePolicies.{STORE_ALAIS}.KeepCartsForDays` | The number of days to keep carts after the carts last modification date for the given store. | + ## Cart Conversion Rates Widget When enabling the cart cleanup service, it's important to know that this can affect the cart conversion rates widget in the analytics section. If the widget is configured to show a time period that exceeds the cleanup policies time frame then a warning will be displayed.