This commit is contained in:
Thomas Peterson 2025-04-07 09:25:56 +02:00
parent 532248c01b
commit 3c3c642042
20 changed files with 800 additions and 396 deletions

View File

@ -64,6 +64,11 @@ server {
try_files $uri @sfFront;
}
# location /w2p/ {
# proxy_pass http://tp:8080/w2p/;
# proxy_temp_path /tmp/proxy;
#}
location @sfFront { # Symfony
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';

View File

@ -25,6 +25,12 @@
"@symfony/ux-live-component/dist/live.min.css": true
}
}
},
"@symfony/ux-vue": {
"vue": {
"enabled": true,
"fetch": "eager"
}
}
},
"entrypoints": []

View File

@ -7,6 +7,8 @@ import { initTabs } from 'david-ai';
// Initialize tabs functionality
initTabs();
import { registerVueControllerComponents } from '@symfony/ux-vue';
registerVueControllerComponents()
import { startStimulusApp } from '@symfony/stimulus-bundle';
const app = startStimulusApp();
Alpine.plugin(persist)

View File

@ -0,0 +1,41 @@
/**
| Single-File Components - e.g. PackageSearch.vue -
| are supported when using Webpack Encore.
*/
import { ref, computed } from 'vue';
import PackageList from "./components/PackageList.js";
export default {
components: {
PackageList
},
props: ['news'],
setup(props) {
const search = ref('');
const filteredPackages = computed(() => {
return props.packages.filter(
uxPackage => uxPackage.humanName.toLowerCase().includes(search.value.toLowerCase())
);
});
return {
search,
filteredPackages
}
},
template: `
<div>
<input
v-model="search"
class="form-control"
type="search"
placeholder="This search is built in Vue.js!"
/>
<div class="mt-3">
PackageList
</div>
</div>
`
};

View File

@ -0,0 +1,21 @@
export default {
props: ['packages'],
template: `
<div v-if="packages.length === 0">
No packages found. Sad trombone...
</div>
<div v-else class="PackageList">
<div v-for="package in packages" class="PackageListItem">
<div class="PackageListItem__icon" :style="{'--gradient': package.gradient}">
<img :src="package.imageUrl" :alt="package.humanName">
</div>
<h4 class="PackageListItem__label">
<a :href="package.url">{{ package.humanName }}</a>
</h4>
</div>
</div>
`
};

View File

@ -94,6 +94,7 @@
"symfony/ux-chartjs": "^2.19",
"symfony/ux-live-component": "^2.12",
"symfony/ux-twig-component": "^2.12",
"symfony/ux-vue": "^2.23",
"symfony/validator": "*",
"symfony/web-link": "*",
"symfony/yaml": "*",

554
src/new/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -62,5 +62,6 @@ return [
Symfony\UX\Chartjs\ChartjsBundle::class => ['all' => true],
Symfonycasts\TailwindBundle\SymfonycastsTailwindBundle::class => ['all' => true],
Symfonycasts\SassBundle\SymfonycastsSassBundle::class => ['all' => true],
Dunglas\DoctrineJsonOdm\Bundle\DunglasDoctrineJsonOdmBundle::class => ['all' => true]
Dunglas\DoctrineJsonOdm\Bundle\DunglasDoctrineJsonOdmBundle::class => ['all' => true],
Symfony\UX\Vue\VueBundle::class => ['all' => true],
];

View File

@ -334,4 +334,52 @@ return [
'version' => '3.1.2',
'type' => 'css',
],
'vue' => [
'version' => '3.5.13',
],
'@vue/runtime-dom' => [
'version' => '3.5.13',
],
'@vue/compiler-dom' => [
'version' => '3.5.13',
],
'@vue/shared' => [
'version' => '3.5.13',
],
'@vue/runtime-core' => [
'version' => '3.5.13',
],
'@vue/compiler-core' => [
'version' => '3.5.13',
],
'@vue/reactivity' => [
'version' => '3.5.13',
],
'@symfony/ux-vue' => [
'path' => './vendor/symfony/ux-vue/assets/dist/loader.js',
],
'pinia' => [
'version' => '3.0.1',
],
'@vue/devtools-api' => [
'version' => '7.7.2',
],
'@vue/devtools-kit' => [
'version' => '7.7.2',
],
'@vue/devtools-shared' => [
'version' => '7.7.2',
],
'perfect-debounce' => [
'version' => '1.0.0',
],
'hookable' => [
'version' => '5.5.3',
],
'birpc' => [
'version' => '0.2.19',
],
'splitpanes' => [
'version' => '4.0.3',
],
];

View File

@ -32,6 +32,9 @@ class Product
#[Field(type: 'string')]
protected $ansprechPartner;
#[Field(type: 'boolean')]
protected bool $rawText = false;
/**
* @var \DateTime $ablaufDatum;
*/
@ -250,7 +253,6 @@ class Product
/**
* @var boolean $uploadFromLatestOrder;
*
*/
#[Field(type: 'bool')]
protected $uploadFromLatestOrder;
@ -263,7 +265,6 @@ class Product
/**
* @var boolean $uploadProvided;
*
*/
#[Field(type: 'bool')]
protected $uploadProvided;
@ -274,7 +275,6 @@ class Product
/**
* @var string $uploadProvidedFile;
*
*/
#[Field(type: 'string')]
protected $uploadProvidedFile;
@ -1021,4 +1021,14 @@ class Product
{
$this->uploadProvidedDownload = $uploadProvidedDownload;
}
public function isRawText(): bool
{
return (bool)$this->rawText;
}
public function setRawText(bool $var): void
{
$this->rawText = $var;
}
}

View File

@ -52,6 +52,7 @@ class Product
protected $extraSettings;
protected $availability;
protected $weight;
protected $rawText = false;
protected $text;
/**
* @var integer
@ -3132,4 +3133,13 @@ class Product
{
$this->noIndex = $noIndex;
}
public function isRawText(): bool
{
return (bool)$this->rawText;
}
public function setRawText(bool $rawText): void
{
$this->rawText = $rawText;
}
}

View File

@ -65,6 +65,9 @@
</div>
</div>
<div class="w-full px-4">
<div {{ vue_component('PackageSearch', {news: news}) }}>
Loading...
</div>
{{ form_row(form.introduction)}}
</div>
</div>

View File

@ -95,9 +95,9 @@ class EditController extends AbstractController
/**
* edit
*
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param $uid
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param $uid
* @return JsonResponse
*/
#[Route(path: '/edit/add/lang/data/{uid}', name: 'backend_production_product_edit_add_lang_data')]
@ -124,9 +124,9 @@ class EditController extends AbstractController
/**
* edit
*
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param $uid
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param $uid
* @return JsonResponse
*/
#[Route(path: '/edit/fetch/lang/data/{uid}', name: 'backend_production_product_edit_fetch_lang_data')]
@ -158,17 +158,19 @@ class EditController extends AbstractController
/**
* edit
*
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param $url
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param $url
* @return JsonResponse
* @throws \Doctrine\ORM\ORMException
*/
#[Route(path: '/edit/check/url/{url}', name: 'backend_production_product_check_url')]
public function checkUrlAction(Request $request, EntityManagerInterface $entityManager, \PSC\System\SettingsBundle\Service\Shop $shopService, $url)
{
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
/**
* @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop
*/
$selectedShop = $shopService->getSelectedShop();
$products = $entityManager
@ -176,7 +178,9 @@ class EditController extends AbstractController
if (count($products) > 0) {
$tmp = array();
/** @var Product $product */
/**
* @var Product $product
*/
foreach ($products as $product) {
$tmp[] = $product->getTitle();
}
@ -191,13 +195,13 @@ class EditController extends AbstractController
*
* @template()
*
* @param Request $request Request
* @param Field $fieldService
* @param EntityManagerInterface $entityManager
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param DocumentManager $documentManager
* @param SessionInterface $session
* @param $type
* @param Request $request Request
* @param Field $fieldService
* @param EntityManagerInterface $entityManager
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param DocumentManager $documentManager
* @param SessionInterface $session
* @param $type
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Doctrine\ODM\MongoDB\MongoDBException
* @throws \Doctrine\ORM\ORMException
@ -215,10 +219,14 @@ class EditController extends AbstractController
$customFields = $fieldService->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product);
$customGroups = $fieldService->getGroups(\PSC\System\PluginBundle\Form\Interfaces\Field::Product);
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
/**
* @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop
*/
$selectedShop = $shopService->getSelectedShop();
/** @var Shop $shop */
/**
* @var Shop $shop
*/
$shop = $documentManager
->getRepository('PSC\Shop\EntityBundle\Document\Shop')
->findOneBy(array('uid' => (string) $selectedShop->getUid()));
@ -229,7 +237,9 @@ class EditController extends AbstractController
$customProductFields = $fieldService->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $type);
$customProductGroups = $fieldService->getProductGroups(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $type);
/** @var Domain[] $domains */
/**
* @var Domain[] $domains
*/
$domains = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Domain')->getAllByShopId($selectedShop);
@ -290,6 +300,7 @@ class EditController extends AbstractController
$productDoc->setCustomTabEnable($product->isCustomTabEnable());
$productDoc->setHintEnable($product->isHintEnable());
$productDoc->setAsRequest($product->isAsRequest());
$productDoc->setRawText($product->isRawText());
$documentManager->persist($productDoc);
$documentManager->flush();
@ -321,16 +332,16 @@ class EditController extends AbstractController
*
* @template()
*
* @param Request $request Request
* @param Field $fieldService
* @param EntityManagerInterface $entityManager
* @param DocumentManager $documentManager
* @param PaginatorInterface $paginator
* @param SessionInterface $session
* @param Request $request Request
* @param Field $fieldService
* @param EntityManagerInterface $entityManager
* @param DocumentManager $documentManager
* @param PaginatorInterface $paginator
* @param SessionInterface $session
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param Status $statusService
* @param \PSC\Shop\OrderBundle\Service\Order $orderService
* @param string $uuid Uuid
* @param Status $statusService
* @param \PSC\Shop\OrderBundle\Service\Order $orderService
* @param string $uuid Uuid
*
* @return array
* @throws \Doctrine\ODM\MongoDB\MongoDBException
@ -352,19 +363,27 @@ class EditController extends AbstractController
$customFields = $fieldService->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product);
$customGroups = $fieldService->getGroups(\PSC\System\PluginBundle\Form\Interfaces\Field::Product);
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
/**
* @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop
*/
$selectedShop = $shopService->getSelectedShop();
/** @var Shop $shop */
/**
* @var Shop $shop
*/
$shop = $documentManager
->getRepository('PSC\Shop\EntityBundle\Document\Shop')
->findOneBy(array('uid' => (string) $selectedShop->getUid()));
/** @var Product $product */
/**
* @var Product $product
*/
$product = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Product')->findOneBy(array('uuid' => $uuid, 'shop' => $selectedShop));
/** @var \PSC\Shop\EntityBundle\Document\Product $productDoc */
/**
* @var \PSC\Shop\EntityBundle\Document\Product $productDoc
*/
$productDoc = $documentManager
->getRepository('PSC\Shop\EntityBundle\Document\Product')
->findOneBy(array('uid' => (string) $product->getUid()));
@ -422,6 +441,7 @@ class EditController extends AbstractController
$product->setCustomTabEnable($productDoc->isCustomTabEnable());
$product->setHintEnable($productDoc->isHintEnable());
$product->setAsRequest($productDoc->isAsRequest());
$product->setRawText($productDoc->isRawText());
} elseif (!$productDoc) {
$productDoc = new \PSC\Shop\EntityBundle\Document\Product();
$productDoc->setAblaufDatum($product->getAblaufDatum());
@ -468,6 +488,7 @@ class EditController extends AbstractController
$productDoc->setHintEnable($product->isHintEnable());
$productDoc->setAsRequest($product->isAsRequest());
$productDoc->setNoIndex($product->isNoIndex());
$productDoc->setRawText($product->isRawText());
$documentManager->persist($productDoc);
$documentManager->flush();
@ -515,6 +536,7 @@ class EditController extends AbstractController
$product->setCustomTabEnable($productDoc->isCustomTabEnable());
$product->setHintEnable($productDoc->isHintEnable());
$product->setAsRequest($productDoc->isAsRequest());
$product->setRawText($productDoc->isRawText());
}
if ($request->isMethod('POST') && $productDoc) {
@ -568,6 +590,7 @@ class EditController extends AbstractController
$productDoc->setCustomTabEnable($product->isCustomTabEnable());
$productDoc->setHintEnable($product->isHintEnable());
$productDoc->setAsRequest($product->isAsRequest());
$productDoc->setRawText($product->isRawText());
$this->historyService->createHistoryEntry(new PSCHistory((string)$product->getUID()), $product, $productDoc);
$entityManager->persist($product);
@ -583,7 +606,9 @@ class EditController extends AbstractController
$this->logService->createLogEntry($selectedShop, $this->getUser(), LogEntry::INFO, PSCShopProductBundle::class, $product->getTitle(), "Product has been updated");
}
/** @var Domain[] $domains */
/**
* @var Domain[] $domains
*/
$domains = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Domain')->getAllByShopId($selectedShop);
@ -645,11 +670,11 @@ class EditController extends AbstractController
}
/**
* @param Request $request
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param $uuid
* @param Request $request
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
* @param $uuid
* @return array|Response|\Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Doctrine\ORM\ORMException
*/
@ -663,10 +688,14 @@ class EditController extends AbstractController
SessionInterface $session,
$uuid
) {
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
/**
* @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop
*/
$selectedShop = $shopService->getSelectedShop();
/** @var Product $product */
/**
* @var Product $product
*/
$product = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Product')->findOneBy(array('uuid' => $uuid, 'shop' => $selectedShop));
@ -706,12 +735,11 @@ class EditController extends AbstractController
/**
* Copy Seite
*
*
* @param Request $request
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param \PSC\Shop\ProductBundle\Service\Product $productService
* @param EntityManagerInterface $entityManager
* @param $uuid
* @param Request $request
* @param \PSC\System\SettingsBundle\Service\Shop $shopService
* @param \PSC\Shop\ProductBundle\Service\Product $productService
* @param EntityManagerInterface $entityManager
* @param $uuid
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
@ -723,10 +751,14 @@ class EditController extends AbstractController
$obj = ['which' => 1];
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
/**
* @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop
*/
$selectedShop = $shopService->getSelectedShop();
/** @var Product $product */
/**
* @var Product $product
*/
$product = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Product')->findOneBy(array('uuid' => $uuid, 'shop' => $selectedShop));

View File

@ -16,6 +16,7 @@ namespace PSC\Shop\ProductBundle\Form\Backend\Product;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use PSC\Backend\DashboardBundle\Form\Type\DatePickerType;
use PSC\Libraries\AceEditorBundle\Form\Extension\AceEditorType;
use PSC\Shop\EntityBundle\Entity\Productgroup;
use PSC\Shop\MediaBundle\Form\Type\MediaType;
use PSC\System\PluginBundle\Form\Chain\Field;
@ -42,10 +43,14 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class ProductType extends AbstractType
{
protected $shop = null;
/** @var Status */
/**
* @var Status
*/
protected $statusService = null;
/** @var Field */
/**
* @var Field
*/
protected $fields;
protected $formFactory;
@ -88,6 +93,7 @@ class ProductType extends AbstractType
->add('title', TextType::class)
->add('subTitle', TextType::class, ['required' => false, 'label' => 'subTitle'])
->add('createdAt', DatePickerType::class, array('disabled' => true))
->add('rawText', CheckboxType::class, ['label' => 'rawText', 'required' => false])
->add('image1', MediaType::class, array())
->add('image2', MediaType::class, array())
->add('image3', MediaType::class, array())
@ -108,42 +114,94 @@ class ProductType extends AbstractType
->add('zusatzAbmessung', TextType::class, array('required' => false, 'label' => 'Additionaldimension'))
->add('zusatzDesigner', TextType::class, array('required' => false, 'label' => 'Additiondesigner'))
->add('zusatzShipping', TextType::class, array('required' => false, 'label' => 'Additionalshippinginformation'))
->add('extraSettings', TextareaType::class, array('required' => false, 'label' => 'Extrasettings'))
->add('description', TextareaType::class, array(
->add('extraSettings', TextareaType::class, array('required' => false, 'label' => 'Extrasettings'));
if ($options['data']->isRawText()) {
$builder->add(
'description', AceEditorType::class, array(
'label' => 'description',
'wrapper_attr' => array(), // aceeditor wrapper html attributes.
'width' => '90%',
'height' => '500',
'font_size' => 14,
'mode' => 'ace/mode/html', // every single default mode must have ace/mode/* prefix
'theme' => 'ace/theme/monokai', // every single default theme must have ace/theme/* prefix
'tab_size' => null,
'read_only' => null,
'use_soft_tabs' => null,
'use_wrap_mode' => null,
'show_print_margin' => null,
'required' => false,
'highlight_active_line' => null
)
)
->add(
'text', AceEditorType::class, array(
'label' => 'text',
'wrapper_attr' => array(), // aceeditor wrapper html attributes.
'width' => '90%',
'height' => '500',
'font_size' => 14,
'mode' => 'ace/mode/html', // every single default mode must have ace/mode/* prefix
'theme' => 'ace/theme/monokai', // every single default theme must have ace/theme/* prefix
'tab_size' => null,
'read_only' => null,
'use_soft_tabs' => null,
'use_wrap_mode' => null,
'show_print_margin' => null,
'required' => false,
'highlight_active_line' => null
)
);
}else{
$builder->add(
'description', TextareaType::class, array(
'label' => 'description',
'required' => false
)
)
->add(
'text', TextareaType::class, array(
'label' => 'Additionaldescription',
'required' => false
)
);
}
$builder->add(
'hintText', TextareaType::class, array(
'label' => 'description',
'required' => false
))
->add('text', TextareaType::class, array(
'label' => 'Additionaldescription',
'required' => false
))
->add('hintText', TextareaType::class, array(
'label' => 'description',
'required' => false
))
->add('customTabEnable', CheckboxType::class, array('required' => false, 'label' => 'Active'))
->add('customTabTitle', TextType::class, array('required' => false, 'label' => 'Tabname'))
->add('customTabText', TextareaType::class, array(
'label' => 'Tabtext',
'required' => false
))
->add('product_groups', EntityType::class, array(
'class' => 'PSC\Shop\EntityBundle\Entity\Productgroup',
'choice_label' => function (Productgroup $choice, $key, $value) {
if ($choice->isEnable()) {
return $choice->getTitle();
} else {
return $choice->getTitle() . ' (disabled)';
)
)
->add('customTabEnable', CheckboxType::class, array('required' => false, 'label' => 'Active'))
->add('customTabTitle', TextType::class, array('required' => false, 'label' => 'Tabname'))
->add(
'customTabText', TextareaType::class, array(
'label' => 'Tabtext',
'required' => false
)
)
->add(
'product_groups', EntityType::class, array(
'class' => 'PSC\Shop\EntityBundle\Entity\Productgroup',
'choice_label' => function (Productgroup $choice, $key, $value) {
if ($choice->isEnable()) {
return $choice->getTitle();
} else {
return $choice->getTitle() . ' (disabled)';
}
},
'multiple' => true,
'required' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->where('u.shop = :shop')->setParameter('shop', $this->shop->getSelectedShop()->getId());
}
},
'multiple' => true,
'required' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->where('u.shop = :shop')->setParameter('shop', $this->shop->getSelectedShop()->getId());
}
))
->add('releatedProducts', EntityType::class, array(
)
)
->add(
'releatedProducts', EntityType::class, array(
'class' => 'PSC\Shop\EntityBundle\Entity\Product',
'choice_label' => 'title',
'multiple' => true,
@ -152,8 +210,10 @@ class ProductType extends AbstractType
return $er->createQueryBuilder('u')
->where('u.shop = :shop AND u.originalProduct = 0')->setParameter('shop', $this->shop->getSelectedShop()->getId());
}
))
->add('language', ChoiceType::class, array(
)
)
->add(
'language', ChoiceType::class, array(
'choices' => array(
'Alle' => 'all',
'de_DE' => 'de_DE',
@ -163,15 +223,18 @@ class ProductType extends AbstractType
'il_IL' => 'il_IL',
),
'label' => 'language'
))
->add('availability', ChoiceType::class, array(
)
)
->add(
'availability', ChoiceType::class, array(
'choices' => array(
'instock' => 'in_stock',
'outofstock' => 'out_of_stock',
'preorder' => 'preorder'
),
'label' => 'Availability'
))
)
)
->add('videoId', TextType::class, ['required' => false, 'label' => 'VideoId'])
->add('metaKeywords', TextType::class, ['required' => false, 'label' => 'Keywords'])
->add('metaDescription', TextareaType::class, ['required' => false, 'label' => 'description'])
@ -206,111 +269,153 @@ class ProductType extends AbstractType
->add('custom11', TextType::class, ['required' => false, 'label' => 'Custom 11'])
->add('custom12', TextType::class, ['required' => false, 'label' => 'Custom 12'])
->add('uploadProduct', CheckboxType::class, ['required' => false, 'label' => 'Activate'])
->add("uploadProductInitalStatus", ChoiceType::class, array(
->add(
"uploadProductInitalStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Initialstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
))
)
)
->add('uploadFromLatestOrder', CheckboxType::class, ['required' => false, 'label' => 'Activate'])
->add("uploadFromLatestOrderInitalStatus", ChoiceType::class, array(
->add(
"uploadFromLatestOrderInitalStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Initialstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
))
->add("initialStatus", ChoiceType::class, array(
)
)
->add(
"initialStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Masterinitialstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
))
)
)
->add('uploadPost', CheckboxType::class, ['required' => false, 'label' => 'Activate'])
->add("uploadPostInitalStatus", ChoiceType::class, array(
->add(
"uploadPostInitalStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Initialstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
))
)
)
->add('uploadEmail', CheckboxType::class, ['required' => false, 'label' => 'Activate'])
->add("uploadEmailInitalStatus", ChoiceType::class, array(
->add(
"uploadEmailInitalStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Initialstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
))
)
)
->add('uploadProvided', CheckboxType::class, ['required' => false, 'label' => 'Activate'])
->add('uploadProvidedFile', MediaType::class, array('label' => 'Datei'))
->add("uploadProvidedInitalStatus", ChoiceType::class, array(
->add(
"uploadProvidedInitalStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Initalstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
))
)
)
->add('uploadProvidedDownload', CheckboxType::class, ['required' => false, 'label' => 'Download'])
->add('uploadCenter', CheckboxType::class, ['required' => false, 'label' => 'Activate'])
->add("uploadCenterInitalStatus", ChoiceType::class, array(
->add(
"uploadCenterInitalStatus", ChoiceType::class, array(
'required' => true,
'label' => 'Initialstatus',
'choices' => $this->statusService->getPositionStatusAsArray(),
'translation_domain' => 'posstatus'
));
)
);
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$builder->add($field->buildForm($this->formFactory->createNamedBuilder($field->getGroup()), $options));
}
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$builder->add($field->buildForm($this->formFactory->createNamedBuilder($field->getGroup()), $options));
}
$builder->add('save', SubmitType::class, array('label' => 'save'));
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options) {
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPreSetData($event);
$builder->addEventListener(
FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options) {
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPreSetData($event);
}
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPreSetData($event);
}
}
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPreSetData($event);
}
});
);
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($options) {
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPostSetData($event);
$builder->addEventListener(
FormEvents::POST_SET_DATA, function (FormEvent $event) use ($options) {
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPostSetData($event);
}
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPostSetData($event);
}
}
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPostSetData($event);
}
});
);
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($options) {
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPostSubmit($event);
$builder->addEventListener(
FormEvents::POST_SUBMIT, function (FormEvent $event) use ($options) {
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPostSubmit($event);
}
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPostSubmit($event);
}
}
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPostSubmit($event);
}
});
);
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options) {
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPreSubmit($event);
$builder->addEventListener(
FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options) {
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product) as $field) {
$field->formPreSubmit($event);
}
/**
* @var \PSC\System\PluginBundle\Form\Interfaces\Field $field
*/
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPreSubmit($event);
}
}
/** @var \PSC\System\PluginBundle\Form\Interfaces\Field $field */
foreach ($this->fields->getProductFields(\PSC\System\PluginBundle\Form\Interfaces\Field::Product, $options['productType']) as $field) {
$field->formPreSubmit($event);
}
});
);
}
public function getName()
@ -320,12 +425,14 @@ class ProductType extends AbstractType
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
$resolver->setDefaults(
array(
'data_class' => 'PSC\Shop\EntityBundle\Entity\Product',
'productType' => 0,
'product' => null,
'productDoc' => null,
'translation_domain' => 'core_product_edit'
));
)
);
}
}

View File

@ -431,13 +431,30 @@ a[href^="#formlayouter"] {display:none;}
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="row mb-3">
{{ form_label(form.rawText) }}
<div class="col-md-8">
{{ form_widget(form.rawText) }}
</div>
</div>
</div>
</div>
<h5>{{ 'description'|trans }}</h5>
{% if product.rawText %}
{{ form_widget(form.description) }}
{% else %}
{{ form_widget(form.description, {attr: {'class': 'form-control summernote'}}) }}
{% endif %}
<h5>{{ 'Additionaldescription'|trans }}</h5>
{% if product.rawText %}
{{ form_widget(form.text) }}
{% else %}
{{ form_widget(form.text, {attr: {'class': 'form-control summernote'}}) }}
{% endif %}
</div>
<div class="tab-pane" id="seo" role="tabpanel">

View File

@ -940,6 +940,18 @@
"symfony/ux-twig-component": {
"version": "v2.12.0"
},
"symfony/ux-vue": {
"version": "2.23",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "2.9",
"ref": "7a6b5e211acc7b10b7190e704b40f6d2bca01adf"
},
"files": [
"assets/vue/controllers/Hello.vue"
]
},
"symfony/validator": {
"version": "4.3",
"recipe": {

View File

@ -6,7 +6,8 @@ use Symfony\Contracts\HttpClient\HttpClientInterface;
use function array_merge;
abstract class Base {
abstract class Base
{
private string $apiUrl = 'https://api.print.app/v1/';

View File

@ -33,13 +33,14 @@ class DesignController extends AbstractController
{
$selectedShop = $shopService->getSelectedShop();
/** @var Product $product */
/**
* @var Product $product
*/
$product = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Product')->findOneBy(array('uuid' => $uuid, 'shop' => $selectedShop));
$output = $design->getDesigns($folder);
$data = ['folders' => [], 'designs' => []];
if (isset($output['root']) && isset($output['root']['id']) && $output['root']['id'] == 'root') {
foreach ($output['root']['items'] as $item) {

View File

@ -18,7 +18,7 @@
<img src="{{ design.pages[0]['preview'] }}" class="card-img-top">
<div class="card-body">
<h6 class="card-title">{{design.title}} title</h6>
<button type="button" onClick="choose('{{design.id}}', '{{ design.pages[0]['preview']|join(';')}}')" class="btn btn-sm btn-primary">Benutzen</button>
<button type="button" onClick="module.choose('{{design.id}}', '{{ design.pages[0]['preview']|join(';')}}')" class="btn btn-sm btn-primary">Benutzen</button>
</div>
<div class="card-footer">
<small class="text-muted">Last updated {{design.modified|date("H:i:s d.m.Y")}}</small>
@ -27,14 +27,20 @@
</div>
{% endfor %}
</div>
<script>
function choose(id, previews)
<script type="text/javascript">
const module = {};
</script>
<script type="module">
import $ from 'jquery'
import * as bootstrap from 'bootstrap'
module.choose = function(id, previews)
{
parent.document.getElementById('product_pitchprint_r2_uploadPitchprintDesignId').value = id;
parent.document.getElementById('product_pitchprint_r2_uploadPitchprintDesignPreviews').value = previews;
var useDesignModal = parent.document.getElementById('useDesignR2');
parent.loadChoosenDesign2();
parent.$(useDesignModal).modal('hide');
var modal = parent.bootstrap.Modal.getOrCreateInstance(useDesignModal);
modal.toggle();
}
</script>
{% endblock %}

View File

@ -63,7 +63,7 @@
</div>
</div>
</div>
<div class="modal" data-bs-backdrop="static" tabindex="-1" id="useDesignR2">
<div class="modal" tabindex="-1" id="useDesignR2">
<div class="modal-dialog modal-fullscreen">
<div class="modal-content">
<div class="modal-header">