Skip to content

Commit 768c6e1

Browse files
committed
wip
1 parent fc6b494 commit 768c6e1

File tree

11 files changed

+167
-40
lines changed

11 files changed

+167
-40
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<template>
2+
<div class="relationship-input-items space-y-1 outline-none">
3+
<div class="item select-none item outline-none">
4+
<div class="item-inner">
5+
<div
6+
v-if="value.invalid"
7+
v-tooltip.top="__('An item with this ID could not be found')"
8+
v-text="value.id" />
9+
10+
<a v-if="value.type === 'user' && value.viewable" :href="value.edit_url" @click.prevent="edit" class="truncate v-popper--has-tooltip">
11+
{{ value.name }}
12+
</a>
13+
14+
<a v-else-if="value.type === 'guest' && value.viewable" @click.prevent="edit" class="truncate v-popper--has-tooltip">
15+
{{ value.name }}
16+
<div class="status-index-field select-none status-draft ml-1">Guest</div>
17+
</a>
18+
19+
<div v-else v-text="value.name" />
20+
21+
<inline-edit-form
22+
v-if="isEditingUser"
23+
:item="value"
24+
:component="meta.user.formComponent"
25+
:component-props="meta.user.formComponentProps"
26+
@updated="itemUpdated"
27+
@closed="isEditingUser = false"
28+
/>
29+
30+
<div class="flex items-center flex-1 justify-end">
31+
<div class="flex items-center">
32+
<dropdown-list>
33+
<dropdown-item v-if="value.editable" :text="__('Edit')" @click="edit" />
34+
<dropdown-item v-else-if="value.viewable" :text="__('View')" @click="edit" />
35+
</dropdown-list>
36+
</div>
37+
</div>
38+
</div>
39+
</div>
40+
</div>
41+
</template>
42+
43+
<script>
44+
import InlineEditForm from '../../../../vendor/statamic/cms/resources/js/components/inputs/relationship/InlineEditForm.vue'
45+
46+
export default {
47+
components: {
48+
InlineEditForm
49+
},
50+
51+
mixins: [Fieldtype],
52+
53+
data() {
54+
return {
55+
isEditingUser: false,
56+
}
57+
},
58+
59+
methods: {
60+
edit() {
61+
if (! this.value.editable) return;
62+
if (this.value.invalid) return;
63+
64+
if (this.value.reference && Object.entries(this.$store.state.publish).find(([key, value]) => value.reference === this.value.reference)) {
65+
this.$toast.error(__("You're already editing this item."));
66+
return;
67+
}
68+
69+
if (this.value.type === 'user') {
70+
this.isEditingUser = true;
71+
return;
72+
}
73+
},
74+
75+
itemUpdated(responseData) {
76+
this.$emit('updated', {
77+
...this.value,
78+
// in case we need to merge anything in here
79+
})
80+
},
81+
}
82+
}
83+
</script>

resources/js/cp.js

+2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
import OrderReceiptFieldtype from './components/Fieldtypes/OrderReceiptFieldtype.vue'
33
import MoneyFieldtype from './components/Fieldtypes/MoneyFieldtype.vue'
44
import ProductVariantsFieldtype from './components/Fieldtypes/ProductVariants/ProductVariantsFieldtype.vue'
5+
import CustomerFieldtype from './components/Fieldtypes/CustomerFieldtype.vue'
56

67
Statamic.$components.register('order_receipt-fieldtype', OrderReceiptFieldtype)
78
Statamic.$components.register('money-fieldtype', MoneyFieldtype)
89
Statamic.$components.register(
910
'product-variants-fieldtype',
1011
ProductVariantsFieldtype
1112
)
13+
Statamic.$components.register('customer-fieldtype', CustomerFieldtype)
1214

1315
// Inputs
1416
import RegionSelector from './components/Inputs/RegionSelector.vue'

src/Cart/Cart.php

+4-9
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public function customer($customer = null)
7575
return $customer->getKey();
7676
}
7777

78+
if ($customer instanceof GuestCustomer) {
79+
return $customer->toArray();
80+
}
81+
7882
return $customer;
7983
})
8084
->args(func_get_args());
@@ -94,17 +98,8 @@ public function lineItems($lineItems = null)
9498
->args(func_get_args());
9599
}
96100

97-
protected function hasBeenConvertedToOrder(): bool
98-
{
99-
return Order::query()->where('data->cart', $this->id())->count() > 0;
100-
}
101-
102101
public function save(): bool
103102
{
104-
if ($this->hasBeenConvertedToOrder()) {
105-
throw new CartHasBeenConvertedToOrderException;
106-
}
107-
108103
CartFacade::save($this);
109104

110105
return true;

src/Console/Commands/MigrateOrders.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ function () use ($entries) {
6969
$entries->each(function ($entry) {
7070
$data = $entry->data()->except(['blueprint', 'title'])->toArray();
7171

72-
if (Order::query()->where('order_number', Arr::get($data, 'order_number'))->exists()) {
72+
if (Order::query()->where('order_number', Arr::get($data, 'order_number'))->exisdfpts()) {
7373
return;
7474
}
7575

src/Exceptions/CartHasBeenConvertedToOrderException.php

-11
This file was deleted.

src/Facades/Customer.php

-17
This file was deleted.

src/Fieldtypes/CustomerFieldtype.php

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace DuncanMcClean\SimpleCommerce\Fieldtypes;
4+
5+
use DuncanMcClean\SimpleCommerce\Customers\GuestCustomer;
6+
use Statamic\Facades\Blueprint;
7+
use Statamic\Facades\User;
8+
use Statamic\Fields\Field;
9+
use Statamic\Fields\Fieldtype;
10+
11+
class CustomerFieldtype extends Fieldtype
12+
{
13+
public function preload()
14+
{
15+
$userField = new Field('user', [
16+
'type' => 'users',
17+
'max_items' => 1,
18+
]);
19+
20+
$guestBlueprint = Blueprint::makeFromFields([
21+
'name' => ['type' => 'text'],
22+
'email' => ['type' => 'text'],
23+
]);
24+
25+
return [
26+
'user' => $userField->meta(),
27+
'guest' => $guestBlueprint->fields()->meta(),
28+
];
29+
}
30+
31+
public function preProcess($data)
32+
{
33+
if (! is_object($data)) {
34+
return [
35+
'id' => $data,
36+
'invalid' => true,
37+
];
38+
}
39+
40+
if ($data instanceof GuestCustomer) {
41+
return [
42+
'type' => 'guest',
43+
'id' => $data->id(),
44+
'reference' => $data->id(),
45+
'name' => $data->name(),
46+
'email' => $data->email(),
47+
'viewable' => true,
48+
'editable' => false,
49+
];
50+
}
51+
52+
return [
53+
'type' => 'user',
54+
'id' => $data->id(),
55+
'reference' => $data->reference(),
56+
'name' => $data->name(),
57+
'email' => $data->email(),
58+
'viewable' => User::current()->can('view', $data),
59+
'editable' => User::current()->can('view', $data),
60+
'edit_url' => $data->editUrl(),
61+
];
62+
}
63+
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ protected function extractFromFields($order, $blueprint)
1616
'discount_total' => $order->discountTotal(),
1717
'tax_total' => $order->taxTotal(),
1818
'shipping_total' => $order->shippingTotal(),
19-
// todo: other stuff probably needs to be merged in here too
19+
'customer' => $order->customer(),
2020
]);
2121

2222
$fields = $blueprint

src/Orders/Blueprint.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,10 @@ public function __invoke(): StatamicBlueprint
149149
'handle' => 'date',
150150
'field' => ['type' => 'date', 'display' => __('Date'), 'visibility' => 'read_only', 'listable' => true, 'time_enabled' => true],
151151
],
152-
// TODO: Customer field
152+
[
153+
'handle' => 'customer',
154+
'field' => ['type' => 'customer', 'display' => __('Customer'), 'visibility' => 'read_only', 'listable' => true],
155+
]
153156
],
154157
],
155158
],

src/Orders/Order.php

+8
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ public function customer($customer = null)
135135
return $customer->getKey();
136136
}
137137

138+
if ($customer instanceof GuestCustomer) {
139+
return $customer->toArray();
140+
}
141+
138142
return $customer;
139143
})
140144
->args(func_get_args());
@@ -269,6 +273,10 @@ public function reference(): string
269273
public function getQueryableValue(string $field)
270274
{
271275
if ($field === 'customer') {
276+
if (is_array($this->customer)) {
277+
return $this->customer()->id();
278+
}
279+
272280
return $this->customer;
273281
}
274282

src/ServiceProvider.php

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class ServiceProvider extends AddonServiceProvider
2121
];
2222

2323
protected $fieldtypes = [
24+
Fieldtypes\CustomerFieldtype::class,
2425
Fieldtypes\LineItemsFieldtype::class,
2526
Fieldtypes\MoneyFieldtype::class,
2627
Fieldtypes\OrderReceiptFieldtype::class,

0 commit comments

Comments
 (0)