Fixes
This commit is contained in:
parent
5ba102ec56
commit
e13304227d
@ -1,4 +1,4 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap');
|
||||
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@ -8,7 +8,7 @@
|
||||
html {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
font-feature-settings: normal;
|
||||
font-family: DM Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;
|
||||
font-family: "Inter", serif;
|
||||
font-variation-settings: normal;
|
||||
line-height: 1.5;
|
||||
}
|
||||
@ -26,3 +26,10 @@
|
||||
.dropdown:hover .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.badge-yes {
|
||||
@apply inline-flex rounded bg-lime-500 px-2 py-1 text-sm font-medium text-white hover:bg-opacity-90;
|
||||
}
|
||||
.badge-no {
|
||||
@apply inline-flex rounded bg-orange-500 px-2 py-1 text-sm font-medium text-white hover:bg-opacity-90;
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
{% block body %}
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 filament-widgets-container gap-4 lg:gap-8 mb-6">
|
||||
{% if is_granted('ROLE_ADMIN') %}
|
||||
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
|
||||
<div class="rounded-sm border border bg-white px-7.5 py-6 shadow-lg dark:border-strokedark dark:bg-boxdark">
|
||||
<div class="p-2 space-y-2">
|
||||
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
|
||||
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
|
||||
@ -28,7 +28,7 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
|
||||
<div class="rounded-sm border border bg-white px-7.5 py-6 shadow-lg dark:border-strokedark dark:bg-boxdark">
|
||||
<div class="p-2 space-y-2">
|
||||
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
|
||||
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
|
||||
@ -46,7 +46,7 @@
|
||||
</div>
|
||||
|
||||
<div class="col-span-full">
|
||||
<div class="p-2 space-y-2 bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
|
||||
<div class="rounded-sm border border bg-white px-7.5 py-6 shadow-lg dark:border-strokedark dark:bg-boxdark">
|
||||
<div class="p-2 space-y-2">
|
||||
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
|
||||
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
|
||||
@ -59,7 +59,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
|
||||
<div class="rounded-sm border border bg-white px-7.5 py-6 shadow-lg dark:border-strokedark dark:bg-boxdark">
|
||||
<div class="p-2 space-y-2">
|
||||
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
|
||||
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
|
||||
@ -99,7 +99,7 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
|
||||
<div class="rounded-sm border border bg-white px-7.5 py-6 shadow-lg dark:border-strokedark dark:bg-boxdark">
|
||||
<div class="p-2 space-y-2">
|
||||
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
|
||||
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
|
||||
|
||||
@ -33,22 +33,22 @@ class ContactAddress
|
||||
#[Field(type: 'string')]
|
||||
protected $lid;
|
||||
|
||||
public function getLId(): string
|
||||
public function getLId(): ?string
|
||||
{
|
||||
return (string)$this->lid;
|
||||
}
|
||||
|
||||
public function setLId(string $var): void
|
||||
public function setLId(?string $var): void
|
||||
{
|
||||
$this->lid = $var;
|
||||
}
|
||||
|
||||
public function getSteuerId(): string
|
||||
public function getSteuerId(): ?string
|
||||
{
|
||||
return (string)$this->steuerId;
|
||||
}
|
||||
|
||||
public function setSteuerId(string $var): void
|
||||
public function setSteuerId(?string $var): void
|
||||
{
|
||||
$this->steuerId = $var;
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ class ContactAddress
|
||||
protected $kundenNr = '';
|
||||
protected $homepage = '';
|
||||
protected $lid = '';
|
||||
protected $steuerid = '';
|
||||
protected $steuerId = '';
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
@ -774,22 +774,22 @@ class ContactAddress
|
||||
$this->pos = $pos;
|
||||
}
|
||||
|
||||
public function getSteuerId(): string
|
||||
public function getSteuerId(): ?string
|
||||
{
|
||||
return (string)$this->steuerid;
|
||||
return (string)$this->steuerId;
|
||||
}
|
||||
|
||||
public function setSteuerId(string $var): void
|
||||
public function setSteuerId(?string $var): void
|
||||
{
|
||||
$this->steuerid = $var;
|
||||
$this->steuerId = $var;
|
||||
}
|
||||
|
||||
public function getLId(): string
|
||||
public function getLId(): ?string
|
||||
{
|
||||
return (string)$this->lid;
|
||||
}
|
||||
|
||||
public function setLId(string $var): void
|
||||
public function setLId(?string $var): void
|
||||
{
|
||||
$this->lid = $var;
|
||||
}
|
||||
|
||||
@ -2,16 +2,20 @@
|
||||
{% trans_default_domain 'core_news_list' %}
|
||||
{% block header %}
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold tracking-tight">{{ 'News'|trans }} {{ 'List'|trans }}</h1>
|
||||
<h1 class="text-psc text-2xl font-medium flex flex-row gap-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="h-8">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 0 1-2.25 2.25M16.5 7.5V18a2.25 2.25 0 0 0 2.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 0 0 2.25 2.25h13.5M6 7.5h3v3H6v-3Z" />
|
||||
</svg>
|
||||
{{ 'News'|trans }} {{ 'List'|trans }}</h1>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center gap-4 justify-start shrink-0">
|
||||
<a href="{{ path("psc_shop_news_backend_create") }}" class="inline-flex items-center justify-center py-1 gap-1 font-medium rounded-lg border transition-colors outline-none focus:ring-offset-2 focus:ring-2 focus:ring-inset min-h-[2.25rem] px-4 text-sm text-white shadow focus:ring-white border-transparent bg-psc-500 hover:bg-psc-600 focus:bg-psc-600 focus:ring-offset-psc-600"><span class="fa fa-edit"></span> {{ 'Addnews'|trans }}</a>
|
||||
<a href="{{ path("psc_shop_news_backend_create") }}" class="inline-flex items-center justify-center py-1 gap-1 font-medium rounded-sm border px-4 text-sm text-white shadow-lg bg-psc-500 hover:bg-psc-600 hover:ring-2 hover:ring-psc-500 hover:ring-offset-2 min-h-[2.25rem]"><span class="fa fa-edit"></span> {{ 'Addnews'|trans }}</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block body %}
|
||||
<div class="border border-gray-300 shadow-sm bg-white rounded-xl filament-tables-container dark:bg-gray-800 dark:border-gray-700">
|
||||
<div class="rounded-sm border bg-white px-7.5 py-6 shadow-lg dark:border-strokedark dark:bg-boxdark">
|
||||
<div class="flex items-center justify-between p-2 h-14">
|
||||
<div class="flex items-center gap-2"></div>
|
||||
<div class="flex items-center justify-end w-full gap-2 md:max-w-md">
|
||||
@ -19,37 +23,33 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overflow-x-auto relative dark:border-gray-700 border-t">
|
||||
<table class="filament-tables-table w-full text-start divide-y table-auto dark:divide-gray-700">
|
||||
<thead>
|
||||
<tr class="bg-gray-500/5">
|
||||
<th class="p-0"><span class="items-center gap-x-1 w-full px-4 py-2 whitespace-nowrap font-medium text-sm text-gray-600 dark:text-gray-300">{{ knp_pagination_sortable(pagination, 'Uid'|trans, 'news.uid') }}</div></th>
|
||||
<th>{{ knp_pagination_sortable(pagination, 'active'|trans, 'news.enable') }}</th>
|
||||
<th>{{ knp_pagination_sortable(pagination, 'Name'|trans, 'news.title') }}</th>
|
||||
<th>{{ knp_pagination_sortable(pagination, 'Introduction'|trans, 'news.introduction') }}</th>
|
||||
<th>{{ knp_pagination_sortable(pagination, 'Sortdate'|trans, 'news.sortDate') }}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for news in pagination %}
|
||||
<tr {% if loop.index is odd %}class="color"{% endif %}>
|
||||
<td>{{ news.uid }}</td>
|
||||
<td>{% if news.enable %}<span class="badge bg-success">{{'yes'|trans}}</span>{% else %}<span
|
||||
class="badge bg-warning">{{'no'|trans}}</span>{% endif %}</td>
|
||||
<td>{{ news.title }}</td>
|
||||
<td>{{ news.introduction }}</td>
|
||||
<td>{{ news.sortDate|date('d.m.Y') }}</td>
|
||||
<td class="text-end">
|
||||
<a href="{{ path("psc_shop_news_backend_edit", {uid: news.uid}) }}"
|
||||
class="btn btn-info btn-sm"><span class="fa fa-edit"></span></a>
|
||||
<a href="{{ path("psc_shop_news_backend_delete", {uid: news.uid}) }}"
|
||||
class="btn btn-danger btn-sm"><span class="fa fa-trash"></span></a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="">
|
||||
<div class="w-full grid grid-cols-4 border-t border-stroke px-4 bg-slate-100 py-4.5 dark:border-strokedark sm:grid-cols-8 md:px-6 2xl:px-7.5">
|
||||
<div class="hidden sm:flex col-span-1 px-6 py-3">
|
||||
{{ knp_pagination_sortable(pagination, 'Uid'|trans, 'news.uid') }}
|
||||
</div>
|
||||
<div class="col-span-1 px-6 py-3">{{ knp_pagination_sortable(pagination, 'active'|trans, 'news.enable') }}</div>
|
||||
<div class="col-span-2 px-6 py-3">{{ knp_pagination_sortable(pagination, 'Name'|trans, 'news.title') }}</div>
|
||||
<div class="hidden sm:flex sm:col-span-2 px-6 py-3">{{ knp_pagination_sortable(pagination, 'Introduction'|trans, 'news.introduction') }}</div>
|
||||
<div class="hidden sm:flex col-span-1 px-6 py-3">{{ knp_pagination_sortable(pagination, 'Sortdate'|trans, 'news.sortDate') }}</div>
|
||||
<div class="col-span-1 px-6 py-3"></div>
|
||||
</div>
|
||||
{% for news in pagination %}
|
||||
<div class="w-full grid grid-cols-4 border-t border-stroke px-4 py-4.5 dark:border-strokedark sm:grid-cols-8 md:px-6 2xl:px-7.5">
|
||||
<div class="hidden sm:flex col-span-1 px-6 py-3">{{ news.uid }}</div>
|
||||
<div class="col-span-1 px-6 py-3">{% if news.enable %}<span class="badge-yes">{{'yes'|trans}}</span>{% else %}<span
|
||||
class="badge-no">{{'no'|trans}}</span>{% endif %}</div>
|
||||
<div class="col-span-2 px-6 py-3">{{ news.title }}</div>
|
||||
<div class="hidden sm:flex sm:col-span-2 px-6 py-3">{{ news.introduction }}</div>
|
||||
<div class="hidden sm:flex col-span-1 px-6 py-3">{{ news.sortDate|date('d.m.Y') }}</div>
|
||||
<div class="col-span-1 px-6 py-3 text-end">
|
||||
<a href="{{ path("psc_shop_news_backend_edit", {uid: news.uid}) }}"
|
||||
class="btn btn-info btn-sm"><span class="fa fa-edit"></span></a>
|
||||
<a href="{{ path("psc_shop_news_backend_delete", {uid: news.uid}) }}"
|
||||
class="btn btn-danger btn-sm"><span class="fa fa-trash"></span></a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="navigation">
|
||||
{{ knp_pagination_render(pagination) }}
|
||||
</div>
|
||||
|
||||
@ -28,7 +28,7 @@ Logo2: Logo 2
|
||||
subtitle: Untertitel
|
||||
Private: Privat
|
||||
Registrationpossible: Registrierung möglich
|
||||
Withoutactivation: Ohne Freischaltung
|
||||
Withoutactivation: Ohne E-Mail Verifizierung
|
||||
Productoverview: Produktübersicht
|
||||
productsorting: Produktsortierung
|
||||
Keywords: Keywords
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
{% endblock %}
|
||||
|
||||
</head>
|
||||
<body class="min-h-screen bg-gray-100 text-gray-900 overflow-y-auto">
|
||||
<body class="min-h-screen bg-slate-50 text-gray-900 overflow-y-auto">
|
||||
<div class="flex items-center justify-center min-h-screen bg-gray-100 text-gray-900 py-12 psc-login-page">
|
||||
{% block body %}
|
||||
{% endblock %}
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body class="min-h-screen bg-gray-100 text-gray-900 overflow-y-auto dark:text-gray-100 dark:bg-gray-900">
|
||||
<body class="min-h-screen bg-slate-100 text-gray-900 overflow-y-auto dark:text-gray-100 dark:bg-gray-900 antialiased">
|
||||
<div class="flex h-full w-full overflow-x-clip">
|
||||
<div x-data x-show="$store.sideBar.isOpen" x-transition.opacity.500ms="" @click="$store.sideBar.close()" class="fixed inset-0 z-20 w-full h-full bg-gray-900/50 lg:hidden"></div>
|
||||
<aside x-data :class="$store.sideBar.isOpen ? 'translate-x-0 max-w-[20em] shadow-2xl lg:max-w-[var(--sidebar-width)]' : '-translate-x-full lg:translate-x-0 lg:max-w-[var(--collapsed-sidebar-width)] lg:shadow-2xl rtl:lg:-translate-x-0 rtl:translate-x-full'" class="fixed inset-y-0 left-0 z-20 flex h-screen flex-col overflow-hidden w-[var(--sidebar-width)] bg-white transition-all rtl:left-auto rtl:right-0 lg:z-0 lg:border-r rtl:lg:border-l rtl:lg:border-r-0 dark:bg-gray-800 dark:border-gray-700 -translate-x-full lg:translate-x-0 lg:shadow-2xl rtl:lg:-translate-x-0 rtl:translate-x-full">
|
||||
@ -126,7 +126,7 @@
|
||||
</header>
|
||||
|
||||
<div class="flex-1 w-full px-4 mx-auto md:px-6 lg:px-8 {% block containerdiv %}{% endblock %}">
|
||||
<header class="filament-header space-y-2 items-start justify-between sm:flex sm:space-y-0 sm:space-x-4 sm:rtl:space-x-reverse sm:py-4">
|
||||
<header class="filament-header space-y-2 items-start justify-between sm:flex sm:space-y-0 sm:space-x-4 sm:rtl:space-x-reverse py-4">
|
||||
{% block header %}
|
||||
{% endblock %}
|
||||
</header>
|
||||
|
||||
@ -8,6 +8,7 @@ use OpenApi\Attributes\JsonContent;
|
||||
use OpenApi\Attributes\RequestBody;
|
||||
use OpenApi\Attributes\Response;
|
||||
use OpenApi\Attributes\Tag;
|
||||
use PSC\Shop\EntityBundle\Entity\Contact as PSCContact;
|
||||
use Plugin\Custom\PSC\CollectLayouter\Dto\Save\Input;
|
||||
use Plugin\Custom\PSC\CollectLayouter\Model\Setting;
|
||||
use PSC\Shop\ContactBundle\Transformer\Model\Contact;
|
||||
@ -86,4 +87,59 @@ class Update extends AbstractController
|
||||
return $this->json(['success' => true]);
|
||||
}
|
||||
|
||||
#[Route(path: '/updatecollect/{uuid}/{layouterUuid}/{contactUuid}', methods: ['PUT'])]
|
||||
#[ParamConverter('data', class: Input::class, converter: 'psc_rest.request_body')]
|
||||
#[Tag('Plugin/Custom/PSC/CollectLayouter')]
|
||||
#[RequestBody(description: 'content', content: new JsonContent(ref: Input::class))]
|
||||
#[Response(response: 200, description: 'save config in session', content: new JsonContent(type: 'bool'))]
|
||||
public function updateCollect(Input $data, string $uuid, string $layouterUuid, string $contactUuid): JsonResponse
|
||||
{
|
||||
|
||||
$product = $this->entityManager->getRepository(Product::class)->findOneBy(['uuid' => $uuid]);
|
||||
|
||||
$productDoc = $this->documentManager->getRepository(\PSC\Shop\EntityBundle\Document\Product::class)->findOneBy(['uid' => $product->getUID()]);
|
||||
$setting = $this->serializer->deserialize($productDoc->getPluginSettingModule('collectlayouter', 'config') ?? '{}', Setting::class, 'json');
|
||||
$contactEntity = $this->entityManager->getRepository(PSCContact::class)->findOneBy(['uuid' => $contactUuid]);
|
||||
$contact = new \PSC\Shop\ContactBundle\Model\Contact();
|
||||
$this->contactTransformer->fromDb($contact, $contactEntity);
|
||||
|
||||
$this->saveFilesHelper->setSetting($setting);
|
||||
$this->saveFilesHelper->setContact($contact);
|
||||
$this->saveFilesHelper->setData($data);
|
||||
|
||||
$this->saveFilesHelper->storeFiles();
|
||||
|
||||
if ($contact->getUuid() != "") {
|
||||
$this->saveContactHelper->setSetting($setting);
|
||||
$this->saveContactHelper->setContact($contact);
|
||||
$this->saveContactHelper->setData($data);
|
||||
$this->saveContactHelper->saveData();
|
||||
}
|
||||
|
||||
$layoutDesignData = $this->entityManager
|
||||
->getRepository('PSC\Shop\EntityBundle\Entity\Layoutdesigndata')->findOneBy(array('uuid' => $layouterUuid));
|
||||
|
||||
$layoutDesignData->setDesign(['data' => $data->getData(), 'contactUuid' => $data->getContactUuid(), 'pdf' => $this->saveFilesHelper->getPdfFile(), 'previews' => $this->saveFilesHelper->getImages()]);
|
||||
|
||||
$this->entityManager->persist($layoutDesignData);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$layouterSession = $this->entityManager->getRepository(LayouterSession::class)->findOneBy(['uuid' => $layouterUuid]);
|
||||
|
||||
$layouterDesignDataDoc = $this->documentManager->getRepository(\PSC\Shop\EntityBundle\Document\LayouterSession::class)
|
||||
->findOneBy(['uid' => $layouterSession->getUID()]);
|
||||
|
||||
if (!$layouterDesignDataDoc) {
|
||||
$layouterDesignDataDoc = new \PSC\Shop\EntityBundle\Document\LayouterSession();
|
||||
$layouterDesignDataDoc->setUid((string)$layoutDesignData->getUID());
|
||||
}
|
||||
$layouterDesignDataDoc->setKst($data->getKst());
|
||||
$layouterDesignDataDoc->setRef($data->getRef());
|
||||
|
||||
$this->documentManager->persist($layouterDesignDataDoc);
|
||||
$this->documentManager->flush();
|
||||
|
||||
return $this->json(['success' => true]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -85,11 +85,8 @@ class DesignerController extends AbstractController
|
||||
->getRepository('PSC\Shop\EntityBundle\Document\Product')
|
||||
->findOneBy(array('uid' => (string)$product->getUid()));
|
||||
|
||||
$token = null;
|
||||
if ($contactUuid) {
|
||||
$user = $contactRepository->findOneBy(['uuid' => $contactUuid]);
|
||||
$token = $JWTTokenManager->create($this->getUser());
|
||||
}
|
||||
$token = $JWTTokenManager->create($this->getUser());
|
||||
|
||||
/** @var Setting $settings */
|
||||
$settings = $this->serializer->deserialize($productDoc->getPluginSettingModule('collectlayouter', 'config') ?? '{}', Setting::class, 'json');
|
||||
return [
|
||||
@ -103,6 +100,41 @@ class DesignerController extends AbstractController
|
||||
];
|
||||
}
|
||||
|
||||
#[Template()]
|
||||
#[Route('/loadcollect/{productId}/{layouterId}', name: 'plugin_custom_psc_collectlayouter_loadcollect', defaults: ['contactUuid' => ''])]
|
||||
public function loadCollect(ContactRepository $contactRepository, \PSC\Shop\ContactBundle\Transformer\Model\Contact $contactTransformer, JWTTokenManagerInterface $JWTTokenManager, string $productId, string $layouterId)
|
||||
{
|
||||
|
||||
/** @var \Plugin\Custom\PSC\Pitchprint\Controller\Frontend\Product $product */
|
||||
$product = $this->entityManager
|
||||
->getRepository('PSC\Shop\EntityBundle\Entity\Product')
|
||||
->findOneBy(array('uuid' => $productId));
|
||||
|
||||
|
||||
/** @var \PSC\Shop\EntityBundle\Document\Product $productDoc */
|
||||
$productDoc = $this->documentManager
|
||||
->getRepository('PSC\Shop\EntityBundle\Document\Product')
|
||||
->findOneBy(array('uid' => (string)$product->getUid()));
|
||||
|
||||
|
||||
/** @var Setting $settings */
|
||||
$settings = $this->serializer->deserialize($productDoc->getPluginSettingModule('collectlayouter', 'config') ?? '{}', Setting::class, 'json');
|
||||
$layoutDesignData = $this->entityManager
|
||||
->getRepository('PSC\Shop\EntityBundle\Entity\Layoutdesigndata')->findOneBy(array('uuid' => $layouterId));
|
||||
|
||||
$token = $JWTTokenManager->create($this->getUser());
|
||||
|
||||
return [
|
||||
'product' => $product,
|
||||
'productDoc' => $productDoc,
|
||||
'contactUuid' => $layoutDesignData->getDesign()['contactUuid'],
|
||||
'settings' => $settings,
|
||||
'jwt' => $token ?: '',
|
||||
'layouterId' => $layouterId,
|
||||
'data' => $layoutDesignData->getDesign()['data']
|
||||
];
|
||||
}
|
||||
|
||||
#[Template()]
|
||||
#[Route('/load/{productId}/{layouterId}/{contactUuid}', name: 'plugin_custom_psc_collectlayouter_load', defaults: ['contactUuid' => ''])]
|
||||
public function load(ContactRepository $contactRepository, \PSC\Shop\ContactBundle\Transformer\Model\Contact $contactTransformer, JWTTokenManagerInterface $JWTTokenManager, string $productId, string $layouterId, string $contactUuid = "")
|
||||
|
||||
@ -495,7 +495,6 @@
|
||||
var $group = $('<div class="input-group input-group-sm"></div>');
|
||||
}
|
||||
var $groupText = $('<div class="input-group-text"></div>');
|
||||
var $check = $('<input class="form-check-input mt-0" type="hidden" name="data[' + element.id + '][enable]" value="0">');
|
||||
|
||||
var $message = $('<div class="required hidden text-lime-700">Ist ein Pflichfeld </div>');
|
||||
|
||||
@ -503,7 +502,6 @@
|
||||
if(element.required) {
|
||||
$message.appendTo($group);
|
||||
}
|
||||
//$check.appendTo($container);
|
||||
$label.appendTo($container);
|
||||
$group.appendTo($col);
|
||||
$col.appendTo($container);
|
||||
|
||||
@ -444,7 +444,6 @@
|
||||
var $group = $('<div class="input-group input-group-sm"></div>');
|
||||
}
|
||||
var $groupText = $('<div class="input-group-text"></div>');
|
||||
var $check = $('<input class="form-check-input mt-0" type="hidden" name="data[' + element.id + '][enable]" value="1">');
|
||||
|
||||
var $message = $('<div class="required hidden text-lime-700">Ist ein Pflichfeld </div>');
|
||||
|
||||
@ -452,7 +451,6 @@
|
||||
if(element.required) {
|
||||
$message.appendTo($group);
|
||||
}
|
||||
$check.appendTo($container);
|
||||
$label.appendTo($container);
|
||||
$group.appendTo($col);
|
||||
$col.appendTo($container);
|
||||
|
||||
@ -0,0 +1,733 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
|
||||
<title>{{ product.title }}</title>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.2/cropper.js" integrity="sha512-lR8d1BXfYQuiqoM/LeGFVtxFyspzWFTZNyYIiE5O2CcAGtTCRRUMLloxATRuLz8EmR2fYqdXYlrGh+D6TVGp3g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.2/cropper.css" integrity="sha512-087vysR/jM0N5cp13Vlp+ZF9wx6tKbvJLwPO8Iit6J7R+n7uIMMjg37dEgexOshDmDITHYY5useeSmfD1MYiQA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
{% if shopService.getShopByDomainModel().browsericon %}
|
||||
<link rel="shortcut icon" type="image/x-icon" href="{{ shopService.getShopByDomainModel().browsericon|fileWeb }}"/>
|
||||
{% else %}
|
||||
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
|
||||
{% endif %}
|
||||
<style>
|
||||
.modal {
|
||||
transition: opacity 0.25s ease;
|
||||
}
|
||||
body.modal-active {
|
||||
overflow-x: hidden;
|
||||
overflow-y: visible !important;
|
||||
}
|
||||
.opacity-95 {opacity: .95;}
|
||||
|
||||
.cropRounded {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.cropFace {
|
||||
outline: 0;
|
||||
box-shadow: 0 0 0 1px #39f;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="w-screen h-screen flex flex-col">
|
||||
<div class="absolute bg-white bg-opacity-60 z-10 h-full w-full flex items-center justify-center loadingScreen" >
|
||||
<div class="flex items-center">
|
||||
<span class="text-3xl mr-4">Loading</span>
|
||||
<svg class="animate-spin h-8 w-8 text-gray-800" xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 24 24">
|
||||
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
||||
<path class="opacity-75" fill="currentColor"
|
||||
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">
|
||||
</path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-screen h-screen flex flex-col">
|
||||
<div class="flex flex-row bg-gray-100 sticky top-0 mb-2 p-1">
|
||||
<a class="basis-1/3 pl-1 font-bold text-2xl">{{ product.title }}</a>
|
||||
<div class="basis-1/3 text-center">
|
||||
{% if contactUuid and settings.downloadInReview %}<a class="bg-cyan-500 hover:bg-gray-100 text-gray-800 font-semibold py-2 px-4 rounded shadow" target="_blank" href="{{ path('plugin_custom_psc_collectlayouter_preview', {uuid: product.uuid, contact: contactUuid}) }}">PDF Preview</a>{% endif %}
|
||||
{% if contactUuid and settings.downloadPrintInReview %}<a class="bg-cyan-500 hover:bg-gray-100 text-gray-800 font-semibold py-2 px-4 rounded shadow" target="_blank" href="{{ path('plugin_custom_psc_collectlayouter_preview', {uuid: product.uuid, contact: contactUuid, type: 2}) }}">PDF Print Preview</a>{% endif %}
|
||||
</div>
|
||||
<div class="basis-1/3 text-right pr-1">
|
||||
<a class="bg-yellow-500 hover:bg-gray-100 text-gray-800 font-semibold py-2 px-4 rounded shadow href="/article/show/uuid/{{ product.uuid }}">Abbrechen & Zurück</a>
|
||||
<button class="bg-lime-500 hover:bg-gray-100 text-gray-800 font-semibold py-2 px-4 rounded shadow finish" type="button">Speichern & Weiter</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex overflow-hidden">
|
||||
<div class="md:flex-1 h-full overflow-y-auto m-1"><form id="customerForm" class="needs-validation" novalidate></form></div>
|
||||
<div class="md:flex-1 h-full overflow-y-auto m-1"><div class="previews"></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<!--Modal-->
|
||||
<div id="cropperModal" class="modal opacity-0 pointer-events-none fixed w-full h-full top-0 left-0 flex items-center justify-center">
|
||||
<div class="modal-overlay absolute w-full h-full bg-white opacity-95"></div>
|
||||
<div class="modal-container fixed w-full h-full z-50 overflow-y-auto ">
|
||||
|
||||
<div class="modal-close absolute top-0 right-0 cursor-pointer flex flex-col items-center mt-4 mr-4 text-black text-sm z-50">
|
||||
<svg class="fill-current text-black" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18">
|
||||
<path d="M14.53 4.53l-1.06-1.06L9 7.94 4.53 3.47 3.47 4.53 7.94 9l-4.47 4.47 1.06 1.06L9 10.06l4.47 4.47 1.06-1.06L10.06 9z"></path>
|
||||
</svg>
|
||||
(Esc)
|
||||
</div>
|
||||
|
||||
<!-- Add margin if you want to see grey behind the modal-->
|
||||
<div class="modal-content container flex flex-col mx-auto h-full text-left p-4">
|
||||
|
||||
<div class="cropper-container h-full"></div>
|
||||
|
||||
<div class="flex justify-end pt-2">
|
||||
<button class="actionCrop px-4 bg-lime-500 p-3 rounded-lg text-white mr-2">Zuschneiden</button>
|
||||
<button class="modal-close px-4 bg-indigo-500 p-3 rounded-lg text-white ">Schließen</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
{% autoescape 'js' %}
|
||||
<script>
|
||||
var productUUId = "{{product.uuid}}";
|
||||
var contactUuid = "{{contactUuid}}";
|
||||
var layouterUuid = "{{ layouterId }}";
|
||||
var data = [];
|
||||
var continueOnlyValidated = {% if settings.continueOnlyValidated %}true{% else %}false{% endif %};
|
||||
var ref = "";
|
||||
var cropper = null;
|
||||
var cropElementId = null;
|
||||
var cropMode = 1;
|
||||
var ref = "";
|
||||
var actModalId = "";
|
||||
{% for item in data %}
|
||||
data['{{ item.name|raw }}'] = "{{ item.value }}";
|
||||
{% endfor %}
|
||||
|
||||
$(function() {
|
||||
buildCustomerForm();
|
||||
|
||||
$('.finish').click(function() {
|
||||
$('.loadingScreen').removeClass('hidden');
|
||||
$('.pleasewait').html('Bitte Warten');
|
||||
if($('#firstname').length > 0) {
|
||||
ref = $('#firstname').val();
|
||||
}
|
||||
if($('#lastname').length > 0) {
|
||||
ref = ref + ' ' + $('#lastname').val();
|
||||
}
|
||||
var arr = $("#customerForm").serializeArray();
|
||||
$.each($("input:checkbox:not(:checked)"), function(i, e) {
|
||||
arr.push({name: e.name, value: "0"});
|
||||
});
|
||||
$.ajax({
|
||||
method: 'PUT',
|
||||
url: '/apps/api/plugin/custom/psc/collectlayouter/updatecollect/' + productUUId + '/' + layouterUuid + (contactUuid? '/' + contactUuid:''),
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({
|
||||
layouterUuid: layouterUuid,
|
||||
productUuid: productUUId,
|
||||
contactUuid: contactUuid,
|
||||
data: arr,
|
||||
ref: ref,
|
||||
}),
|
||||
headers: {
|
||||
"Authorization": "Bearer {{jwt}}"
|
||||
},
|
||||
success: function (result_save) {
|
||||
window.parent.document.location.href = "/article/show/uuid/{{ product.uuid }}/" + layouterUuid + "?uploadModule=collectlayouter";
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function delay(fn, ms) {
|
||||
let timer = 0
|
||||
return function(...args) {
|
||||
clearTimeout(timer)
|
||||
timer = setTimeout(fn.bind(this, ...args), ms || 0)
|
||||
}
|
||||
}
|
||||
|
||||
function buildCustomerForm() {
|
||||
|
||||
$('#customerForm').html('');
|
||||
$.ajax({
|
||||
url: "/apps/api/plugin/custom/psc/collectlayouter/form/" + productUUId + (contactUuid? '/' + contactUuid:''),
|
||||
contentType: "application/json",
|
||||
headers: {
|
||||
"Authorization": "Bearer {{ jwt }}"
|
||||
},
|
||||
method: 'PUT',
|
||||
data: JSON.stringify({}),
|
||||
success: function(result) {
|
||||
$.each(result, function(i, element) {
|
||||
var $label = $('<label class="md:basis-1/3 p-3">').text(element.label);
|
||||
var $container = $('<div class="flex flex-row mb-1" id="container_' + element.id + '"></div>');
|
||||
|
||||
var $obj = $('<div/>', { class: 'flex flex-row'});
|
||||
if(element.optional) {
|
||||
if(element.optionalDefault) {
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" checked value="1">');
|
||||
}else{
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" value="1">');
|
||||
}
|
||||
$obj.append($check);
|
||||
}
|
||||
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default1,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
name: 'data[' + element.id + '][value]'
|
||||
}));
|
||||
|
||||
if(element.type == 1) {
|
||||
var $obj = $('<div/>', { class: 'flex flex-row'});
|
||||
if(element.optional) {
|
||||
if(element.optionalDefault) {
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" checked value="1">');
|
||||
}else{
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" value="1">');
|
||||
}
|
||||
$obj.append($check);
|
||||
}
|
||||
|
||||
var $elm = $('<input>', {
|
||||
type: 'email',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default1,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
name: 'data[' + element.id + '][value]'
|
||||
});
|
||||
|
||||
$obj.append($elm);
|
||||
}
|
||||
|
||||
if(element.type == 3) {
|
||||
var $obj = $('<div/>', { class: 'flex flex-row'});
|
||||
|
||||
if(element.optional) {
|
||||
if(element.optionalDefault) {
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" checked value="1">');
|
||||
}else{
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" value="1">');
|
||||
}
|
||||
$obj.append($check);
|
||||
}
|
||||
|
||||
if(!element.phone.displayAreaCode) {
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default1,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
disabled: element.phone.fixAreaCode,
|
||||
name: 'data[' + element.id + '][value][areacode]'
|
||||
}));
|
||||
}
|
||||
|
||||
if(!element.phone.displayPrefix) {
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default2,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
disabled: element.phone.fixPrefix,
|
||||
name: 'data[' + element.id + '][value][prefix]'
|
||||
}));
|
||||
}
|
||||
|
||||
if(!element.phone.displayNumber) {
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default3,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
disabled: element.phone.fixNumber,
|
||||
name: 'data[' + element.id + '][value][number]'
|
||||
}));
|
||||
}
|
||||
|
||||
if(!element.phone.displayAppendix) {
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default4,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
disabled: element.phone.fixAppendix,
|
||||
name: 'data[' + element.id + '][value][appendix]'
|
||||
}));
|
||||
}
|
||||
}
|
||||
if(element.type == 4) {
|
||||
|
||||
var $uploadFieldData = $('<input>', {
|
||||
value: element.default1,
|
||||
name: 'data[' + element.id + '][value]',
|
||||
id: element.id,
|
||||
type: 'hidden'
|
||||
}).data('folder', element.image.mediaFolder).data('cropMode', element.image.cropMode).data('aspectRatio', element.image.aspectRatio).data('element', element.id).attr('data-element', element.id);
|
||||
|
||||
var $uploadField = $('<input>', {
|
||||
type: 'file',
|
||||
id: 'uploadfield-' + element.id,
|
||||
class: 'block w-full text-xs text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 upload',
|
||||
}).attr('data-element', element.id).data('element', element.id);
|
||||
;
|
||||
|
||||
var $uploadButton = $('<button>', {
|
||||
class: 'px-3 py-2 text-xs font-medium text-center text-black bg-gray-300 rounded-lg hover:text-white hover:bg-gray-800 focus:ring-4 focus:outline-none focus:ring-blue-300 upload',
|
||||
type: 'button',
|
||||
}).html('Hochladen').data('element', element.id);
|
||||
|
||||
var $uploadCropButton = $('<button>', {
|
||||
class: 'px-3 py-2 text-xs font-medium text-center text-black bg-gray-300 rounded-lg hover:text-white hover:bg-gray-800 focus:ring-4 focus:outline-none focus:ring-blue-300 cropButton',
|
||||
type: 'button',
|
||||
}).html('Crop').data('element', element.id);
|
||||
|
||||
|
||||
var $uploadGroup = $('<div/>', {
|
||||
class: 'flex flex-col gap-1'
|
||||
});
|
||||
|
||||
$uploadGroup.append($uploadFieldData);
|
||||
$uploadGroup.append($uploadField);
|
||||
$uploadGroup.append($uploadButton);
|
||||
if(element.image.cropAllowed) {
|
||||
$uploadGroup.append($uploadCropButton);
|
||||
}
|
||||
var $uploadDiv = $('<div/>', {
|
||||
class: 'flex-1 mr-1'
|
||||
});
|
||||
|
||||
$uploadDiv.append($uploadGroup);
|
||||
|
||||
var $previewField = $('<div/>', {
|
||||
class: 'flex-1 upload-preview preview-' + element.id
|
||||
});
|
||||
if(element.image.url != "" ) {
|
||||
$img = $('<img/>', {
|
||||
src: element.image.url,
|
||||
width: '100%',
|
||||
class: 'uploaded',
|
||||
id: 'preview-' + element.id
|
||||
});
|
||||
$previewField.append($img);
|
||||
$uploadFieldData.data('title', element.image.title);
|
||||
}
|
||||
var $variantPreviewField = $('<div/>', {
|
||||
class: 'flex-1 upload-variant variant-' + element.id
|
||||
});
|
||||
if(element.image.variantUrl != "" ) {
|
||||
$img = $('<img/>', {
|
||||
src: element.image.variantUrl,
|
||||
width: '100%',
|
||||
class: 'uploaded',
|
||||
id: 'preview-variant-' + element.id
|
||||
});
|
||||
$variantPreviewField.append($img);
|
||||
}
|
||||
var $obj = $('<div/>', {
|
||||
class: 'flex uploader-' + element.id
|
||||
});
|
||||
|
||||
$obj.append($uploadDiv);
|
||||
$obj.append($previewField);
|
||||
$obj.append($variantPreviewField);
|
||||
}
|
||||
|
||||
if(element.type == 5) {
|
||||
var $obj = $('<div/>', { class: 'flex flex-row'});
|
||||
|
||||
if(element.optional) {
|
||||
if(element.optionalDefault) {
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" checked value="1">');
|
||||
}else{
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" value="1">');
|
||||
}
|
||||
$obj.append($check);
|
||||
}
|
||||
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default1,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
name: 'data[' + element.id + '][value][street]'
|
||||
}));
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default2,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
name: 'data[' + element.id + '][value][houseNumber]'
|
||||
}));
|
||||
}
|
||||
|
||||
if(element.type == 6) {
|
||||
var $obj = $('<div/>', { class: 'flex flex-row'});
|
||||
|
||||
if(element.optional) {
|
||||
if(element.optionalDefault) {
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" checked value="1">');
|
||||
}else{
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" value="1">');
|
||||
}
|
||||
$obj.append($check);
|
||||
}
|
||||
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default1,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
name: 'data[' + element.id + '][value][zip]'
|
||||
}));
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default2,
|
||||
required: element.required,
|
||||
id: element.id,
|
||||
name: 'data[' + element.id + '][value][city]'
|
||||
}));
|
||||
}
|
||||
if(element.type == 7) {
|
||||
var $obj = $('<div/>', { class: 'flex flex-row'});
|
||||
|
||||
if(element.optional) {
|
||||
if(element.optionalDefault) {
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" checked value="1">');
|
||||
}else{
|
||||
var $check = $('<input class="m-1" name="data[' + element.id + '][enable]" type="checkbox" value="1">');
|
||||
}
|
||||
$obj.append($check);
|
||||
}
|
||||
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: element.default2,
|
||||
id: element.id,
|
||||
required: element.required,
|
||||
name: 'data[' + element.id + '][value]'
|
||||
}));
|
||||
$obj.append($('<input>', {
|
||||
type: 'text',
|
||||
class: 'bg-gray-100 p-1 border w-full',
|
||||
value: '@' + element.default3,
|
||||
disabled: true,
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
var $col = $('<div class="md:basis-2/3"></div>');
|
||||
if(element.type == 4) {
|
||||
var $group = $('<div class=""></div>');
|
||||
} else {
|
||||
var $group = $('<div class="input-group input-group-sm"></div>');
|
||||
}
|
||||
var $groupText = $('<div class="input-group-text"></div>');
|
||||
|
||||
var $message = $('<div class="required hidden text-lime-700">Ist ein Pflichfeld </div>');
|
||||
|
||||
$($obj).appendTo($group);
|
||||
if(element.required) {
|
||||
$message.appendTo($group);
|
||||
}
|
||||
$label.appendTo($container);
|
||||
$group.appendTo($col);
|
||||
$col.appendTo($container);
|
||||
|
||||
$('#customerForm').append($container);
|
||||
});
|
||||
$("#customerForm input").keyup(() => {
|
||||
const event = new Event('submit', {
|
||||
'bubbles': true,
|
||||
'cancelable': true
|
||||
});
|
||||
document.getElementById('customerForm').dispatchEvent( event );
|
||||
});
|
||||
$("#customerForm input").not('.upload').change(delay(function() {
|
||||
preview();
|
||||
}, 2000));
|
||||
|
||||
const form = document.querySelector('.needs-validation');
|
||||
form.addEventListener('submit', (event) => {
|
||||
document.querySelectorAll('input').forEach(function(item) { $(item).removeClass('border-red-500') })
|
||||
if (!form.checkValidity()) {
|
||||
if(continueOnlyValidated) {
|
||||
document.querySelectorAll('input:invalid').forEach(function(item) { $(item).addClass('border-red-500') })
|
||||
$('.finish').prop('disabled', true);
|
||||
$('.save').prop('disabled', true);
|
||||
}
|
||||
}else{
|
||||
$('.finish').prop('disabled', false);
|
||||
$('.save').prop('disabled', false);
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
form.classList.add('was-validated');
|
||||
}, false);
|
||||
|
||||
preview();
|
||||
bindImageUploaderFiles();
|
||||
bindCropper();
|
||||
$('.loadingScreen').addClass("hidden");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function preview() {
|
||||
$('.previews').html('<h5 class="bg-info" >Loading</h5>');
|
||||
var arr = $("#customerForm").serializeArray();
|
||||
$.each($("input:checkbox:not(:checked)"), function(i, e) {
|
||||
arr.push({name: e.name, value: "0"});
|
||||
});
|
||||
|
||||
var cont = "";
|
||||
if(contactUuid != "") {
|
||||
cont = '/' + contactUuid;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/apps/api/plugin/custom/psc/collectlayouter/preview/" + productUUId + '/1' + cont,
|
||||
contentType: "application/json",
|
||||
headers: {
|
||||
"Authorization": "Bearer {{jwt}}"
|
||||
},
|
||||
method: 'PUT',
|
||||
data: JSON.stringify({
|
||||
data: arr
|
||||
}),
|
||||
success: function(result) {
|
||||
$('.previews').html('');
|
||||
$.each(result, function(i, v) {
|
||||
$('.previews')
|
||||
.append('<img class="rounded border m-2 w-100" id="preview_' + i + '" src="data:image/jpeg;base64, ' + v +'"/><br/>');
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function bindImageUploaderFiles() {
|
||||
$("button.upload").click(function () {
|
||||
var elementId = $(this).data('element');
|
||||
var $elm = $('#' + elementId);
|
||||
const file = document.querySelector("#uploadfield-" + elementId);
|
||||
sendFile($elm.data('element'), file.files[0], $elm.data('folder'), () => {});
|
||||
});
|
||||
|
||||
$("input.upload").change(function () {
|
||||
$('#' + $(this).data('element')).val('');
|
||||
filePreview(this);
|
||||
});
|
||||
}
|
||||
|
||||
function bindCropper() {
|
||||
|
||||
$('.cropButton').click(function() {
|
||||
cropElementId = $(this).data('element');
|
||||
var $elm = $('#' + cropElementId);
|
||||
|
||||
cropMode = $elm.data('cropMode');
|
||||
|
||||
$('#cropperModal .cropper-container').html('');
|
||||
|
||||
var $img = $('<img/>', {
|
||||
id: 'cropperImage',
|
||||
src: $('#preview-' + $elm.data('element')).attr('src')
|
||||
});
|
||||
|
||||
$('#cropperModal .cropper-container').append($img);
|
||||
|
||||
var options = {
|
||||
viewMode: 1,
|
||||
autoCropArea: 0.5
|
||||
};
|
||||
|
||||
if ($elm.data('aspectRatio') != "") {
|
||||
options['aspectRatio'] = eval($elm.data('aspectRatio'));
|
||||
}
|
||||
if ($elm.data('cropMode') == 2) {
|
||||
options['aspectRatio'] = 1;
|
||||
}
|
||||
|
||||
actModalId = 'cropperModal';
|
||||
toggleModal();
|
||||
|
||||
document.querySelector('#cropperImage').onload = imgOnloadEvent(options);
|
||||
});
|
||||
$('.actionCrop').click(function() {
|
||||
$elm = $('#' + cropElementId);
|
||||
if(cropMode == 2) {
|
||||
croppedCanvas = getRoundedCanvas(cropper.getCroppedCanvas());
|
||||
}else{
|
||||
croppedCanvas = cropper.getCroppedCanvas();
|
||||
}
|
||||
|
||||
$('.variant-' + cropElementId).html('');
|
||||
$img = $('<img/>', {
|
||||
src: croppedCanvas.toDataURL(),
|
||||
width: '100%',
|
||||
class: 'uploaded',
|
||||
id: 'preview-variant-' + cropElementId
|
||||
});
|
||||
$('.variant-' + cropElementId).append($img);
|
||||
|
||||
croppedCanvas.toBlob(function (blob) {
|
||||
if($elm.val() == "") {
|
||||
const file = document.querySelector("#uploadfield-" + cropElementId);
|
||||
sendFile($elm.data('element'), file.files[0], $elm.data('folder'), () => sendVariantFile(cropElementId, $elm.data('title'), $elm.val(), blob, $elm.data('aspectRatio')));
|
||||
}else{
|
||||
sendVariantFile(cropElementId, $elm.data('title'), $elm.val(), blob, $elm.data('aspectRatio'));
|
||||
}
|
||||
toggleModal();
|
||||
}, cropMode == 2? 'image/png': 'image/jpeg');
|
||||
});
|
||||
}
|
||||
|
||||
function getRoundedCanvas(sourceCanvas) {
|
||||
var canvas = document.createElement('canvas');
|
||||
var context = canvas.getContext('2d');
|
||||
var width = sourceCanvas.width;
|
||||
var height = sourceCanvas.height;
|
||||
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
context.imageSmoothingEnabled = true;
|
||||
context.drawImage(sourceCanvas, 0, 0, width, height);
|
||||
context.globalCompositeOperation = 'destination-in';
|
||||
context.beginPath();
|
||||
context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true);
|
||||
context.fill();
|
||||
return canvas;
|
||||
}
|
||||
|
||||
function imgOnloadEvent(options) {
|
||||
options['ready'] = function() {
|
||||
if(cropMode == 2) {
|
||||
$('.cropper-view-box, .cropper-face').addClass('cropRounded');
|
||||
$('.cropper-face').addClass('cropFace');
|
||||
}
|
||||
};
|
||||
cropper = new Cropper(document.querySelector('#cropperImage'), options);
|
||||
}
|
||||
|
||||
function filePreview(input) {
|
||||
if (input.files && input.files[0]) {
|
||||
var reader = new FileReader();
|
||||
reader.onload = function (e) {
|
||||
$('.preview-' + $(input).data('element') + ' img').remove();
|
||||
$('.preview-' + $(input).data('element')).append('<img id="preview-' + $(input).data('element') + '" src="'+e.target.result+'" class=""/>');
|
||||
};
|
||||
reader.readAsDataURL(input.files[0]);
|
||||
}
|
||||
}
|
||||
|
||||
function sendVariantFile(id, title, uuid, blob, settings) {
|
||||
const uri = "/apps/api/media/variant/create";
|
||||
const xhr = new XMLHttpRequest();
|
||||
const fd = new FormData();
|
||||
|
||||
xhr.responseType = 'json';
|
||||
xhr.open("POST", uri, true);
|
||||
xhr.onreadystatechange = () => {
|
||||
var jsonResponse = xhr.response;
|
||||
if (xhr.readyState === 4 && xhr.status === 200) {
|
||||
$('#' + id).val(jsonResponse.uuid);
|
||||
preview();
|
||||
}
|
||||
};
|
||||
fd.append('settings', settings);
|
||||
fd.append('uuid', uuid);
|
||||
fd.append('file', blob, title);
|
||||
// Initiate a multipart/form-data upload
|
||||
xhr.send(fd);
|
||||
}
|
||||
|
||||
function sendFile(id, file, folder, variantFunc) {
|
||||
const uri = "/apps/api/media/create";
|
||||
const xhr = new XMLHttpRequest();
|
||||
const fd = new FormData();
|
||||
|
||||
xhr.responseType = 'json';
|
||||
xhr.open("POST", uri, true);
|
||||
xhr.onreadystatechange = () => {
|
||||
var jsonResponse = xhr.response;
|
||||
if (xhr.readyState === 4 && xhr.status === 200) {
|
||||
$('#' + id).val(jsonResponse.uuid);
|
||||
if(jsonResponse.url != "") {
|
||||
$img = $('<img/>', {
|
||||
src: jsonResponse.url,
|
||||
width: '100%',
|
||||
class: 'h-full border rounded m-2 uploaded',
|
||||
id: 'preview-' + id
|
||||
});
|
||||
$('.preview-' + id).html('');
|
||||
$('.preview-' + id).append($img);
|
||||
$('#' + id).data('title', jsonResponse.title);
|
||||
variantFunc();
|
||||
}
|
||||
preview();
|
||||
}
|
||||
};
|
||||
fd.append('folder', folder);
|
||||
fd.append('file', file);
|
||||
// Initiate a multipart/form-data upload
|
||||
xhr.send(fd);
|
||||
}
|
||||
|
||||
overlay = document.querySelector('.modal-overlay');
|
||||
overlay.addEventListener('click', toggleModal);
|
||||
|
||||
var closemodal = document.querySelectorAll('.modal-close')
|
||||
for (var i = 0; i < closemodal.length; i++) {
|
||||
closemodal[i].addEventListener('click', toggleModal)
|
||||
}
|
||||
|
||||
function toggleModal () {
|
||||
if(document.body.classList.contains('modal-active')) {
|
||||
if(cropper) {
|
||||
cropper.destroy();
|
||||
cropper = null;
|
||||
}
|
||||
}
|
||||
const body = document.querySelector('body')
|
||||
const modal = document.querySelector('#' + actModalId)
|
||||
modal.classList.toggle('opacity-0')
|
||||
modal.classList.toggle('pointer-events-none')
|
||||
body.classList.toggle('modal-active')
|
||||
}
|
||||
|
||||
document.onkeydown = function(evt) {
|
||||
evt = evt || window.event
|
||||
var isEscape = false
|
||||
if ("key" in evt) {
|
||||
isEscape = (evt.key === "Escape" || evt.key === "Esc")
|
||||
} else {
|
||||
isEscape = (evt.keyCode === 27)
|
||||
}
|
||||
if (isEscape && document.body.classList.contains('modal-active')) {
|
||||
toggleModal();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
{% endautoescape %}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,16 +1,17 @@
|
||||
{
|
||||
"build/backend/login.css": "/apps/build/backend/login.25156160.css",
|
||||
"build/backend/login.js": "/apps/build/backend/login.ab0272c2.js",
|
||||
"build/backend/dashboard.css": "/apps/build/backend/dashboard.f30e17f9.css",
|
||||
"build/backend/dashboard.js": "/apps/build/backend/dashboard.564e38a5.js",
|
||||
"build/backend/tailwind.css": "/apps/build/backend/tailwind.42479308.css",
|
||||
"build/backend/tailwind.js": "/apps/build/backend/tailwind.d1378a3a.js",
|
||||
"build/runtime.js": "/apps/build/runtime.44b7f9b9.js",
|
||||
"build/185.99565361.js": "/apps/build/185.99565361.js",
|
||||
"build/857.e053f864.css": "/apps/build/857.e053f864.css",
|
||||
"build/857.5473cee9.js": "/apps/build/857.5473cee9.js",
|
||||
"build/280.f481306d.js": "/apps/build/280.f481306d.js",
|
||||
"build/933.ca932d10.js": "/apps/build/933.ca932d10.js",
|
||||
"build/backend/login.css": "/apps/build/backend/login.css",
|
||||
"build/backend/login.js": "/apps/build/backend/login.js",
|
||||
"build/backend/dashboard.css": "/apps/build/backend/dashboard.css",
|
||||
"build/backend/dashboard.js": "/apps/build/backend/dashboard.js",
|
||||
"build/backend/tailwind.css": "/apps/build/backend/tailwind.css",
|
||||
"build/backend/tailwind.js": "/apps/build/backend/tailwind.js",
|
||||
"build/runtime.js": "/apps/build/runtime.js",
|
||||
"build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-a8da79.css": "/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-a8da79.css",
|
||||
"build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-a8da79.js": "/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-a8da79.js",
|
||||
"build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.css": "/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.css",
|
||||
"build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.js": "/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.js",
|
||||
"build/vendors-node_modules_alpinejs_persist_dist_module_esm_js-node_modules_alpinejs_dist_module_esm_js.js": "/apps/build/vendors-node_modules_alpinejs_persist_dist_module_esm_js-node_modules_alpinejs_dist_module_esm_js.js",
|
||||
"build/node_modules_symfony_stimulus-bridge_dist_webpack_loader_js_assets_controllers_json.js": "/apps/build/node_modules_symfony_stimulus-bridge_dist_webpack_loader_js_assets_controllers_json.js",
|
||||
"build/fonts/summernote.eot": "/apps/build/fonts/summernote.7a3f9776.eot",
|
||||
"build/fonts/summernote.ttf": "/apps/build/fonts/summernote.eb23b6b7.ttf",
|
||||
"build/fonts/summernote.woff": "/apps/build/fonts/summernote.f2bec4f2.woff",
|
||||
|
||||
@ -1011,7 +1011,6 @@ if (($this->admin && $this->role->level >= 40) && !$this->layouterPreviewId): ?>
|
||||
<?php if ($this->article->getPluginSettings('formlayouter', 'formlayouter')) : ?>
|
||||
<div style="background-color:#eeeced;margin-bottom: 10px;padding: 5px;border:1px solid rgba(0,0,0,.2)">
|
||||
<h3><?php echo $this->translate('Form Layouter') ?></h3>
|
||||
|
||||
<?php if ($this->layouterPreviewId) : /** Aufruf des Steplayouters (Steplayouter2) */ ?>
|
||||
<a class="btn pop_over btn-success btn-large" rel="#overlaystep" href="/apps/api/formlayouter/designer/load/<?= $this->article->uuid ?>/<?= $this->layouterPreviewId ?>"><?php echo $this->translate('Zum Online-Designer') ?></a>
|
||||
<?php else : ?>
|
||||
@ -1052,7 +1051,7 @@ if (($this->admin && $this->role->level >= 40) && !$this->layouterPreviewId): ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->article->getPluginSettings('collectlayouter', 'uploadCollectLayouter')) : ?>
|
||||
<?php if ( $this->article->getPluginSettings('collectlayouter', 'uploadCollectLayouter')) : ?>
|
||||
<div style="background-color:#eeeced;margin-bottom: 10px;padding: 5px;border:1px solid rgba(0,0,0,.2)">
|
||||
<h3><?php echo $this->translate('Form Based Layouter') ?></h3>
|
||||
|
||||
@ -1072,7 +1071,7 @@ if (($this->admin && $this->role->level >= 40) && !$this->layouterPreviewId): ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->article->getPluginSettings('collectlayouter', 'uploadCollectLayouterSek') && $this->user->is_sek && $this->layouterPreviewId) : ?>
|
||||
<div style="background-color:#eeeced;margin-bottom: 10px;padding: 5px;border:1px solid rgba(0,0,0,.2)">
|
||||
<a class="btn pop_over btn-success btn-large" rel="#overlaystep" href="/apps/plugin/custom/psc/collectlayouter/frontend/designer/load/<?= $this->article->uuid ?>/<?= $this->layouterPreviewId ?>/<?= $this->user->uuid ?>"><?php echo $this->translate('Zum Online-Designer') ?></a>
|
||||
<a class="btn pop_over btn-success btn-large" rel="#overlaystep" href="/apps/plugin/custom/psc/collectlayouter/frontend/designer/loadcollect/<?= $this->article->uuid ?>/<?= $this->layouterPreviewId ?>"><?php echo $this->translate('Zum Online-Designer') ?></a>
|
||||
</div><?php endif; ?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
@ -1730,4 +1729,4 @@ if (($this->admin && $this->role->level >= 40) && !$this->layouterPreviewId): ?>
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user