first commit

This commit is contained in:
2025-08-02 16:30:27 +02:00
commit 23646bfcee
14851 changed files with 1750626 additions and 0 deletions

View File

@@ -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');
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}