From 059c62459e19af5ee2ca8e56e73a056e0dfe109f Mon Sep 17 00:00:00 2001 From: Thomas Peterson Date: Thu, 7 Aug 2025 21:35:49 +0200 Subject: [PATCH] working --- src/new/fixtures/plugin.yml | 8 - .../PSC/Shop/MediaBundle/Document/Folder.php | 35 +- .../System/SettingsBundle/Service/Help.php | 21 +- .../Custom/PSC/FormBuilder/Api/LayoutTest.php | 62 ++ .../System/PSC/XmlCalc/Api/DesignTest.php | 1 + .../System/PSC/XmlCalc/Api/PreviewTest.php | 35 + src/new/tests/RefreshDatabaseTrait.php | 37 ++ .../Custom/PSC/FormBuilder/Api/Layout/Add.php | 50 ++ .../Custom/PSC/FormBuilder/Api/Layout/All.php | 58 ++ .../PSC/FormBuilder/Document/Layout.php | 90 +++ .../Custom/PSC/FormBuilder/Dto/Layout/All.php | 16 + .../PSC/FormBuilder/Dto/Layout/Input.php | 21 + .../PSC/FormBuilder/FormBuilderTS/src/App.vue | 18 +- .../FormBuilderTS/src/components/Gui.vue | 8 +- .../src/components/app/TopBar.vue | 7 +- .../app/dialogs/LoadLayoutDialog.vue | 68 ++ .../app/dialogs/SaveLayoutDialog.vue | 70 ++ .../src/components/app/library/Library.vue | 9 + .../src/components/app/preview/Preview.vue | 42 ++ .../components/app/preview/PriceDisplay.vue | 39 ++ .../components/app/preview/RenderElements.vue | 38 ++ .../app/preview/elements/HeadlineElement.vue | 20 + .../app/preview/elements/HiddenElement.vue | 16 + .../app/preview/elements/InputElement.vue | 19 + .../app/preview/elements/SelectElement.vue | 36 + .../app/preview/elements/TextElement.vue | 14 + .../app/renderelements/RenderElements.vue | 20 +- .../FormBuilderTS/src/i18n/de.json | 12 +- .../FormBuilderTS/src/i18n/en.json | 12 +- .../FormBuilder/FormBuilderTS/src/lib/api.ts | 34 +- .../FormBuilderTS/src/stores/Global.ts | 30 +- .../FormBuilder/FormBuilderTS/vite.config.ts | 2 +- .../Custom/PSC/FormBuilder/Model/Layout.php | 76 +++ .../PSC/FormBuilder/Resources/config/api.yml | 4 + .../FormBuilder/Resources/config/routing.yml | 7 +- .../System/PSC/XmlCalc/Api/Product/Design.php | 25 +- .../XmlCalc/Api/Product/PreviewDesigner.php | 206 ++++++ .../PSC/XmlCalc/Dto/Input/DesignInput.php | 35 +- .../System/PSC/XmlCalc/Dto/Input/PDInput.php | 21 + .../XmlCalc/Dto/Output/Product/PDOutput.php | 32 + src/old/library/TP/Controller/Action.php | 618 ++++++++++++------ 41 files changed, 1685 insertions(+), 287 deletions(-) delete mode 100755 src/new/fixtures/plugin.yml create mode 100644 src/new/tests/Plugins/Custom/PSC/FormBuilder/Api/LayoutTest.php create mode 100644 src/new/tests/Plugins/System/PSC/XmlCalc/Api/PreviewTest.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/Add.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/All.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Document/Layout.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Dto/Layout/All.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Dto/Layout/Input.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/LoadLayoutDialog.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/SaveLayoutDialog.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/Preview.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/PriceDisplay.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/RenderElements.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HeadlineElement.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HiddenElement.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/InputElement.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/SelectElement.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/TextElement.vue create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Model/Layout.php create mode 100644 src/new/var/plugins/Custom/PSC/FormBuilder/Resources/config/api.yml create mode 100644 src/new/var/plugins/System/PSC/XmlCalc/Api/Product/PreviewDesigner.php create mode 100644 src/new/var/plugins/System/PSC/XmlCalc/Dto/Input/PDInput.php create mode 100644 src/new/var/plugins/System/PSC/XmlCalc/Dto/Output/Product/PDOutput.php diff --git a/src/new/fixtures/plugin.yml b/src/new/fixtures/plugin.yml deleted file mode 100755 index ebf63e42c..000000000 --- a/src/new/fixtures/plugin.yml +++ /dev/null @@ -1,8 +0,0 @@ -PSC\System\PluginBundle\Document\Plugin: - plugin_1: - name: XML Kalkulations Produkt - namespace: \Plugin\System\PSC\XmlCalc\Plugin - path: System/PSC/XmlCalc - pluginId: 19ff3fd21de9dbd7452fd0a67c928758 - type: 0 - installed: true \ No newline at end of file diff --git a/src/new/src/PSC/Shop/MediaBundle/Document/Folder.php b/src/new/src/PSC/Shop/MediaBundle/Document/Folder.php index 4a637c313..a33f5f2a1 100755 --- a/src/new/src/PSC/Shop/MediaBundle/Document/Folder.php +++ b/src/new/src/PSC/Shop/MediaBundle/Document/Folder.php @@ -1,26 +1,10 @@ - * @copyright 2012-2013 PrintshopCreator GmbH - * @license Private - * @link http://www.printshopcreator.de - */ - namespace PSC\Shop\MediaBundle\Document; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; use Doctrine\ODM\MongoDB\Mapping\Annotations\Field; use Doctrine\ODM\MongoDB\Mapping\Annotations\Id; -use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; -use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument; -use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbedOne; -use Doctrine\ODM\MongoDB\Mapping\Annotations\Index; -use Doctrine\ODM\MongoDB\Mapping\Annotations\ReferenceMany; -use Doctrine\ODM\MongoDB\Mapping\Annotations\ReferenceOne; #[Document(collection: 'Media_Folder')] class Folder @@ -28,23 +12,23 @@ class Folder #[Id] protected $id; /** - * @var \DateTime $created; - */ + * @var \DateTime $created; + */ #[Field(type: 'date')] protected $created; /** - * @var \DateTime $updated; - */ + * @var \DateTime $updated; + */ #[Field(type: 'date')] protected $updated; /** - * @var string $title - */ + * @var string $title + */ #[Field(type: 'string')] protected $title; /** - * @var string $icon - */ + * @var string $icon + */ #[Field(type: 'string')] protected $icon; @@ -54,6 +38,7 @@ class Folder private $subFolders = []; private $media = 0; + public function __construct() { $this->created = new \DateTime(); diff --git a/src/new/src/PSC/System/SettingsBundle/Service/Help.php b/src/new/src/PSC/System/SettingsBundle/Service/Help.php index b7ed98dcc..bcd17b959 100644 --- a/src/new/src/PSC/System/SettingsBundle/Service/Help.php +++ b/src/new/src/PSC/System/SettingsBundle/Service/Help.php @@ -13,17 +13,28 @@ class Help $this->mongoManager = $mongoManager; } - public function getHelp(string $id, string $name): ?\PSC\System\SettingsBundle\Model\Help + public function getHelp(null|string $id, string $name): null|\PSC\System\SettingsBundle\Model\Help { /** @var \PSC\System\SettingsBundle\Document\Help $doc */ - $doc = $this->mongoManager->getRepository(\PSC\System\SettingsBundle\Document\Help::class)->findOneBy(['name' => sprintf("%s_%s", $id, $name)]); - + $doc = null; + if ($id !== null) { + $doc = $this->mongoManager + ->getRepository(\PSC\System\SettingsBundle\Document\Help::class) + ->findOneBy(['name' => sprintf('%s_%s', $id, $name)]); + } if (null === $doc) { - $doc = $this->mongoManager->getRepository(\PSC\System\SettingsBundle\Document\Help::class)->findOneBy(['name' => $name]); + $doc = $this->mongoManager + ->getRepository(\PSC\System\SettingsBundle\Document\Help::class) + ->findOneBy(['name' => $name]); if ($doc === null) { return null; } } - return new \PSC\System\SettingsBundle\Model\Help($doc->id, $doc->name, (string)$doc->helpText, (string)$doc->helpTitle); + return new \PSC\System\SettingsBundle\Model\Help( + $doc->id, + $doc->name, + (string) $doc->helpText, + (string) $doc->helpTitle, + ); } } diff --git a/src/new/tests/Plugins/Custom/PSC/FormBuilder/Api/LayoutTest.php b/src/new/tests/Plugins/Custom/PSC/FormBuilder/Api/LayoutTest.php new file mode 100644 index 000000000..54548da7a --- /dev/null +++ b/src/new/tests/Plugins/Custom/PSC/FormBuilder/Api/LayoutTest.php @@ -0,0 +1,62 @@ +faker = Factory::create(locale: 'de_DE'); + } + + public function testCreateLayout(): void + { + $client = static::createClient(); + + $userRepository = static::getContainer()->get(ContactRepository::class); + + $testUser = $userRepository->loadUserByUsername('admin@shop.de'); + + $client->loginUser($testUser, 'api'); + + $name = $this->faker->slug(); + $client->jsonRequest( + 'POST', + '/api/plugin/custom/psc/formbuilder/layouts/add', + [ + 'title' => $name, + 'shop' => 'shop1234', + 'data' => [ + 'uuid' => '5678987656789', + 'name' => 'testlayout', + 'options' => [ + [ + 'type' => 1, + 'name' => 'Auflage', + 'id' => 'auflage', + ], + ], + ], + ], + [], + ); + + $this->assertResponseIsSuccessful(); + $data = json_decode($client->getResponse()->getContent(), true); + self::assertSame($name, $data['title']); + + $client->jsonRequest('GET', '/api/plugin/custom/psc/formbuilder/layouts/all/shop1234', [], []); + $this->assertResponseIsSuccessful(); + $data = json_decode($client->getResponse()->getContent(), true); + } +} diff --git a/src/new/tests/Plugins/System/PSC/XmlCalc/Api/DesignTest.php b/src/new/tests/Plugins/System/PSC/XmlCalc/Api/DesignTest.php index d2454cd9c..c7d9faf08 100644 --- a/src/new/tests/Plugins/System/PSC/XmlCalc/Api/DesignTest.php +++ b/src/new/tests/Plugins/System/PSC/XmlCalc/Api/DesignTest.php @@ -19,6 +19,7 @@ class DesignTest extends WebTestCase '/api/plugin/system/psc/xmlcalc/product/design', [ 'product' => '01938686-0e4d-7da9-bae3-b2e1b1681f9f', + 'shop' => '771a1176-d531-48ed-93b8-eec1fd4b917f', 'jsonProduct' => json_decode( '[{"uuid":"df2df718-b28e-482d-bf0c-67d246f05d32","name":"Test Artikel","options":[{"id":"auflage","name":"Auflage","default":"100","dependencys":[],"placeHolder":"Placeholder","required":false,"type":2},{"id":"seiten_umschlag","name":"Seiten Umschlag","default":"2","dependencys":[],"placeHolder":"Placeholder","required":false,"type":2},{"id":"seiten_anzahl_inhalt","name":"Seiten Anzahl Inhalt","default":"10","dependencys":[{"relation":"auflage","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vauflage$V*0.12","price":0,"value":"1-10","dependencys":[{"relation":"seiten_umschlag","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vseiten_umschlag$V*0.24","price":0,"value":"1-2","dependencys":[]},{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vseiten_umschlag$V*0.23","price":0,"value":"3-","dependencys":[]}]}]},{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vauflage$V*0.11","price":0,"value":"11-","dependencys":[{"relation":"seiten_umschlag","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vseiten_umschlag$V*0.21","price":0,"value":"1-2","dependencys":[]},{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vseiten_umschlag$V*0.20","price":0,"value":"3-","dependencys":[]}]}]}]}],"placeHolder":"Placeholder","required":true,"type":2},{"id":"farbigkeit","name":"Farbigkeit","default":"10","dependencys":[],"type":3,"options":[{"id":"10","name":"1\/0 farbig","dependencys":[{"relation":"auflage","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"","price":0,"value":"1-101","dependencys":[]}]}]},{"id":"11","name":"1\/1 farbig","dependencys":[]},{"id":"20","name":"2\/0 farbig","dependencys":[]},{"id":"21","name":"2\/1 farbig","dependencys":[]},{"id":"22","name":"2\/2 farbig","dependencys":[{"relation":"auflage","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"","price":0,"value":"11-50","dependencys":[]}]}]}],"mode":"normal"},{"id":"calc","name":"calc","dependencys":[{"relation":"auflage","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vauflage$V*$Vseiten_anzahl_inhalt$V","price":0,"value":"1-","dependencys":[]}]}],"type":1}]}]', ), diff --git a/src/new/tests/Plugins/System/PSC/XmlCalc/Api/PreviewTest.php b/src/new/tests/Plugins/System/PSC/XmlCalc/Api/PreviewTest.php new file mode 100644 index 000000000..51c3ce7de --- /dev/null +++ b/src/new/tests/Plugins/System/PSC/XmlCalc/Api/PreviewTest.php @@ -0,0 +1,35 @@ +jsonRequest( + 'POST', + '/api/plugin/system/psc/xmlcalc/product/pd', + [ + 'shop' => '771a1176-d531-48ed-93b8-eec1fd4b917f', + 'json' => json_decode( + '[{"uuid":"2db72c84-67a9-4fcf-99da-9307255572af","name":"2f9152d2-2ce4-42ea-8f04-69484e0e8577","options":[{"id":"auflage","name":"Auflage","default":"100","dependencys":[{"relation":"auflage","formula":"","borders":[{"calcValue":"","calcValue1":"","calcValue2":"","calcValue3":"","calcValue4":"","calcValue5":"","calcValue6":"","calcValue7":"","calcValue8":"","calcValue9":"","calcValue10":"","flatRate":"","formula":"$Vauflage$V*0.12","price":0,"value":"1-","dependencys":[]}]}],"placeHolder":"Placeholder","required":true,"minValue":1,"maxValue":200,"minCalc":"","maxCalc":"","type":2}]}]', + ), + 'values' => ['auflage' => 100], + ], + [], + ); + $this->assertResponseIsSuccessful(); + + $data = json_decode($client->getResponse()->getContent(), true); + + self::assertSame(1200, $data['netto']); + } +} diff --git a/src/new/tests/RefreshDatabaseTrait.php b/src/new/tests/RefreshDatabaseTrait.php index a77dc1d6a..32bc320a8 100755 --- a/src/new/tests/RefreshDatabaseTrait.php +++ b/src/new/tests/RefreshDatabaseTrait.php @@ -7,6 +7,7 @@ namespace Tests; use Doctrine\ODM\MongoDB\DocumentManager; use Doctrine\ORM\EntityManagerInterface; use Hautelook\AliceBundle\PhpUnit\BaseDatabaseTrait; +use Plugin\Custom\PSC\FormBuilder\Document\Layout; use PSC\Shop\ContactBundle\Model\AccountType; use PSC\Shop\EntityBundle\Document\Contact; use PSC\Shop\EntityBundle\Document\Country; @@ -53,11 +54,35 @@ trait RefreshDatabaseTrait $doc->getSchemaManager()->dropDocumentCollection(Order::class); $doc->getSchemaManager()->dropDocumentCollection(Position::class); $doc->getSchemaManager()->dropDocumentCollection(Instance::class); + $doc->getSchemaManager()->dropDocumentCollection(Plugin::class); $doc->getSchemaManager()->dropDocumentCollection(Shop::class); $doc->getSchemaManager()->dropDocumentCollection(Help::class); $doc->getSchemaManager()->dropDocumentCollection(Country::class); $doc->getSchemaManager()->dropDocumentCollection(Contact::class); + $bulk = new \MongoDB\Driver\BulkWrite(); + $bulk->insert([ + 'name' => 'XML Kalkulations Produkt', + 'installed' => true, + 'shouldBeDeInstalled' => false, + 'shouldBeInstalled' => false, + 'path' => 'System/PSC/XmlCalc', + 'namespace' => '\\Plugin\\System\\PSC\\XmlCalc\\Plugin', + 'pluginId' => '19ff3fd21de9dbd7452fd0a67c928758', + ]); + $bulk->insert([ + 'name' => 'FormBuilder', + 'installed' => true, + 'shouldBeDeInstalled' => false, + 'shouldBeInstalled' => false, + 'path' => 'Custom/PSC/FormBuilder', + 'namespace' => '\\Plugin\\Custom\\PSC\\FormBuilder\\Plugin', + 'pluginId' => '19ff3fd21de9dbd7452fd0a67c928759', + ]); + $doc->getClient()->getManager()->executeBulkWrite('psc_test.Plugin', $bulk); + + $doc->getSchemaManager()->dropDocumentCollection(Layout::class); + if (!$doc->getRepository(Plugin::class)->findOneBy(['pluginId' => '19ff3fd21de9dbd7452fd0a67c928758'])) { $plugin = new Plugin(); $plugin->setInstalled(true); @@ -70,6 +95,18 @@ trait RefreshDatabaseTrait $doc->clear(); } + if (!$doc->getRepository(Plugin::class)->findOneBy(['pluginId' => '19ff3fd21de9dbd7452fd0a67c928759'])) { + $plugin = new Plugin(); + $plugin->setInstalled(true); + $plugin->setPluginId('19ff3fd21de9dbd7452fd0a67c928759'); + $plugin->setName('FormBuilder'); + $plugin->setNamespace('\Plugin\Custom\PSC\FormBuilder\Plugin'); + $plugin->setPath('Custom/PSC/FormBuilder'); + $doc->persist($plugin); + $doc->flush(); + $doc->clear(); + } + $instance = new Instance(); $instance->setAppId('1'); $instance->setInvoiceNumberStart(1); diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/Add.php b/src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/Add.php new file mode 100644 index 000000000..b73fe56cc --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/Add.php @@ -0,0 +1,50 @@ +setTitle($data->title); + $layout->setData($data->data); + $layout->setShop($data->shop); + $this->dm->persist($layout); + $this->dm->flush(); + + $lModel = new Layout(); + $lModel->setUuid($layout->getId()); + $lModel->setTitle($layout->getTitle()); + $lModel->setData($layout->getData()); + $lModel->setShop($layout->getShop()); + + return $this->json($lModel); + } +} diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/All.php b/src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/All.php new file mode 100644 index 000000000..3a6a59eaf --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/Api/Layout/All.php @@ -0,0 +1,58 @@ +dm + ->getRepository(Layout::class) + ->createQueryBuilder('layout') + ->field('shop') + ->equals($uuid) + ->sort('title', 'ASC') + ->getQuery() + ->execute(); + + $output = new PluginAll(); + + foreach ($layouts as $layout) { + $l = new PluginLayout(); + $l->setTitle($layout->getTitle()); + $l->setUuid($layout->getId()); + $l->setData($layout->getData()); + $l->setShop($layout->getShop()); + $l->setJson(json_encode($layout->getData())); + $output->data[] = $l; + } + return $this->json($output); + } +} diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/Document/Layout.php b/src/new/var/plugins/Custom/PSC/FormBuilder/Document/Layout.php new file mode 100644 index 000000000..940519eb4 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/Document/Layout.php @@ -0,0 +1,90 @@ +created = new \DateTime(); + $this->updated = new \DateTime(); + } + + public function getTitle(): string + { + return $this->title; + } + + public function setTitle(string $title): void + { + $this->title = $title; + } + + public function getId(): string + { + return $this->id; + } + + public function setId(string $id): void + { + $this->id = $id; + } + + public function getCreated(): \DateTime + { + return $this->created; + } + + public function setCreated(\DateTime $created): void + { + $this->created = $created; + } + + public function getUpdated(): \DateTime + { + return $this->updated; + } + + public function setUpdated(\DateTime $updated): void + { + $this->updated = $updated; + } + + public function getData(): array + { + return $this->data; + } + + public function setData(array $data): void + { + $this->data = $data; + } + + public function getShop(): string + { + return $this->shop; + } + + public function setShop(string $shop): void + { + $this->shop = $shop; + } +} diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/Dto/Layout/All.php b/src/new/var/plugins/Custom/PSC/FormBuilder/Dto/Layout/All.php new file mode 100644 index 000000000..e616f2958 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/Dto/Layout/All.php @@ -0,0 +1,16 @@ + { const uuid = params.get('uuid') const shopUuid = params.get('shop') const mode = params.get('mode') - globalStore.setProductUuid(shopUuid) + globalStore.setShopUuid(shopUuid) globalStore.setMode(mode) if (uuid) { globalStore.setProductUuid(uuid) @@ -21,8 +21,22 @@ onMounted(() => { globalStore.loadFormulaAnalyserDataFromApi(uuid) } + let debounceTimer: number; + const debounce = (func: Function, delay: number) => { + return function(this: any, ...args: any[]) { + clearTimeout(debounceTimer); + debounceTimer = setTimeout(() => func.apply(this, args), delay); + }; + }; + + const debouncedLoadPreview = debounce((json: object[]) => { + globalStore.loadPreview(json); + }, 500); + itemStore.$subscribe((mutation, state) => { - globalStore.saveDesign(itemStore.loadJSON()); + const json = itemStore.loadJSON(); + globalStore.saveDesign(json); + debouncedLoadPreview(json); }); }) diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/Gui.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/Gui.vue index 1307bf50e..490455f2d 100644 --- a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/Gui.vue +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/Gui.vue @@ -17,6 +17,9 @@ import XmlView from './app/XmlView.vue' import ParameterView from './app/ParameterView.vue' import PaperDBView from './app/PaperDBView.vue' import FormelView from './app/FormelView.vue' +import SaveLayoutDialog from './app/dialogs/SaveLayoutDialog.vue'; +import LoadLayoutDialog from './app/dialogs/LoadLayoutDialog.vue'; +import Preview from './app/preview/Preview.vue'; const globalStore = useGlobalStore() @@ -62,7 +65,8 @@ const globalStore = useGlobalStore()
-
+
+
@@ -86,6 +90,8 @@ const globalStore = useGlobalStore() + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/TopBar.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/TopBar.vue index 81ef7d1ea..b43a97be1 100644 --- a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/TopBar.vue +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/TopBar.vue @@ -7,12 +7,17 @@ const globalStore = useGlobalStore() function manualSave() { globalStore.manualSave() } + +function openSaveLayoutDialog() { + globalStore.setShowSaveLayoutDialog(true) +} diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/LoadLayoutDialog.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/LoadLayoutDialog.vue new file mode 100644 index 000000000..7278bc182 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/LoadLayoutDialog.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/SaveLayoutDialog.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/SaveLayoutDialog.vue new file mode 100644 index 000000000..d5f74b884 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/dialogs/SaveLayoutDialog.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/library/Library.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/library/Library.vue index eb3a5cb07..464bef8e6 100644 --- a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/library/Library.vue +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/library/Library.vue @@ -3,6 +3,7 @@ import { useGlobalStore } from '../../../stores/Global' import { Image, Rows3, TableCellsMerge, SquareParking, SquareDot, SquareMenu, SquarePen, SquareChevronDown, SquareDashed, type LucideProps } from 'lucide-vue-next'; import { Switch } from '../../../components/ui/switch' import { Label } from '../../../components/ui/label' +import { Button } from '../../../components/ui/button' import { ref, watch, h } from 'vue' import { useI18n } from 'vue-i18n' @@ -20,6 +21,10 @@ function startDrag(event: DragEvent, item: string) { globalStore.setDragMode("insert") } +function openLoadLayoutDialog() { + globalStore.setShowLoadLayoutDialog(true) +} + watch(previewMode, (newPreviewMode) => { if(newPreviewMode === false) { globalStore.setShowPreview(false) @@ -76,6 +81,10 @@ const renderIcon = (icon: any) => { +
+ +
+

{{ $t(group.category) }}

+import { computed, watch } from 'vue' +import { useGlobalStore } from '../../../stores/Global' +import { Codemirror } from 'vue-codemirror' +import { json } from '@codemirror/lang-json' +import RenderElements from './RenderElements.vue' +import PriceDisplay from './PriceDisplay.vue'; +const globalStore = useGlobalStore() + +const previewData = computed(() => globalStore.getPreviewData) +const error = computed(() => globalStore.previewError) +const isLoading = computed(() => globalStore.isPreviewLoading) + +const items = computed(() => previewData.value?.elements || []) + + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/PriceDisplay.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/PriceDisplay.vue new file mode 100644 index 000000000..f62f670d9 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/PriceDisplay.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/RenderElements.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/RenderElements.vue new file mode 100644 index 000000000..ba3fd2e0d --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/RenderElements.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HeadlineElement.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HeadlineElement.vue new file mode 100644 index 000000000..a4c199dce --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HeadlineElement.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HiddenElement.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HiddenElement.vue new file mode 100644 index 000000000..882940676 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/HiddenElement.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/InputElement.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/InputElement.vue new file mode 100644 index 000000000..2912372e6 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/InputElement.vue @@ -0,0 +1,19 @@ + + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/SelectElement.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/SelectElement.vue new file mode 100644 index 000000000..f5cd65c20 --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/SelectElement.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/TextElement.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/TextElement.vue new file mode 100644 index 000000000..689ff530d --- /dev/null +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/preview/elements/TextElement.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/renderelements/RenderElements.vue b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/renderelements/RenderElements.vue index c6e65f62f..fac7edcd8 100644 --- a/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/renderelements/RenderElements.vue +++ b/src/new/var/plugins/Custom/PSC/FormBuilder/FormBuilderTS/src/components/app/renderelements/RenderElements.vue @@ -34,18 +34,6 @@ const itemStore = useItemStore() const globalStore = useGlobalStore() const dragUuid = ref("") -let isPreview = ref(false) - -isPreview.value = globalStore.showPreview - -globalStore.$subscribe((mutation, state) => { - if(state.showPreview) { - isPreview.value = true - }else{ - isPreview.value = false - } -}) - const startDrag = (event: DragEvent, uuid: string) => { event.dataTransfer!.dropEffect = 'move' event.dataTransfer!.effectAllowed = 'move' @@ -108,14 +96,14 @@ const editElementDependency = (item: BaseElement) => {
-
-
+
+

-
+
{ v-model="item as MediaElement" />
-