Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
855ab21
Update general settings to use new forms
nfourtythree Aug 25, 2026
a68867a
Create extendable settings controller and tidy up general and transfe…
nfourtythree Aug 25, 2026
6379de1
ensure settings controllers extend the base one
nfourtythree Aug 25, 2026
fc8d7a2
Base naming convention
nfourtythree Aug 25, 2026
9045107
Move transfer fields to form components
nfourtythree Aug 25, 2026
397ef3e
Merge branch '6.x' into feature/6.x-templating
nfourtythree Aug 26, 2026
beef299
WIP product types settings controller
nfourtythree Sep 1, 2026
354f90a
Merge branch '6.x' into feature/6.x-templating
nfourtythree Sep 1, 2026
2eccb18
WIP stores settings index action
nfourtythree Sep 1, 2026
b001566
WIP edit store
nfourtythree Sep 1, 2026
9f11785
fixed importing correct classes
nfourtythree Sep 2, 2026
baa782e
Use html columns where required
nfourtythree Sep 2, 2026
4e881d5
Fixed fallbacks
nfourtythree Sep 2, 2026
6fd0d70
Merge branch '6.x' into feature/6.x-templating
nfourtythree Sep 9, 2026
7100b54
Site/stores association using form components
nfourtythree Sep 9, 2026
7b0b51e
Order field layout designer converted
nfourtythree Sep 9, 2026
ad69576
fix cs
nfourtythree Sep 10, 2026
1a8778e
Small PHPStan fix
nfourtythree Sep 10, 2026
f4eb858
Merge branch '6.x' into feature/6.x-templating
nfourtythree Sep 10, 2026
dc0d47d
Tweak plugin get instance after merge
nfourtythree Sep 10, 2026
5d385ff
Create store management namespace
nfourtythree Sep 11, 2026
9d1e927
Fix condition builder errors
nfourtythree Sep 11, 2026
16ce190
Fix order status cp edit URL
nfourtythree Sep 11, 2026
cb5cd5e
Convert order status controller to form components
nfourtythree Sep 11, 2026
18051fb
Fix action button to be dropdown
nfourtythree Sep 11, 2026
31f3ce0
fix cs
nfourtythree Sep 11, 2026
f7056fe
Convert line item statuses controller
nfourtythree Sep 14, 2026
e7bbfc1
Convert pdfs controller
nfourtythree Sep 14, 2026
b09cceb
Convert emails controller
nfourtythree Sep 14, 2026
ba2e0e4
Convert gateways controller to form components
nfourtythree Sep 14, 2026
536c87e
Tidy up crumbs
nfourtythree Sep 15, 2026
cfe92d1
Move controller into store management
nfourtythree Sep 15, 2026
3f95166
Start on store management controllers
nfourtythree Sep 15, 2026
a1fa7f1
migrate the tax and shipping categories controllers
nfourtythree Sep 15, 2026
0b854c3
Merge branch '6.x' into feature/6.x-templating
lukeholder Sep 16, 2026
1db08a1
Merge branch '6.x' into feature/6.x-templating
lukeholder Sep 16, 2026
45df4e3
Merge branch '6.x' into feature/6.x-templating
lukeholder Sep 16, 2026
6889ef4
Tax rates controller conversion
nfourtythree Sep 16, 2026
f923a5f
Merge branch 'feature/6.x-templating' of github.com:craftcms/commerce…
nfourtythree Sep 16, 2026
c27b060
use the combo create for inline selection/creation
nfourtythree Sep 16, 2026
64b088c
convert shipping methods controller
nfourtythree Sep 16, 2026
489370e
fix translation strings
nfourtythree Sep 16, 2026
cecdb24
Fix translations
nfourtythree Sep 16, 2026
b1ccf2c
ponit to temp cms branch
nfourtythree Sep 16, 2026
9d8a47a
convert shipping rules controller and update checkbox actions to tables
nfourtythree Sep 17, 2026
9c9a8ff
Merge branch '6.x' into feature/6.x-templating
nfourtythree Sep 17, 2026
fd7b1f7
WIP general store manangement conversion (needs fixing)
nfourtythree Sep 17, 2026
049ea7a
Fix minor bugs
nfourtythree Sep 17, 2026
68df7db
Merge branch '6.x' into feature/6.x-templating
nfourtythree Sep 18, 2026
08f3ea9
fix cs
nfourtythree Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"prefer-stable": true,
"require": {
"php": "^8.5",
"craftcms/cms": "6.x-dev",
"craftcms/cms": "dev-feature/6.x-form-component-compatibility-and-usage-updates",
"dompdf/dompdf": "^3.1.6",
"ibericode/vat": "^2.0",
"iio/libmergepdf": "^4.0",
Expand Down
2 changes: 2 additions & 0 deletions lang/en/commerce.php
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@
'Couldn’t save shipping method.' => 'Couldn’t save shipping method.',
'Couldn’t save shipping rule.' => 'Couldn’t save shipping rule.',
'Couldn’t save shipping zone.' => 'Couldn’t save shipping zone.',
'Couldn’t save store location address.' => 'Couldn’t save store location address.',
'Couldn’t save store.' => 'Couldn’t save store.',
'Couldn’t save subscription fields.' => 'Couldn’t save subscription fields.',
'Couldn’t save subscription plan.' => 'Couldn’t save subscription plan.',
Expand Down Expand Up @@ -1034,6 +1035,7 @@
'Shipping method saved.' => 'Shipping method saved.',
'Shipping methods and rules deleted.' => 'Shipping methods and rules deleted.',
'Shipping methods updated.' => 'Shipping methods updated.',
'Shipping rule deleted.' => 'Shipping rule deleted.',
'Shipping rule saved.' => 'Shipping rule saved.',
'Shipping zone saved.' => 'Shipping zone saved.',
'Shipping' => 'Shipping',
Expand Down
37 changes: 21 additions & 16 deletions routes/actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,36 @@
use CraftCms\Commerce\Http\Controllers\CartController;
use CraftCms\Commerce\Http\Controllers\DonationsController;
use CraftCms\Commerce\Http\Controllers\OrdersController;
use CraftCms\Commerce\Http\Controllers\Settings\CatalogPricingController;
use CraftCms\Commerce\Http\Controllers\Settings\CatalogPricingRulesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\CatalogPricingController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\CatalogPricingRulesController;
use CraftCms\Commerce\Http\Controllers\DownloadsController;
use CraftCms\Commerce\Http\Controllers\EmailPreviewController;
use CraftCms\Commerce\Http\Controllers\Settings\DiscountsController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\DiscountsController;
use CraftCms\Commerce\Http\Controllers\Settings\EmailsController;
use CraftCms\Commerce\Http\Controllers\FormulasController;
use CraftCms\Commerce\Http\Controllers\Settings\GatewaysController;
use CraftCms\Commerce\Http\Controllers\Settings\GeneralSettingsController;
use CraftCms\Commerce\Http\Controllers\InventoryController;
use CraftCms\Commerce\Http\Controllers\InventoryLocationsController;
use CraftCms\Commerce\Http\Controllers\Settings\LineItemStatusesController;
use CraftCms\Commerce\Http\Controllers\Settings\OrderSettingsController;
use CraftCms\Commerce\Http\Controllers\Settings\OrderStatusesController;
use CraftCms\Commerce\Http\Controllers\Settings\PaymentCurrenciesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\PaymentCurrenciesController;
use CraftCms\Commerce\Http\Controllers\PaymentSourcesController;
use CraftCms\Commerce\Http\Controllers\PaymentsController;
use CraftCms\Commerce\Http\Controllers\Settings\PdfsController;
use CraftCms\Commerce\Http\Controllers\Settings\ProductTypesController;
use CraftCms\Commerce\Http\Controllers\Settings\SalesController;
use CraftCms\Commerce\Http\Controllers\Settings\SettingsController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingCategoriesController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingMethodsController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingRulesController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingZonesController;
use CraftCms\Commerce\Http\Controllers\Settings\StoreManagementController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\SalesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingCategoriesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingMethodsController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingRulesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingZonesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\StoreManagementController;
use CraftCms\Commerce\Http\Controllers\Settings\StoresController;
use CraftCms\Commerce\Http\Controllers\Settings\TaxCategoriesController;
use CraftCms\Commerce\Http\Controllers\Settings\TaxRatesController;
use CraftCms\Commerce\Http\Controllers\Settings\TaxZonesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\TaxCategoriesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\TaxRatesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\TaxZonesController;
use CraftCms\Commerce\Http\Controllers\Settings\TransferSettingsController;
use CraftCms\Commerce\Http\Controllers\TransfersController;
use CraftCms\Commerce\Http\Controllers\UserOrdersController;
use CraftCms\Commerce\Http\Controllers\WebhooksController;
Expand Down Expand Up @@ -81,8 +82,8 @@
Route::post('gateways/archive', [GatewaysController::class, 'archive']);
Route::post('gateways/reorder', [GatewaysController::class, 'reorder']);

Route::post('settings/save-settings', [SettingsController::class, 'saveSettings']);
Route::post('settings/save-transfer-settings', [SettingsController::class, 'saveTransferSettings']);
Route::post('settings/save-settings', [GeneralSettingsController::class, 'saveSettings']);
Route::post('settings/save-transfer-settings', [TransferSettingsController::class, 'saveTransferSettings']);
Route::post('order-settings/save', [OrderSettingsController::class, 'save']);

Route::post('stores/save-store', [StoresController::class, 'saveStore']);
Expand All @@ -108,6 +109,7 @@
// this group must check both, matching that legacy compound check exactly.
Route::middleware(['auth', 'can:accessPlugin-commerce', 'can:commerce-manageStoreSettings'])->group(function () {
Route::post('store-management/save', [StoreManagementController::class, 'save']);
Route::post('store-management/render-form', [StoreManagementController::class, 'renderForm']);

Route::middleware('can:commerce-managePaymentCurrencies')->group(function () {
Route::post('payment-currencies/save', [PaymentCurrenciesController::class, 'save']);
Expand All @@ -127,10 +129,12 @@
Route::post('shipping-rules/duplicate', [ShippingRulesController::class, 'duplicate']);
Route::post('shipping-rules/reorder', [ShippingRulesController::class, 'reorder']);
Route::post('shipping-rules/delete', [ShippingRulesController::class, 'delete']);
Route::post('shipping-rules/render-form', [ShippingRulesController::class, 'renderForm']);

Route::post('shipping-categories/save', [ShippingCategoriesController::class, 'save']);
Route::post('shipping-categories/delete', [ShippingCategoriesController::class, 'delete']);
Route::post('shipping-categories/set-default-category', [ShippingCategoriesController::class, 'setDefaultCategory']);
Route::post('shipping-categories/render-form', [ShippingCategoriesController::class, 'renderForm']);
});

Route::middleware('can:commerce-manageTaxes')->group(function () {
Expand All @@ -145,6 +149,7 @@
Route::post('tax-rates/save', [TaxRatesController::class, 'save']);
Route::post('tax-rates/delete', [TaxRatesController::class, 'delete']);
Route::post('tax-rates/update-status', [TaxRatesController::class, 'updateStatus']);
Route::post('tax-rates/render-form', [TaxRatesController::class, 'renderForm']);
});

Route::middleware('can:commerce-managePromotions')->group(function () {
Expand Down
36 changes: 20 additions & 16 deletions routes/cp.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,33 @@
use CraftCms\Cms\Http\Controllers\Elements\EditElementController;
use CraftCms\Cms\Http\Middleware\RequireAdmin;
use CraftCms\Commerce\Http\Controllers\DonationsController;
use CraftCms\Commerce\Http\Controllers\Settings\CatalogPricingController;
use CraftCms\Commerce\Http\Controllers\Settings\CatalogPricingRulesController;
use CraftCms\Commerce\Http\Controllers\Settings\DiscountsController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\CatalogPricingController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\CatalogPricingRulesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\DiscountsController;
use CraftCms\Commerce\Http\Controllers\Settings\EmailsController;
use CraftCms\Commerce\Http\Controllers\Settings\GatewaysController;
use CraftCms\Commerce\Http\Controllers\InventoryController;
use CraftCms\Commerce\Http\Controllers\InventoryLocationsController;
use CraftCms\Commerce\Http\Controllers\OrdersController;
use CraftCms\Commerce\Http\Controllers\Settings\GeneralSettingsController;
use CraftCms\Commerce\Http\Controllers\Settings\LineItemStatusesController;
use CraftCms\Commerce\Http\Controllers\Settings\OrderSettingsController;
use CraftCms\Commerce\Http\Controllers\Settings\OrderStatusesController;
use CraftCms\Commerce\Http\Controllers\Settings\PaymentCurrenciesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\PaymentCurrenciesController;
use CraftCms\Commerce\Http\Controllers\Settings\PdfsController;
use CraftCms\Commerce\Http\Controllers\ProductsController;
use CraftCms\Commerce\Http\Controllers\Settings\ProductTypesController;
use CraftCms\Commerce\Http\Controllers\Settings\SalesController;
use CraftCms\Commerce\Http\Controllers\Settings\SettingsController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingCategoriesController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingMethodsController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingRulesController;
use CraftCms\Commerce\Http\Controllers\Settings\ShippingZonesController;
use CraftCms\Commerce\Http\Controllers\Settings\StoreManagementController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\SalesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingCategoriesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingMethodsController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingRulesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\ShippingZonesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\StoreManagementController;
use CraftCms\Commerce\Http\Controllers\Settings\StoresController;
use CraftCms\Commerce\Http\Controllers\Settings\TaxCategoriesController;
use CraftCms\Commerce\Http\Controllers\Settings\TaxRatesController;
use CraftCms\Commerce\Http\Controllers\Settings\TaxZonesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\TaxCategoriesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\TaxRatesController;
use CraftCms\Commerce\Http\Controllers\StoreManagement\TaxZonesController;
use CraftCms\Commerce\Http\Controllers\Settings\TransferSettingsController;
use CraftCms\Commerce\Http\Controllers\TransfersController;
use CraftCms\Commerce\Http\Controllers\Users\UsersController;
use CraftCms\Commerce\Http\Controllers\VariantsController;
Expand All @@ -41,11 +42,12 @@
Route::middleware(RequireAdmin::class)->group(function () {
Route::get('commerce/settings/gateways', [GatewaysController::class, 'index']);
Route::get('commerce/settings/gateways/new', [GatewaysController::class, 'edit']);
Route::post('commerce/settings/gateways/render-form', [GatewaysController::class, 'renderForm']);
Route::get('commerce/settings/gateways/{id}', [GatewaysController::class, 'edit'])->whereNumber('id');

Route::get('commerce/settings/general', [SettingsController::class, 'edit']);
Route::get('commerce/settings/general', [GeneralSettingsController::class, 'edit']);
Route::get('commerce/settings/ordersettings', [OrderSettingsController::class, 'edit']);
Route::get('commerce/settings/transfers', [SettingsController::class, 'editTransferSettings']);
Route::get('commerce/settings/transfers', [TransferSettingsController::class, 'editTransferSettings']);

Route::get('commerce/settings/stores', [StoresController::class, 'storesIndex']);
Route::get('commerce/settings/stores/new', [StoresController::class, 'editStore']);
Expand All @@ -62,10 +64,12 @@

Route::get('commerce/settings/producttypes', [ProductTypesController::class, 'productTypeIndex']);
Route::get('commerce/settings/producttypes/new', [ProductTypesController::class, 'editProductType']);
Route::post('commerce/settings/producttypes/render-form', [ProductTypesController::class, 'renderForm']);
Route::get('commerce/settings/producttypes/{productTypeId}', [ProductTypesController::class, 'editProductType'])->whereNumber('productTypeId');

Route::get('commerce/settings/emails', [EmailsController::class, 'index']);
Route::get('commerce/settings/emails/{storeHandle}/new', [EmailsController::class, 'edit']);
Route::post('commerce/settings/emails/render-form', [EmailsController::class, 'renderForm']);
Route::get('commerce/settings/emails/{storeHandle}/{id}', [EmailsController::class, 'edit'])->whereNumber('id');

Route::get('commerce/settings/pdfs', [PdfsController::class, 'index']);
Expand Down
23 changes: 18 additions & 5 deletions src/CatalogPricing/CatalogPricing.php
Original file line number Diff line number Diff line change
Expand Up @@ -301,9 +301,16 @@ public function getCatalogPrices(int $storeId, ?CatalogPricingCondition $conditi

public function getCatalogPricesPageInfo(int $storeId, ?CatalogPricingCondition $conditionBuilder = null, bool $includeBasePrices = true, ?string $searchText = null, int $limit = 100, int $offset = 0): array
{
// getCountForPagination() wraps the query as-is and counts a column from its SELECT —
// but this query only ever selects price/promotionalPrice/salePrice aggregates, never
// purchasableId, so that column was never there to count. select()ing it first (like
// the pre-port Yii2 version did) replaces the aggregate select instead of layering atop
// it, giving a plain "one row per purchasableId" result to just count.
$total = $this->buildCatalogPricesQuery($storeId, $conditionBuilder, $includeBasePrices, $searchText)
->select(['purchasableId'])
->groupBy('purchasableId')
->getCountForPagination(['purchasableId']);
->get()
->count();

return [
'first' => $offset + 1,
Expand Down Expand Up @@ -486,6 +493,10 @@ private function _normalizeIds(?array $ids): ?array
*/
public function createCatalogPricesQuery(?int $userId = null, int|string|null $storeId = null, bool $allPrices = false, ?CatalogPricingCondition $condition = null): \Illuminate\Database\Query\Builder
{
// Quoted via the connection's own grammar, not embedded as bare SQL — the column is
// camelCase, and an unquoted raw fragment gets folded to lowercase by Postgres.
$isPromotionalPrice = DB::connection()->getQueryGrammar()->wrap('isPromotionalPrice');

$query = DB::table(Table::CATALOG_PRICING . ' as cp')
->select([
DB::raw(Sql::decimalSql('MIN(CASE WHEN isPromotionalPrice = FALSE THEN price END)') . ' AS price'),
Expand All @@ -508,10 +519,12 @@ public function createCatalogPricesQuery(?int $userId = null, int|string|null $s
/** @var CatalogPricingCondition $condition */
$condition->modifyQuery($query);

// Plain where()s rather than whereRaw() — the column is camelCase, and an unquoted
// raw fragment gets folded to lowercase by Postgres, no longer matching it.
$query->where(function($q) {
$q->whereNull('dateFrom')->orWhereRaw('dateFrom <= ?', [CraftDb::prepareDateForDb(new DateTime())]);
$q->whereNull('dateFrom')->orWhere('dateFrom', '<=', CraftDb::prepareDateForDb(new DateTime()));
})->where(function($q) {
$q->whereNull('dateTo')->orWhereRaw('dateTo >= ?', [CraftDb::prepareDateForDb(new DateTime())]);
$q->whereNull('dateTo')->orWhere('dateTo', '>=', CraftDb::prepareDateForDb(new DateTime()));
});

if (!$allPrices) {
Expand Down Expand Up @@ -549,9 +562,9 @@ public function createCatalogPricingQuery(?int $userId = null, int|string|null $
$condition->modifyQuery($query);

$query->where(function($q) {
$q->whereNull('dateFrom')->orWhereRaw('dateFrom <= ?', [CraftDb::prepareDateForDb(new DateTime())]);
$q->whereNull('dateFrom')->orWhere('dateFrom', '<=', CraftDb::prepareDateForDb(new DateTime()));
})->where(function($q) {
$q->whereNull('dateTo')->orWhereRaw('dateTo >= ?', [CraftDb::prepareDateForDb(new DateTime())]);
$q->whereNull('dateTo')->orWhere('dateTo', '>=', CraftDb::prepareDateForDb(new DateTime()));
})->orderBy('purchasableId')->orderBy('price');

if (!$allPrices) {
Expand Down
2 changes: 1 addition & 1 deletion src/Customer/Conditions/DiscountGroupConditionRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use CraftCms\Cms\Element\Queries\Contracts\ElementQueryInterface;
use CraftCms\Cms\User\Conditions\GroupConditionRule;
use Illuminate\Contracts\Database\Query\Builder;
use Illuminate\Database\Query\Builder;
use Override;
use RuntimeException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@
* (shipping, tax, promotions, payment currencies, etc). Every controller that needs it resolves
* its own `Store` from a `storeHandle` route segment — there's no framework-level route binding
* for handle-scoped resources in cms-6 (confirmed: every handle-scoped core controller does the
* same manual resolve-and-404), so this stays a plain trait rather than a shared base class.
* same manual resolve-and-404) — so `resolveStore()` stays a plain method taking `$storeHandle`
* as a parameter, not something a shared base class could inject via its constructor.
*
* This still lives as a trait, mixed into {@see \CraftCms\Commerce\Http\Controllers\StoreManagement\BaseStoreManagementController}
* rather than inlined there directly, so the per-call resolution above isn't mistaken for
* something the base class's constructor could have done instead.
*/
trait HasStoreManagementScreen
{
Expand Down
Loading
Loading