first commit
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Account\Forms;
|
||||
|
||||
use KupShop\ComponentsBundle\Attributes\Component;
|
||||
use KupShop\ComponentsBundle\Attributes\Entrypoint;
|
||||
use KupShop\ComponentsBundle\Attributes\Version;
|
||||
use KupShop\ComponentsBundle\Twig\ComponentInterface;
|
||||
use KupShop\ComponentsBundle\Twig\ComponentTrait;
|
||||
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
|
||||
use KupShop\UserAddressesBundle\Twig\Components\Account\Types\UserAddressFormType;
|
||||
use KupShop\UserAddressesBundle\Twig\Components\Account\UserDeliveryAddressTrait;
|
||||
use KupShop\UserBundle\Security\User;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveAction;
|
||||
use Symfony\UX\LiveComponent\ComponentToolsTrait;
|
||||
use Symfony\UX\LiveComponent\ComponentWithFormTrait;
|
||||
use Symfony\UX\LiveComponent\DefaultActionTrait;
|
||||
|
||||
#[AsLiveComponent(template: '@UserAddresses/components/Account/Forms/UserAddressForm.1.html.twig')]
|
||||
#[Component(1, [
|
||||
new Version(1),
|
||||
])]
|
||||
#[Entrypoint('account')]
|
||||
class UserAddressForm extends AbstractController implements ComponentInterface
|
||||
{
|
||||
use ComponentTrait;
|
||||
use DefaultActionTrait;
|
||||
use ComponentWithFormTrait;
|
||||
use ComponentToolsTrait;
|
||||
use UserDeliveryAddressTrait;
|
||||
|
||||
public function instantiateForm(): FormInterface
|
||||
{
|
||||
return $this->createForm(UserAddressFormType::class, $this->getAddress());
|
||||
}
|
||||
|
||||
#[LiveAction]
|
||||
public function handleForm(): void
|
||||
{
|
||||
$this->submitForm();
|
||||
/** @var DeliveryAddressEntity $entity */
|
||||
$entity = $this->getForm()->getData();
|
||||
|
||||
if ($entity) {
|
||||
if (!$entity->getIdUser()) {
|
||||
/** @var User $user */
|
||||
$user = $this->getUser();
|
||||
$entity->setIdUser($user->getID());
|
||||
}
|
||||
|
||||
$data = ['id' => $entity->getId()];
|
||||
if ($this->userAddressesUtil->saveDeliveryAddress($entity)) {
|
||||
$data = ['id' => null, 'newId' => $entity->getId()];
|
||||
}
|
||||
|
||||
$this->emit('toggleEdit', $data);
|
||||
$this->emit('reloadAddresses');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Account\Types;
|
||||
|
||||
use KupShop\KupShopBundle\Context\CountryContext;
|
||||
use KupShop\KupShopBundle\Context\CurrencyContext;
|
||||
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class UserAddressFormType extends AbstractType
|
||||
{
|
||||
public function __construct(
|
||||
public readonly CountryContext $countryContext,
|
||||
public readonly CurrencyContext $currencyContext,
|
||||
) {
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder->add('name', TextType::class, ['empty_data' => '', 'label' => 'name'])
|
||||
->add('surname', TextType::class, ['empty_data' => '', 'label' => 'surname'])
|
||||
->add('firm', TextType::class, ['empty_data' => '', 'label' => 'firm'])
|
||||
->add('street', TextType::class, ['empty_data' => '', 'label' => 'street'])
|
||||
->add('city', TextType::class, ['empty_data' => '', 'label' => 'city'])
|
||||
->add('zip', TextType::class, ['empty_data' => '', 'label' => 'zip'])
|
||||
->add('country', ChoiceType::class, [
|
||||
'empty_data' => '',
|
||||
'choice_loader' => new CallbackChoiceLoader(function (): array {
|
||||
return $this->getCountries();
|
||||
}),
|
||||
'label' => 'country',
|
||||
'data' => $options['data']->getCountry() ?: $this->countryContext->getActiveId(),
|
||||
])
|
||||
->add('phone', TextType::class, ['empty_data' => '', 'required' => false, 'label' => 'phone'])
|
||||
->add('state', TextType::class, ['empty_data' => '', 'required' => false, 'label' => 'state'])
|
||||
->add('email', TextType::class, ['empty_data' => '', 'required' => false, 'label' => 'email'])
|
||||
->add('customAddress', TextType::class, ['empty_data' => '', 'required' => false, 'label' => 'custom_address'])
|
||||
->add('submit', SubmitType::class, ['label' => 'save']);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => DeliveryAddressEntity::class,
|
||||
'translation_domain' => 'user_addresses',
|
||||
]);
|
||||
}
|
||||
|
||||
private function getCountries(): array
|
||||
{
|
||||
$countries = [];
|
||||
|
||||
foreach ($this->countryContext->getSupported() as $id => $country) {
|
||||
$countries[$country->getName()] = $id;
|
||||
}
|
||||
|
||||
return $countries;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Account;
|
||||
|
||||
use KupShop\ComponentsBundle\Attributes\Component;
|
||||
use KupShop\ComponentsBundle\Attributes\Entrypoint;
|
||||
use KupShop\ComponentsBundle\Attributes\Version;
|
||||
use KupShop\ComponentsBundle\Twig\BaseComponent;
|
||||
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
|
||||
use KupShop\UserAddressesBundle\Util\UserAddressesUtil;
|
||||
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveAction;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveArg;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveListener;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveProp;
|
||||
use Symfony\UX\LiveComponent\ComponentToolsTrait;
|
||||
use Symfony\UX\LiveComponent\DefaultActionTrait;
|
||||
|
||||
#[AsLiveComponent(template: '@UserAddresses/components/Account/UserAddress/UserAddress.1.html.twig')]
|
||||
#[Component(1, [new Version(1)])]
|
||||
#[Entrypoint('base')]
|
||||
class UserAddress extends BaseComponent
|
||||
{
|
||||
use DefaultActionTrait;
|
||||
use ComponentToolsTrait;
|
||||
|
||||
#[LiveProp(writable: true)]
|
||||
public ?int $id = null;
|
||||
|
||||
#[LiveProp(writable: true)]
|
||||
public bool $edit = false;
|
||||
|
||||
private ?DeliveryAddressEntity $address = null;
|
||||
|
||||
public function __construct(private readonly UserAddressesUtil $userAddressesUtil)
|
||||
{
|
||||
}
|
||||
|
||||
public function getAddress(bool $force = false): DeliveryAddressEntity
|
||||
{
|
||||
if ($this->address && !$force) {
|
||||
return $this->address;
|
||||
}
|
||||
|
||||
return $this->address = $this->userAddressesUtil->getDeliveryAddress($this->id);
|
||||
}
|
||||
|
||||
#[LiveAction]
|
||||
public function toggleEdit(): void
|
||||
{
|
||||
$this->edit = !$this->edit;
|
||||
}
|
||||
|
||||
#[LiveListener('toggleEdit')]
|
||||
public function toggleLiveEdit(#[LiveArg] ?int $id, #[LiveArg] ?int $newId = null): void
|
||||
{
|
||||
// Listeners are called for all components, so we need to check if the id matches
|
||||
if ($this->id !== $id) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($newId) {
|
||||
$this->id = $newId;
|
||||
$this->emit('addressCreated');
|
||||
}
|
||||
$this->edit = !$this->edit;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Account;
|
||||
|
||||
use KupShop\ComponentsBundle\Attributes\Component;
|
||||
use KupShop\ComponentsBundle\Attributes\Entrypoint;
|
||||
use KupShop\ComponentsBundle\Attributes\Version;
|
||||
use KupShop\ComponentsBundle\Twig\BaseComponent;
|
||||
use KupShop\UserAddressesBundle\Util\UserAddressesUtil;
|
||||
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveAction;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveArg;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveListener;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveProp;
|
||||
use Symfony\UX\LiveComponent\ComponentToolsTrait;
|
||||
use Symfony\UX\LiveComponent\DefaultActionTrait;
|
||||
|
||||
#[AsLiveComponent(template: '@UserAddresses/components/Account/UserAddressesList/UserAddressesList.1.html.twig')]
|
||||
#[Component(1, [new Version(1, newJs: null)])]
|
||||
#[Entrypoint('base')]
|
||||
class UserAddressesList extends BaseComponent
|
||||
{
|
||||
use DefaultActionTrait;
|
||||
use ComponentToolsTrait;
|
||||
|
||||
#[LiveProp]
|
||||
public array $ids = [];
|
||||
|
||||
#[LiveProp]
|
||||
public bool $addNew = false;
|
||||
|
||||
public function __construct(private readonly UserAddressesUtil $userAddressesUtil)
|
||||
{
|
||||
}
|
||||
|
||||
#[LiveAction]
|
||||
public function addAddress(): void
|
||||
{
|
||||
$this->addNew = true;
|
||||
}
|
||||
|
||||
#[LiveListener('addressCreated')]
|
||||
public function addressCreated(): void
|
||||
{
|
||||
$this->addNew = false;
|
||||
}
|
||||
|
||||
#[LiveAction]
|
||||
public function deleteAddress(#[LiveArg] int $id): void
|
||||
{
|
||||
$this->userAddressesUtil->deleteAddress($id);
|
||||
|
||||
$this->addNew = false;
|
||||
$this->ids = $this->userAddressesUtil->getDeliveryAddressesIds();
|
||||
|
||||
$this->emit('reloadAddresses');
|
||||
}
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$this->ids = $this->userAddressesUtil->getDeliveryAddressesIds();
|
||||
}
|
||||
|
||||
public function getIsEditAllow(): bool
|
||||
{
|
||||
return (bool) \Settings::getDefault()->edit_user_addresses;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Account;
|
||||
|
||||
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
|
||||
use KupShop\UserAddressesBundle\Util\UserAddressesUtil;
|
||||
use Symfony\Contracts\Service\Attribute\Required;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveProp;
|
||||
|
||||
trait UserDeliveryAddressTrait
|
||||
{
|
||||
#[LiveProp]
|
||||
public ?int $id = null;
|
||||
|
||||
protected UserAddressesUtil $userAddressesUtil;
|
||||
|
||||
public ?DeliveryAddressEntity $deliveryAddress = null;
|
||||
|
||||
public function getAddress(): DeliveryAddressEntity
|
||||
{
|
||||
if ($this->deliveryAddress) {
|
||||
return $this->deliveryAddress;
|
||||
}
|
||||
|
||||
if (!$this->id) {
|
||||
return $this->deliveryAddress = new DeliveryAddressEntity();
|
||||
}
|
||||
|
||||
return $this->deliveryAddress = $this->userAddressesUtil->getDeliveryAddress($this->id);
|
||||
}
|
||||
|
||||
#[Required]
|
||||
public function setUserAddressesUtil(UserAddressesUtil $userAddressesUtil): void
|
||||
{
|
||||
$this->userAddressesUtil = $userAddressesUtil;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Cart;
|
||||
|
||||
use KupShop\ComponentsBundle\Attributes\Component;
|
||||
use KupShop\ComponentsBundle\Attributes\Entrypoint;
|
||||
use KupShop\ComponentsBundle\Attributes\Version;
|
||||
use KupShop\ComponentsBundle\Twig\BaseComponent;
|
||||
use KupShop\UserAddressesBundle\Util\UserAddressesCartUtil;
|
||||
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveAction;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveArg;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveListener;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveProp;
|
||||
use Symfony\UX\LiveComponent\ComponentToolsTrait;
|
||||
use Symfony\UX\LiveComponent\DefaultActionTrait;
|
||||
|
||||
#[AsLiveComponent(template: '@UserAddresses/components/Cart/HiddenAddressInput/HiddenAddressInput.1.html.twig')]
|
||||
#[Component(1, [new Version(1, newCss: null)])]
|
||||
#[Entrypoint('base')]
|
||||
class HiddenAddressInput extends BaseComponent
|
||||
{
|
||||
use DefaultActionTrait;
|
||||
use ComponentToolsTrait;
|
||||
|
||||
#[LiveProp]
|
||||
public bool $updateCart = false;
|
||||
#[LiveProp]
|
||||
public ?string $inputName = null;
|
||||
#[LiveProp]
|
||||
public ?int $selectedId = null;
|
||||
|
||||
public function __construct(
|
||||
private readonly UserAddressesCartUtil $userAddressCartUtil,
|
||||
) {
|
||||
}
|
||||
|
||||
#[LiveListener('selectAddress')]
|
||||
#[LiveAction]
|
||||
public function selectAddress(#[LiveArg] ?int $id): void
|
||||
{
|
||||
if (!$this->updateCart) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->selectedId = $id;
|
||||
$this->userAddressCartUtil->saveAddressToCart($id);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KupShop\UserAddressesBundle\Twig\Components\Cart;
|
||||
|
||||
use KupShop\ComponentsBundle\Attributes\Component;
|
||||
use KupShop\ComponentsBundle\Attributes\Entrypoint;
|
||||
use KupShop\ComponentsBundle\Attributes\Version;
|
||||
use KupShop\ComponentsBundle\Twig\BaseComponent;
|
||||
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
|
||||
use KupShop\UserAddressesBundle\Util\UserAddressesUtil;
|
||||
use Symfony\Component\HttpFoundation\Session\SessionInterface;
|
||||
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveListener;
|
||||
use Symfony\UX\LiveComponent\Attribute\LiveProp;
|
||||
use Symfony\UX\LiveComponent\ComponentToolsTrait;
|
||||
use Symfony\UX\LiveComponent\DefaultActionTrait;
|
||||
|
||||
#[AsLiveComponent(template: '@UserAddresses/components/Cart/UserAddressSelect/UserAddressSelect.1.html.twig')]
|
||||
#[Component(1, [new Version(1)])]
|
||||
#[Entrypoint('base')]
|
||||
class UserAddressSelect extends BaseComponent
|
||||
{
|
||||
use DefaultActionTrait;
|
||||
use ComponentToolsTrait;
|
||||
|
||||
/** @var DeliveryAddressEntity[] */
|
||||
private array $addresses = [];
|
||||
#[LiveProp(writable: true)]
|
||||
public ?int $selectedId = null;
|
||||
#[LiveProp]
|
||||
public ?bool $allowAddNew = false;
|
||||
|
||||
public function __construct(
|
||||
private readonly UserAddressesUtil $userAddressesUtil,
|
||||
private readonly \Cart $cart,
|
||||
private readonly SessionInterface $session,
|
||||
) {
|
||||
}
|
||||
|
||||
public function getAddresses(bool $force = false): array
|
||||
{
|
||||
if ($this->addresses && !$force) {
|
||||
return $this->addresses;
|
||||
}
|
||||
|
||||
$this->addresses = $this->userAddressesUtil->getDeliveryAddresses();
|
||||
|
||||
if ($this->selectedId === null) {
|
||||
if (count($this->addresses) == 1) {
|
||||
$this->selectedId = $this->addresses[0]->getId();
|
||||
} else {
|
||||
$this->selectedId = 0;
|
||||
}
|
||||
|
||||
$this->emit('selectAddress', ['id' => $this->selectedId]);
|
||||
}
|
||||
|
||||
return $this->addresses;
|
||||
}
|
||||
|
||||
#[LiveListener('reloadAddresses')]
|
||||
public function reloadAddresses(): void
|
||||
{
|
||||
$this->getAddresses(true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user