This commit is contained in:
Thomas 2025-01-20 19:59:22 +01:00
parent 5ba102ec56
commit e13304227d
17 changed files with 1118 additions and 170 deletions

View File

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

View File

@ -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">

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 = "")

View File

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

View File

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

View File

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

View File

@ -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",

View File

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