Skip to content

Commit 0b35077

Browse files
committed
wip
1 parent 508eeac commit 0b35077

20 files changed

+323
-155
lines changed

config/simple-commerce.php

+18-23
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,29 @@
22

33
return [
44

5+
'sites' => [
6+
'default' => [
7+
'currency' => 'GBP',
8+
],
9+
],
10+
511
'products' => [
612
'collections' => ['products'],
713
],
814

9-
'sites' => [
10-
'default' => [
11-
'currency' => 'GBP',
15+
'carts' => [
16+
'cookie_name' => 'simple-commerce-cart',
1217

13-
'shipping' => [
14-
'methods' => [
15-
\DuncanMcClean\SimpleCommerce\Shipping\FreeShipping::class => [],
16-
],
17-
],
18+
'directory' => storage_path('statamic/simple-commerce/carts'),
19+
],
20+
21+
'orders' => [
22+
'directory' => base_path('content/orders'),
23+
],
24+
25+
'shipping' => [
26+
'methods' => [
27+
\DuncanMcClean\SimpleCommerce\Shipping\FreeShipping::class => [],
1828
],
1929
],
2030

@@ -42,19 +52,4 @@
4252
],
4353
],
4454

45-
'field_whitelist' => [
46-
'orders' => [
47-
// TODO: these default fields might need changing (in fact, this whitelist might end up being dynamic,
48-
// based on the fields in the order blueprint)
49-
'shipping_name', 'shipping_address', 'shipping_address_line1', 'shipping_address_line2', 'shipping_city',
50-
'shipping_region', 'shipping_postal_code', 'shipping_country', 'shipping_note', 'shipping_method',
51-
'use_shipping_address_for_billing', 'billing_name', 'billing_address', 'billing_address_line2',
52-
'billing_city', 'billing_region', 'billing_postal_code', 'billing_country',
53-
],
54-
55-
'line_items' => [],
56-
57-
'customers' => ['name', 'email'],
58-
],
59-
6055
];

resources/js/components/fieldtypes/PaymentDetailsFieldtype.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<div class="mt-6">
2828
<ul class="list-none text-xs space-y-3">
2929
<li><span class="font-semibold">Payment ID:</span> pi_1234567889abcefhkl</li>
30-
<li><span class="font-semibold">Confirmed At:</span> 09/09/2024 12:46:12</li>
30+
<li><span class="font-semibold">Confirmed At:</span> 09/09/2024 12:46:12</li> <!-- TODO: Ensure this is output in the CP date/time format -->
3131
<li><span class="font-semibold">Amount:</span> £200.99</li>
3232
</ul>
3333
</div>

resources/js/components/orders/PublishForm.vue

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</div>
1111
</h1>
1212

13-
<dropdown-list class="rtl:ml-4 ltr:mr-4">
13+
<dropdown-list v-if="itemActions.length" class="rtl:ml-4 ltr:mr-4">
1414
<data-list-inline-actions
1515
:item="values.id"
1616
:url="itemActionUrl"
@@ -143,6 +143,7 @@ export default {
143143
initialValues: Object,
144144
initialMeta: Object,
145145
initialTitle: String,
146+
initialReadOnly: Boolean,
146147
collectionHandle: String,
147148
breadcrumbs: Array,
148149
initialActions: Object,

resources/views/cp/orders/edit.blade.php

+13-12
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@
66
@section('content')
77

88
<orders-publish-form
9-
publish-container="base"
10-
:initial-actions="{{ json_encode($actions) }}"
11-
method="patch"
12-
initial-title="{{ $title }}"
13-
initial-reference="{{ $order->reference() }}"
14-
:initial-fieldset="{{ json_encode($blueprint) }}"
15-
:initial-values="{{ json_encode($values) }}"
16-
:initial-meta="{{ json_encode($meta) }}"
17-
:breadcrumbs="{{ $breadcrumbs->toJson() }}"
18-
initial-listing-url="{{ cp_route('simple-commerce.orders.index',) }}"
19-
:initial-item-actions="{{ json_encode($itemActions) }}"
20-
item-action-url="{{ cp_route('simple-commerce.orders.actions.run') }}"
9+
publish-container="base"
10+
:initial-actions="{{ json_encode($actions) }}"
11+
method="patch"
12+
initial-title="{{ $title }}"
13+
initial-reference="{{ $order->reference() }}"
14+
:initial-fieldset="{{ json_encode($blueprint) }}"
15+
:initial-values="{{ json_encode($values) }}"
16+
:initial-meta="{{ json_encode($meta) }}"
17+
:initial-read-only="{{ json_encode($readOnly) }}"
18+
:breadcrumbs="{{ $breadcrumbs->toJson() }}"
19+
initial-listing-url="{{ cp_route('simple-commerce.orders.index',) }}"
20+
:initial-item-actions="{{ json_encode($itemActions) }}"
21+
item-action-url="{{ cp_route('simple-commerce.orders.actions.run') }}"
2122
></orders-publish-form>
2223

2324
@endsection

routes/actions.php

+12-17
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,33 @@
44
use DuncanMcClean\SimpleCommerce\Http\Controllers\CartItemController;
55
use DuncanMcClean\SimpleCommerce\Http\Controllers\CheckoutController;
66
use DuncanMcClean\SimpleCommerce\Http\Controllers\CouponController;
7-
use DuncanMcClean\SimpleCommerce\Http\Controllers\CustomerController;
87
use DuncanMcClean\SimpleCommerce\Http\Controllers\DigitalProducts\DownloadController;
9-
use DuncanMcClean\SimpleCommerce\Http\Controllers\DigitalProducts\VerificationController;
108
use DuncanMcClean\SimpleCommerce\Http\Controllers\GatewayCallbackController;
119
use DuncanMcClean\SimpleCommerce\Http\Controllers\GatewayWebhookController;
1210
use DuncanMcClean\SimpleCommerce\Http\Middleware\EnsureFormParametersArriveIntact;
1311
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
1412
use Illuminate\Support\Facades\Route;
1513

1614
Route::name('simple-commerce.')->group(function () {
17-
Route::get('/cart', [CartController::class, 'index'])->name('cart.index');
18-
Route::get('/customer/{customer}', [CustomerController::class, 'index'])->name('customer.index');
15+
Route::get('cart', [CartController::class, 'index'])->name('cart.index');
1916

20-
Route::middleware([EnsureFormParametersArriveIntact::class])->group(function () {
21-
Route::post('/cart', [CartController::class, 'update'])->name('cart.update');
22-
Route::delete('/cart', [CartController::class, 'destroy'])->name('cart.empty');
17+
Route::middleware(EnsureFormParametersArriveIntact::class)->group(function () {
18+
Route::post('cart', [CartController::class, 'update'])->name('cart.update');
19+
Route::delete('cart', [CartController::class, 'destroy'])->name('cart.empty');
2320

24-
Route::post('/cart-items', [CartItemController::class, 'store'])->name('cart-items.store');
25-
Route::post('/cart-items/{item}', [CartItemController::class, 'update'])->name('cart-items.update');
26-
Route::delete('/cart-items/{item}', [CartItemController::class, 'destroy'])->name('cart-items.destroy');
21+
Route::post('cart-items', [CartItemController::class, 'store'])->name('cart-items.store');
22+
Route::post('cart-items/{item}', [CartItemController::class, 'update'])->name('cart-items.update');
23+
Route::delete('cart-items/{item}', [CartItemController::class, 'destroy'])->name('cart-items.destroy');
2724

28-
Route::post('/checkout', [CheckoutController::class, '__invoke'])->name('checkout.store');
25+
Route::post('checkout', [CheckoutController::class, '__invoke'])->name('checkout.store');
2926

30-
Route::post('/customer/{customer}', [CustomerController::class, 'update'])->name('customer.update');
31-
32-
Route::post('/coupon', [CouponController::class, 'store'])->name('coupon.store');
33-
Route::delete('/coupon', [CouponController::class, 'destroy'])->name('coupon.destroy');
27+
Route::post('coupon', [CouponController::class, 'store'])->name('coupon.store');
28+
Route::delete('coupon', [CouponController::class, 'destroy'])->name('coupon.destroy');
3429
});
3530

36-
Route::get('/gateways/{gateway}/callback', [GatewayCallbackController::class, 'index'])->name('gateways.callback');
31+
Route::get('gateways/{gateway}/callback', [GatewayCallbackController::class, 'index'])->name('gateways.callback');
3732

38-
Route::post('/gateways/{gateway}/webhook', [GatewayWebhookController::class, 'index'])
33+
Route::post('gateways/{gateway}/webhook', [GatewayWebhookController::class, 'index'])
3934
->name('gateways.webhook')
4035
->withoutMiddleware([VerifyCsrfToken::class]);
4136

src/Fieldtypes/LineItemsFieldtype.php

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace DuncanMcClean\SimpleCommerce\Fieldtypes;
44

55
use DuncanMcClean\SimpleCommerce\Orders\LineItem;
6+
use Illuminate\Support\Str;
67
use Statamic\Fields\Fieldtype;
78

89
class LineItemsFieldtype extends Fieldtype
@@ -13,4 +14,9 @@ public function augment($value): array
1314
{
1415
return $value->map->toAugmentedArray()->all();
1516
}
17+
18+
public function preProcessIndex($data): string
19+
{
20+
return $data->count() . ' ' . Str::plural('line item', $data->count());
21+
}
1622
}

src/Fieldtypes/OrdersFieldtype.php

+18
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,26 @@
44

55
use DuncanMcClean\SimpleCommerce\Facades\Order;
66
use Statamic\Fieldtypes\Relationship;
7+
use Statamic\Statamic;
78

89
class OrdersFieldtype extends Relationship
910
{
11+
protected $canEdit = true;
1012
protected $canCreate = false;
13+
protected $canSearch = false;
14+
15+
protected $formComponent = 'orders-publish-form';
16+
17+
protected $formComponentProps = [
18+
'initialActions' => 'actions',
19+
'initialTitle' => 'title',
20+
'initialReference' => 'reference',
21+
'initialFieldset' => 'blueprint',
22+
'initialValues' => 'values',
23+
'initialMeta' => 'meta',
24+
'initialReadOnly' => 'readOnly',
25+
'breadcrumbs' => 'breadcrumbs',
26+
];
1127

1228
protected function toItemArray($id)
1329
{
@@ -16,6 +32,8 @@ protected function toItemArray($id)
1632
return [
1733
'id' => $order->id(),
1834
'title' => "#{$order->orderNumber()}",
35+
'hint' => $order->date()->format(Statamic::cpDateFormat()),
36+
'edit_url' => cp_route('simple-commerce.orders.edit', $order->id()),
1937
];
2038
}
2139

src/Http/Controllers/CP/Orders/ExtractsFromOrderFields.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ protected function extractFromFields($order, $blueprint)
2525
->addValues($values->all())
2626
->preProcess();
2727

28-
return [$fields->values()->merge(['id' => $order->id()])->all(), $fields->meta()->all()];
28+
$values = $fields->values()->merge([
29+
'id' => $order->id(),
30+
]);
31+
32+
return [$values->all(), $fields->meta()->all()];
2933
}
3034
}

src/Http/Controllers/CP/Orders/OrderController.php

+42-5
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
use DuncanMcClean\SimpleCommerce\Contracts\Orders\Order as OrderContract;
66
use DuncanMcClean\SimpleCommerce\Facades\Order;
77
use DuncanMcClean\SimpleCommerce\Http\Resources\CP\Orders\Orders;
8-
use DuncanMcClean\SimpleCommerce\Orders\Blueprint as OrderBlueprint;
9-
use DuncanMcClean\SimpleCommerce\Orders\OrderStatus;
108
use Illuminate\Http\Request;
9+
use Illuminate\Support\Str;
1110
use Statamic\CP\Breadcrumbs;
1211
use Statamic\Facades\Action;
1312
use Statamic\Facades\Scope;
13+
use Statamic\Facades\User;
1414
use Statamic\Http\Controllers\CP\CpController;
1515
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
16+
use DuncanMcClean\SimpleCommerce\Http\Resources\CP\Orders\Order as OrderResource;
1617

1718
class OrderController extends CpController
1819
{
@@ -71,9 +72,11 @@ protected function indexQuery()
7172
{
7273
$query = Order::query();
7374

74-
// todo: make this more useful
7575
if ($search = request('search')) {
76-
$query->where('order_number', 'like', '%'.$search.'%');
76+
$query
77+
->where('order_number', 'LIKE', '%'.Str::remove('#', $search).'%')
78+
->orWhere('date', 'LIKE', '%'.$search.'%')
79+
->orWhere('grand_total', 'LIKE', '%'.$search.'%');
7780
}
7881

7982
return $query;
@@ -101,6 +104,7 @@ public function edit(Request $request, $order)
101104
['text' => __('Orders'), 'url' => cp_route('simple-commerce.orders.index')],
102105
]),
103106
'itemActions' => Action::for($order, ['view' => 'form']),
107+
'readOnly' => User::current()->cant('update', $order),
104108
];
105109

106110
if ($request->wantsJson()) {
@@ -114,6 +118,39 @@ public function edit(Request $request, $order)
114118

115119
public function update(Request $request, $order)
116120
{
117-
dd($request);
121+
$order = Order::find($order);
122+
123+
$this->authorize('update', $order);
124+
125+
$blueprint = Order::blueprint();
126+
127+
$data = $request->except($except = [
128+
'id', 'customer', 'date', 'discount_total', 'grand_total', 'line_items', 'order_number',
129+
'payment_details', 'receipt', 'shipping_total', 'sub_total', 'tax_total'
130+
]);
131+
132+
$fields = $blueprint->fields()->addValues($data);
133+
134+
$fields
135+
->validator()
136+
->withReplacements([
137+
'id' => $order->id(),
138+
])
139+
->validate();
140+
141+
$values = $fields->process()->values()->except($except);
142+
143+
$order->data($values->all());
144+
145+
$saved = $order->save();
146+
147+
[$values] = $this->extractFromFields($order, $blueprint);
148+
149+
return [
150+
'data' => array_merge((new OrderResource($order->fresh()))->resolve()['data'], [
151+
'values' => $values,
152+
]),
153+
'saved' => $saved,
154+
];
118155
}
119156
}

src/Http/Controllers/CartController.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function update(UpdateRequest $request)
3838

3939
$data = collect($request->all())
4040
->except(['_token', '_params', '_redirect', '_request', 'customer', 'email'])
41-
->only(config('simple-commerce.field_whitelist.orders'))
41+
// ->only(config('simple-commerce.field_whitelist.orders'))
4242
->map(function ($value) {
4343
if ($value === 'on') {
4444
return true;

src/Http/Controllers/CartItemController.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public function store(StoreRequest $request)
7070

7171
// Ensure the product doesn't already exist in the cart
7272
$alreadyExistsQuery = $items;
73-
$metadata = Arr::only($request->all(), config('simple-commerce.field_whitelist.line_items'));
73+
// $metadata = Arr::only($request->all(), config('simple-commerce.field_whitelist.line_items'));
74+
$metadata = $request->all();
7475

7576
if ($request->has('variant')) {
7677
$alreadyExistsQuery = $alreadyExistsQuery->where('variant', [

src/Http/Controllers/CustomerController.php

-35
This file was deleted.

src/Http/Resources/CP/Orders/Order.php

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class Order extends JsonResource
1010
public function toArray(Request $request)
1111
{
1212
$data = [
13+
'title' => __('Order #:number', ['number' => $this->orderNumber()]),
1314
'order_number' => $this->orderNumber(),
1415
];
1516

0 commit comments

Comments
 (0)