diff --git a/.github/workflows/backwards-compatibility-check.yaml b/.github/workflows/backwards-compatibility-check.yaml index 806dd6a..85ba05c 100644 --- a/.github/workflows/backwards-compatibility-check.yaml +++ b/.github/workflows/backwards-compatibility-check.yaml @@ -20,7 +20,7 @@ jobs: - name: "Setup PHP, with composer and extensions" uses: "shivammathur/setup-php@v2" with: - php-version: "8.1" + php-version: "8.2" coverage: "none" - name: "Install tool" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2a1e8ad..53138f0 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,7 @@ jobs: strategy: matrix: php-version: - - "8.1" # Always use the lowest version of PHP since a higher version could create actual syntax errors in lower versions + - "8.2" # Always use the lowest version of PHP since a higher version could create actual syntax errors in lower versions dependencies: - "highest" @@ -72,7 +72,6 @@ jobs: strategy: matrix: php-version: - - "8.1" - "8.2" dependencies: @@ -80,8 +79,8 @@ jobs: - "highest" symfony: - - "~5.4.0" - "~6.4.0" + - "~7.1.0" steps: - name: "Checkout" @@ -119,7 +118,6 @@ jobs: strategy: matrix: php-version: - - "8.1" - "8.2" dependencies: @@ -127,8 +125,8 @@ jobs: - "highest" symfony: - - "~5.4.0" - "~6.4.0" + - "~7.1.0" steps: - name: "Checkout" @@ -163,7 +161,6 @@ jobs: strategy: matrix: php-version: - - "8.1" - "8.2" dependencies: @@ -171,8 +168,8 @@ jobs: - "highest" symfony: - - "~5.4.0" - "~6.4.0" + - "~7.1.0" steps: - name: "Checkout" @@ -204,7 +201,6 @@ jobs: strategy: matrix: php-version: - - "8.1" - "8.2" dependencies: @@ -212,8 +208,8 @@ jobs: - "highest" symfony: - - "~5.4.0" - "~6.4.0" + - "~7.1.0" steps: - name: "Start MySQL" diff --git a/README.md b/README.md index 90bce49..34b9675 100644 --- a/README.md +++ b/README.md @@ -83,38 +83,6 @@ $ php bin/console doctrine:migrations:diff $ php bin/console doctrine:migrations:migrate ``` -### Step 5: Override checkout complete form - -Override the [Sylius Form](https://github.com/Sylius/Sylius/blob/master/src/Sylius/Bundle/ShopBundle/Resources/views/Checkout/Complete/_form.html.twig): - -* If you haven't your own `templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig` yet: - - ```bash - $ cp vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/Resources/views/Checkout/Complete/_form.html.twig \ - templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig - ``` - -* If you already have it: - - Add terms field (exactly this conditional way): - - ```twig - {# templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig #} - {% if form.terms is defined %} - {{ form_row(form.terms) }} - {% endif %} - ``` - - So the final template will look like this: - - ```twig - {# templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig #} - {{ form_row(form.notes, {'attr': {'rows': 3}}) }} - {% if form.terms is defined %} - {{ form_row(form.terms) }} - {% endif %} - ``` - # Troubleshooting * If you see `Neither the property "terms" nor one of the methods "terms()", "getterms()"/"isterms()"/"hasterms()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView".` diff --git a/composer.json b/composer.json index d65023c..d8cc539 100644 --- a/composer.json +++ b/composer.json @@ -9,54 +9,66 @@ "terms" ], "require": { - "php": ">=8.1", - "doctrine/collections": "^1.6", - "doctrine/orm": "^2.7", + "php": ">=8.2", + "doctrine/collections": "^2.2", + "doctrine/orm": "^2.7 || ^3.0", "fakerphp/faker": "^1.23", "knplabs/knp-menu": "^3.1", - "sylius/channel": "^1.0", - "sylius/channel-bundle": "^1.0", - "sylius/core": "^1.0", - "sylius/core-bundle": "^1.0", - "sylius/locale": "^1.0", - "sylius/resource-bundle": "^1.6", - "sylius/ui-bundle": "^1.0", - "symfony/config": "^5.4 || ^6.4 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.4 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", - "symfony/form": "^5.4 || ^6.4 || ^7.0", - "symfony/http-foundation": "^5.4 || ^6.4 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.4 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", - "symfony/routing": "^5.4 || ^6.4 || ^7.0", - "symfony/string": "^5.4 || ^6.4 || ^7.0", + "sylius/channel": "^2.0", + "sylius/channel-bundle": "^2.0", + "sylius/core": "^2.0", + "sylius/core-bundle": "^2.0", + "sylius/locale": "^2.0", + "sylius/product": "^2.0", + "sylius/product-bundle": "^2.0", + "sylius/resource-bundle": "^1.12", + "sylius/ui-bundle": "^2.0", + "symfony/config": "^6.4 || ^7.1", + "symfony/dependency-injection": "^6.4 || ^7.1", + "symfony/event-dispatcher": "^6.4 || ^7.1", + "symfony/form": "^6.4 || ^7.1", + "symfony/http-foundation": "^6.4 || ^7.1", + "symfony/http-kernel": "^6.4 || ^7.1", + "symfony/options-resolver": "^6.4 || ^7.1", + "symfony/routing": "^6.4 || ^7.1", + "symfony/string": "^6.4 || ^7.1", "symfony/translation-contracts": "^1.1 || ^2.4 || ^3.4", - "symfony/validator": "^5.4 || ^6.4 || ^7.0", + "symfony/ux-live-component": "^2.20", + "symfony/validator": "^6.4 || ^7.1", "twig/twig": "^2.14 || ^3.8", "webmozart/assert": "^1.11" }, "require-dev": { - "api-platform/core": "^2.7.16", - "babdev/pagerfanta-bundle": "^3.8", - "behat/behat": "^3.14", + "api-platform/core": "^4.0.3", + "babdev/pagerfanta-bundle": "^4.4", + "behat/behat": "^3.16", "doctrine/doctrine-bundle": "^2.11", + "friends-of-behat/mink": "^1.11", + "friends-of-behat/mink-browserkit-driver": "^1.6", + "friends-of-behat/mink-debug-extension": "^2.1", + "friends-of-behat/mink-extension": "^2.7", + "friends-of-behat/page-object-extension": "^0.3", + "friends-of-behat/suite-settings-extension": "^1.1", + "friends-of-behat/symfony-extension": "^2.6", + "friends-of-behat/variadic-extension": "^1.6", "infection/infection": "^0.27.9", - "jms/serializer-bundle": "^4.2", - "lexik/jwt-authentication-bundle": "^2.17", + "jms/serializer-bundle": "^5.5", + "lexik/jwt-authentication-bundle": "^3.1", "matthiasnoback/symfony-config-test": "^4.3 || ^5.1", "matthiasnoback/symfony-dependency-injection-test": "^4.3 || ^5.0", + "payum/core": "^1.7.4", "phpspec/prophecy-phpunit": "^2.1", "phpunit/phpunit": "^9.6", "psalm/plugin-phpunit": "^0.18", "setono/code-quality-pack": "^2.7", - "sylius/sylius": "~1.12.13", - "symfony/debug-bundle": "^5.4 || ^6.4 || ^7.0", - "symfony/dotenv": "^5.4 || ^6.4 || ^7.0", - "symfony/intl": "^5.4 || ^6.4 || ^7.0", - "symfony/property-info": "^5.4 || ^6.4 || ^7.0", - "symfony/serializer": "^5.4 || ^6.4 || ^7.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.4 || ^7.0", - "symfony/webpack-encore-bundle": "^1.17", + "sylius/sylius": "^2.0", + "symfony/debug-bundle": "^6.4 || ^7.1", + "symfony/dotenv": "^6.4 || ^7.1", + "symfony/intl": "^6.4 || ^7.1", + "symfony/property-info": "^6.4 || ^7.1", + "symfony/serializer": "^6.4 || ^7.1", + "symfony/web-profiler-bundle": "^6.4 || ^7.1", + "symfony/webpack-encore-bundle": "^2.2", "willdurand/negotiation": "^3.1" }, "prefer-stable": true, @@ -78,6 +90,7 @@ "dealerdirect/phpcodesniffer-composer-installer": false, "ergebnis/composer-normalize": true, "infection/extension-installer": true, + "php-http/discovery": true, "symfony/thanks": false }, "sort-packages": true diff --git a/psalm.xml b/psalm.xml index b3e0471..ea72749 100644 --- a/psalm.xml +++ b/psalm.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://getpsalm.org/schema/config" xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd" - phpVersion="8.1" + phpVersion="8.2" errorLevel="1" findUnusedBaselineEntry="false" findUnusedPsalmSuppress="false" @@ -30,6 +30,11 @@ + + + + + @@ -40,5 +45,21 @@ + + + + + + + + + + + + + + + + diff --git a/src/DependencyInjection/SetonoSyliusTermsExtension.php b/src/DependencyInjection/SetonoSyliusTermsExtension.php index 56a3a76..dd145c0 100644 --- a/src/DependencyInjection/SetonoSyliusTermsExtension.php +++ b/src/DependencyInjection/SetonoSyliusTermsExtension.php @@ -91,7 +91,7 @@ public function prepend(ContainerBuilder $container): void ], ]); - $container->prependExtensionConfig('sylius_ui', [ + /*$container->prependExtensionConfig('sylius_ui', [ 'events' => [ 'setono_sylius_terms.admin.terms.create.javascripts' => [ 'blocks' => [ @@ -101,6 +101,6 @@ public function prepend(ContainerBuilder $container): void ], ], ], - ]); + ]);*/ } } diff --git a/src/Form/Type/TermsTranslationType.php b/src/Form/Type/TermsTranslationType.php index 5a9812a..3bbb26c 100644 --- a/src/Form/Type/TermsTranslationType.php +++ b/src/Form/Type/TermsTranslationType.php @@ -17,6 +17,11 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ->add('name', TextType::class, [ 'label' => 'setono_sylius_terms.form.terms.name', 'help' => 'setono_sylius_terms.form.terms.name_help', + 'attr' => [ + 'data-action' => 'live#action', + 'data-live-action-param' => 'on(change)|generateTermsSlug', + 'data-live-locale-code-param' => $builder->getPropertyPath()?->getElement(0), + ], ]) ->add('slug', TextType::class, [ 'label' => 'setono_sylius_terms.form.terms.slug', diff --git a/src/Resources/config/app/config.yaml b/src/Resources/config/app/config.yaml new file mode 100644 index 0000000..a60ae26 --- /dev/null +++ b/src/Resources/config/app/config.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "@SetonoSyliusTermsPlugin/Resources/config/twig/twig_hooks.yaml" } diff --git a/src/Resources/config/routes/admin.yaml b/src/Resources/config/routes/admin.yaml index c232c0a..d02b462 100644 --- a/src/Resources/config/routes/admin.yaml +++ b/src/Resources/config/routes/admin.yaml @@ -2,14 +2,8 @@ setono_sylius_terms_admin_terms: resource: | alias: setono_sylius_terms.terms section: admin - templates: "@SyliusAdmin\\Crud" + templates: "@SyliusAdmin\\shared\\crud" redirect: update + except: [show] grid: setono_sylius_terms_terms - vars: - all: - subheader: setono_sylius_terms.ui.manage_terms - templates: - form: "@SetonoSyliusTermsPlugin/admin/terms/_form.html.twig" - index: - icon: 'check circle outline' type: sylius.resource diff --git a/src/Resources/config/services/twig.xml b/src/Resources/config/services/twig.xml index 54af49f..0b8a35e 100644 --- a/src/Resources/config/services/twig.xml +++ b/src/Resources/config/services/twig.xml @@ -14,5 +14,19 @@ + + + + + %setono_sylius_terms.model.terms.class% + Setono\SyliusTermsPlugin\Form\Type\TermsType + + + + + + + + diff --git a/src/Resources/config/twig/twig_hooks.yaml b/src/Resources/config/twig/twig_hooks.yaml new file mode 100644 index 0000000..3645723 --- /dev/null +++ b/src/Resources/config/twig/twig_hooks.yaml @@ -0,0 +1,34 @@ +sylius_twig_hooks: + hooks: + 'sylius_admin.terms.create.content': + form: + component: 'setono_sylius_terms:terms:form' + props: + form: '@=_context.form' + resource: '@=_context.resource' + template: '@SetonoSyliusTermsPlugin/admin/terms/_form.html.twig' + priority: 0 + 'sylius_admin.terms.create.content.form#left': + form: + template: '@SetonoSyliusTermsPlugin/admin/terms/form/left.html.twig' + 'sylius_admin.terms.create.content.form#right': + form: + template: '@SetonoSyliusTermsPlugin/admin/terms/form/right.html.twig' + 'sylius_admin.terms.update.content': + form: + component: 'setono_sylius_terms:terms:form' + props: + form: '@=_context.form' + resource: '@=_context.resource' + template: '@SetonoSyliusTermsPlugin/admin/terms/_form.html.twig' + priority: 0 + 'sylius_admin.terms.update.content.form#left': + form: + template: '@SetonoSyliusTermsPlugin/admin/terms/form/left.html.twig' + 'sylius_admin.terms.update.content.form#right': + form: + template: '@SetonoSyliusTermsPlugin/admin/terms/form/right.html.twig' + 'sylius_shop.checkout.complete.content.form': + terms: + template: '@SetonoSyliusTermsPlugin/shop/checkout/terms.html.twig' + priority: 50 diff --git a/src/Resources/public/slugger.js b/src/Resources/public/slugger.js deleted file mode 100644 index a0d711a..0000000 --- a/src/Resources/public/slugger.js +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Copied from https://jsfiddle.net/ARTsinn/J4BRX/ - */ -(function () { - - // some defaults - var options = { - sensitive: false, - replacement: "-", - truncate: false - }; - - // regex - var nonWord = /\W/g, - nonAlpha = /[^a-z0-9-]/g, - whitespace = /\s+/g, - trim = /^\s+|\s+$/g; - - // replacement charmap - var map = { - "À": "A", - "Á": "A", - "Â": "A", - "Ã": "A", - "Ä": "A", - "Å": "A", - "Æ": "AE", - "Ç": "C", - "È": "E", - "É": "E", - "Ê": "E", - "Ë": "E", - "Ì": "I", - "Í": "I", - "Î": "I", - "Ï": "I", - "Ð": "D", - "Ñ": "N", - "Ò": "O", - "Ó": "O", - "Ô": "O", - "Õ": "O", - "Ö": "O", - "Ø": "O", - "Ù": "U", - "Ú": "U", - "Û": "U", - "Ü": "U", - "Ý": "Y", - "ß": "s", - "à": "a", - "á": "a", - "â": "a", - "ã": "a", - "ä": "a", - "å": "a", - "æ": "ae", - "ç": "c", - "è": "e", - "é": "e", - "ê": "e", - "ë": "e", - "ì": "i", - "í": "i", - "î": "i", - "ï": "i", - "ñ": "n", - "ò": "o", - "ó": "o", - "ô": "o", - "õ": "o", - "ö": "o", - "ø": "o", - "ù": "u", - "ú": "u", - "û": "u", - "ü": "u", - "ý": "y", - "ÿ": "y", - "Ā": "A", - "ā": "a", - "Ă": "A", - "ă": "a", - "Ą": "A", - "ą": "a", - "Ć": "C", - "ć": "c", - "Ĉ": "C", - "ĉ": "c", - "Ċ": "C", - "ċ": "c", - "Č": "C", - "č": "c", - "Ď": "D", - "ď": "d", - "Đ": "D", - "đ": "d", - "Ē": "E", - "ē": "e", - "Ĕ": "E", - "ĕ": "e", - "Ė": "E", - "ė": "e", - "Ę": "E", - "ę": "e", - "Ě": "E", - "ě": "e", - "Ĝ": "G", - "ĝ": "g", - "Ğ": "G", - "ğ": "g", - "Ġ": "G", - "ġ": "g", - "Ģ": "G", - "ģ": "g", - "Ĥ": "H", - "ĥ": "h", - "Ħ": "H", - "ħ": "h", - "Ĩ": "I", - "ĩ": "i", - "Ī": "I", - "ī": "i", - "Ĭ": "I", - "ĭ": "i", - "Į": "I", - "į": "i", - "İ": "I", - "ı": "i", - "IJ": "IJ", - "ij": "ij", - "Ĵ": "J", - "ĵ": "j", - "Ķ": "K", - "ķ": "k", - "Ĺ": "L", - "ĺ": "l", - "Ļ": "L", - "ļ": "l", - "Ľ": "L", - "ľ": "l", - "Ŀ": "L", - "ŀ": "l", - "Ł": "l", - "ł": "l", - "Ń": "N", - "ń": "n", - "Ņ": "N", - "ņ": "n", - "Ň": "N", - "ň": "n", - "ʼn": "n", - "Ō": "O", - "ō": "o", - "Ŏ": "O", - "ŏ": "o", - "Ő": "O", - "ő": "o", - "Œ": "OE", - "œ": "oe", - "Ŕ": "R", - "ŕ": "r", - "Ŗ": "R", - "ŗ": "r", - "Ř": "R", - "ř": "r", - "Ś": "S", - "ś": "s", - "Ŝ": "S", - "ŝ": "s", - "Ş": "S", - "ş": "s", - "Š": "S", - "š": "s", - "Ţ": "T", - "ţ": "t", - "Ť": "T", - "ť": "t", - "Ŧ": "T", - "ŧ": "t", - "Ũ": "U", - "ũ": "u", - "Ū": "U", - "ū": "u", - "Ŭ": "U", - "ŭ": "u", - "Ů": "U", - "ů": "u", - "Ű": "U", - "ű": "u", - "Ų": "U", - "ų": "u", - "Ŵ": "W", - "ŵ": "w", - "Ŷ": "Y", - "ŷ": "y", - "Ÿ": "Y", - "Ź": "Z", - "ź": "z", - "Ż": "Z", - "ż": "z", - "Ž": "Z", - "ž": "z", - "ſ": "s", - "ƒ": "f", - "Ơ": "O", - "ơ": "o", - "Ư": "U", - "ư": "u", - "Ǎ": "A", - "ǎ": "a", - "Ǐ": "I", - "ǐ": "i", - "Ǒ": "O", - "ǒ": "o", - "Ǔ": "U", - "ǔ": "u", - "Ǖ": "U", - "ǖ": "u", - "Ǘ": "U", - "ǘ": "u", - "Ǚ": "U", - "ǚ": "u", - "Ǜ": "U", - "ǜ": "u", - "Ǻ": "A", - "ǻ": "a", - "Ǽ": "AE", - "ǽ": "ae", - "Ǿ": "O", - "ǿ": "o" - }; - - // replacer - var mapping = function (c) { - return map[c] || c; - }; - - - /** - * Normalise a string replacing foreign characters - * whitespace and all other illegals - * @param {String} str - * @param {Object} opts - */ - - this.slugger = function (str, opts) { - if (!str || typeof str !== "string") return; - - // populate some defaults - if (opts) for (var key in opts) options[key] = opts[key]; - - // case-sensitive or not - if (!options.sensitive) str = str.toLowerCase(); - - str = str - - // trim whitespace - .replace(trim, "") - - // swap foreign characters - .replace(nonWord, mapping) - - // replace whitespace - .replace(whitespace, options.replacement) - - // remove everything but alphanumeric characters and dashes - .replace(nonAlpha, "") - - // replace multiple instances of the replacement character with a single instance - .replace(new RegExp(`[${options.replacement}]+`, 'g'), options.replacement) - ; - - // smart truncate - if (options.truncate && str.length > options.truncate) { - var cut = str.indexOf("-", options.truncate); - str = cut === -1 ? str : str.slice(0, cut); - } - - return str; - }; -}()); diff --git a/src/Resources/public/slugify-terms-name.js b/src/Resources/public/slugify-terms-name.js deleted file mode 100644 index 48bcd7d..0000000 --- a/src/Resources/public/slugify-terms-name.js +++ /dev/null @@ -1,8 +0,0 @@ -document.addEventListener('DOMContentLoaded', function (e) { - document.querySelectorAll('input[name*="setono_sylius_terms_terms[translations]"][name*="[name]"]').forEach(function (input) { - input.addEventListener('input', function (event) { - const element = event.currentTarget; - element.closest('.content').querySelector('[name*="[slug]"]').value = slugger(element.value); - }); - }); -}); diff --git a/src/Resources/views/admin/terms/_form.html.twig b/src/Resources/views/admin/terms/_form.html.twig index 27a7c6c..a187b27 100644 --- a/src/Resources/views/admin/terms/_form.html.twig +++ b/src/Resources/views/admin/terms/_form.html.twig @@ -1,20 +1,33 @@ -{% from '@SyliusAdmin/Macro/translationForm.html.twig' import translationFormWithSlug %} +{% if form is not defined %} + {% set form = hookable_metadata.context.form %} +{% endif %} -
-
- {{ form_errors(form) }} +{% if resource is not defined %} + {% set resource = hookable_metadata.context.resource|default(null) %} +{% endif %} -
- {{ form_row(form.code) }} - {{ form_row(form.enabled) }} -
- {{ form_row(form.forms) }} - {{ form_row(form.channels) }} -
+{% form_theme form '@SyliusAdmin/shared/form_theme.html.twig' %} +
+ {{ form_start(form, {'attr': {'novalidate': 'novalidate', 'id': form.vars.id}}) }} + {% if hookable_metadata.configuration.method is defined %} + + {% elseif form.vars.data.id|default(null) is not null %} + + {% endif %} + {{ form_errors(form) }} + {{ form_widget(form._token) }} +
+
+
+ {% hook 'form#left' with { form, resource } %} +
+
+
+
+ {% hook 'form#right' with { form, resource } %} +
-
- {{ translationFormWithSlug(form.translations, '@SyliusAdmin/Product/_slugField.html.twig', terms) }} -
+ {{ form_end(form, {render_rest: hookable_metadata.configuration.render_rest|default(false)}) }}
diff --git a/src/Resources/views/admin/terms/_javascripts.html.twig b/src/Resources/views/admin/terms/_javascripts.html.twig deleted file mode 100644 index f650404..0000000 --- a/src/Resources/views/admin/terms/_javascripts.html.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% include '@SyliusUi/_javascripts.html.twig' with {'path': '/bundles/setonosyliustermsplugin/slugger.js'} %} -{% include '@SyliusUi/_javascripts.html.twig' with {'path': '/bundles/setonosyliustermsplugin/slugify-terms-name.js'} %} diff --git a/src/Resources/views/admin/terms/form/left.html.twig b/src/Resources/views/admin/terms/form/left.html.twig new file mode 100644 index 0000000..95cdb19 --- /dev/null +++ b/src/Resources/views/admin/terms/form/left.html.twig @@ -0,0 +1,18 @@ +
+
+
{{ form_row(hookable_metadata.context.form.code) }}
+
+
+
+
+
{{ form_row(hookable_metadata.context.form.enabled) }}
+
+
+
+
+
{{ form_row(hookable_metadata.context.form.forms) }}
+
+
+
{{ form_row(hookable_metadata.context.form.channels) }}
+
+
diff --git a/src/Resources/views/admin/terms/form/right.html.twig b/src/Resources/views/admin/terms/form/right.html.twig new file mode 100644 index 0000000..e1da9a3 --- /dev/null +++ b/src/Resources/views/admin/terms/form/right.html.twig @@ -0,0 +1,5 @@ +
+
+ {{ form_row(hookable_metadata.context.form.translations) }} +
+
diff --git a/src/Resources/views/shop/checkout/terms.html.twig b/src/Resources/views/shop/checkout/terms.html.twig new file mode 100644 index 0000000..7fd99c9 --- /dev/null +++ b/src/Resources/views/shop/checkout/terms.html.twig @@ -0,0 +1,3 @@ +{% if hookable_metadata.context.form.terms is defined %} + {{ form_row(hookable_metadata.context.form.terms) }} +{% endif %} diff --git a/src/Twig/Component/TermsComponent.php b/src/Twig/Component/TermsComponent.php new file mode 100644 index 0000000..40bd7f5 --- /dev/null +++ b/src/Twig/Component/TermsComponent.php @@ -0,0 +1,52 @@ + */ + use ResourceFormComponentTrait; + + /** + * @param RepositoryInterface $productRepository + */ + public function __construct( + RepositoryInterface $productRepository, + FormFactoryInterface $formFactory, + string $resourceClass, + string $formClass, + protected readonly SlugGeneratorInterface $slugGenerator, + ) { + $this->initialize($productRepository, $formFactory, $resourceClass, $formClass); + } + + #[LiveAction] + public function generateTermsSlug(#[LiveArg] string $localeCode = ''): void + { + $this->formValues['translations'][$localeCode]['slug'] = $this->slugGenerator->generate((string) $this->formValues['translations'][$localeCode]['name']); + } + + protected function getDataModelValue(): string + { + return 'norender|*'; + } +} diff --git a/tests/Application/.env b/tests/Application/.env index fd5fd3d..381fb66 100644 --- a/tests/Application/.env +++ b/tests/Application/.env @@ -1,16 +1,5 @@ -# In all environments, the following files are loaded if they exist, -# the later taking precedence over the former: -# -# * .env contains default values for the environment variables needed by the app -# * .env.local uncommitted file with local overrides -# * .env.$APP_ENV committed environment-specific defaults -# * .env.$APP_ENV.local uncommitted environment-specific overrides -# -# Real environment variables win over .env files. -# -# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. -# -# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# This file is a "template" of which env vars needs to be defined in your configuration or in an .env file +# Set variables here that may be different on each deployment target of the app, e.g. development, staging, production. # https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration ###> symfony/framework-bundle ### @@ -20,7 +9,7 @@ APP_SECRET=EDITME ###< symfony/framework-bundle ### ###> doctrine/doctrine-bundle ### -# Format described at https://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url # For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls DATABASE_URL=mysql://root@127.0.0.1/setono_sylius_terms_%kernel.environment%?serverVersion=5.7 @@ -32,16 +21,15 @@ JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem JWT_PASSPHRASE=acme_plugin_development ###< lexik/jwt-authentication-bundle ### +###> symfony/mailer ### +MAILER_DSN=null://null +###< symfony/mailer ### + ###> symfony/messenger ### -# Choose one of the transports below -# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages -MESSENGER_TRANSPORT_DSN=doctrine://default -# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages +SYLIUS_MESSENGER_TRANSPORT_MAIN_DSN=doctrine://default +SYLIUS_MESSENGER_TRANSPORT_MAIN_FAILED_DSN=doctrine://default?queue_name=main_failed +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_DSN=doctrine://default?queue_name=catalog_promotion_removal +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_FAILED_DSN=doctrine://default?queue_name=catalog_promotion_removal_failed +SYLIUS_MESSENGER_TRANSPORT_PAYMENT_REQUEST_DSN=doctrine://default?queue_name=payment_request +SYLIUS_MESSENGER_TRANSPORT_PAYMENT_REQUEST_FAILED_DSN=doctrine://default?queue_name=payment_request_failed ###< symfony/messenger ### - -###> symfony/swiftmailer-bundle ### -# For Gmail as a transport, use: "gmail://username:password@localhost" -# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" -# Delivery is disabled by default via "null://localhost" -MAILER_DSN=null://localhost -###< symfony/swiftmailer-bundle ### diff --git a/tests/Application/.env.test b/tests/Application/.env.test index 2d53b11..322e373 100644 --- a/tests/Application/.env.test +++ b/tests/Application/.env.test @@ -1,2 +1,13 @@ APP_SECRET='ch4mb3r0f5ecr3ts' -KERNEL_CLASS='Setono\SyliusTermsPlugin\Tests\Application\Kernel' + +KERNEL_CLASS='Tests\Setono\SyliusTermsPlugin\Application\Kernel' + +###> symfony/messenger ### +# Sync transport turned for testing env for the ease of testing +SYLIUS_MESSENGER_TRANSPORT_MAIN_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_MAIN_FAILED_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_FAILED_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_PAYMENT_REQUEST_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_PAYMENT_REQUEST_FAILED_DSN=sync:// +###< symfony/messenger ### diff --git a/tests/Application/.eslintrc.js b/tests/Application/.eslintrc.js index dfddb25..92c4cee 100644 --- a/tests/Application/.eslintrc.js +++ b/tests/Application/.eslintrc.js @@ -1,20 +1,20 @@ module.exports = { - extends: 'airbnb-base', - env: { - node: true, - }, - rules: { - 'object-shorthand': ['error', 'always', { - avoidQuotes: true, - avoidExplicitReturnArrows: true, - }], - 'function-paren-newline': ['error', 'consistent'], - 'max-len': ['warn', 120, 2, { - ignoreUrls: true, - ignoreComments: false, - ignoreRegExpLiterals: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }], - }, + extends: 'airbnb-base', + env: { + node: true, + }, + rules: { + 'object-shorthand': ['error', 'always', { + avoidQuotes: true, + avoidExplicitReturnArrows: true, + }], + 'function-paren-newline': ['error', 'consistent'], + 'max-len': ['warn', 120, 2, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }], + }, }; diff --git a/tests/Application/Kernel.php b/tests/Application/Kernel.php index 374aaf0..df15d5a 100644 --- a/tests/Application/Kernel.php +++ b/tests/Application/Kernel.php @@ -2,72 +2,12 @@ declare(strict_types=1); -namespace Setono\SyliusTermsPlugin\Tests\Application; +namespace Tests\Setono\SyliusTermsPlugin\Application; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; -use Symfony\Component\HttpKernel\Bundle\BundleInterface; use Symfony\Component\HttpKernel\Kernel as BaseKernel; -use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; final class Kernel extends BaseKernel { use MicroKernelTrait; - - private const CONFIG_EXTS = '.{php,xml,yaml,yml}'; - - public function getCacheDir(): string - { - return $this->getProjectDir() . '/var/cache/' . $this->environment; - } - - public function getLogDir(): string - { - return $this->getProjectDir() . '/var/log'; - } - - public function registerBundles(): iterable - { - foreach ($this->getConfigurationDirectories() as $confDir) { - $bundlesFile = $confDir . '/bundles.php'; - if (false === is_file($bundlesFile)) { - continue; - } - yield from $this->registerBundlesFromFile($bundlesFile); - } - } - - protected function configureRoutes(RoutingConfigurator $routes): void - { - foreach ($this->getConfigurationDirectories() as $confDir) { - $this->loadRoutesConfiguration($routes, $confDir); - } - } - - private function loadRoutesConfiguration(RoutingConfigurator $routes, string $confDir): void - { - $routes->import($confDir . '/{routes}/*' . self::CONFIG_EXTS); - $routes->import($confDir . '/{routes}/' . $this->environment . '/**/*' . self::CONFIG_EXTS); - $routes->import($confDir . '/{routes}' . self::CONFIG_EXTS); - } - - /** - * @return BundleInterface[] - */ - private function registerBundlesFromFile(string $bundlesFile): iterable - { - $contents = require $bundlesFile; - foreach ($contents as $class => $envs) { - if (isset($envs['all']) || isset($envs[$this->environment])) { - yield new $class(); - } - } - } - - /** - * @return string[] - */ - private function getConfigurationDirectories(): iterable - { - yield $this->getProjectDir() . '/config'; - } } diff --git a/tests/Application/assets/admin/entry.js b/tests/Application/assets/admin/entry.js deleted file mode 100644 index 635f5ac..0000000 --- a/tests/Application/assets/admin/entry.js +++ /dev/null @@ -1 +0,0 @@ -import 'sylius/bundle/AdminBundle/Resources/private/entry'; diff --git a/tests/Application/assets/admin/entrypoint.js b/tests/Application/assets/admin/entrypoint.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/assets/shop/entry.js b/tests/Application/assets/shop/entry.js deleted file mode 100644 index aadc317..0000000 --- a/tests/Application/assets/shop/entry.js +++ /dev/null @@ -1 +0,0 @@ -import 'sylius/bundle/ShopBundle/Resources/private/entry'; diff --git a/tests/Application/assets/shop/entrypoint.js b/tests/Application/assets/shop/entrypoint.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/bin/console b/tests/Application/bin/console index 5e2dc5f..ec913d3 100755 --- a/tests/Application/bin/console +++ b/tests/Application/bin/console @@ -1,7 +1,7 @@ #!/usr/bin/env php bootEnv(dirname(__DIR__) . '/.env'); + + return; } else { // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); + (new Dotenv(true))->loadEnv(dirname(__DIR__) . '/.env'); } $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; diff --git a/tests/Application/config/bundles.php b/tests/Application/config/bundles.php index 4d6ec65..7e99dc0 100644 --- a/tests/Application/config/bundles.php +++ b/tests/Application/config/bundles.php @@ -2,7 +2,7 @@ declare(strict_types=1); -return [ +$bundles = [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], @@ -31,14 +31,8 @@ Sylius\Bundle\ResourceBundle\SyliusResourceBundle::class => ['all' => true], Setono\SyliusTermsPlugin\SetonoSyliusTermsPlugin::class => ['all' => true], Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true], - winzou\Bundle\StateMachineBundle\winzouStateMachineBundle::class => ['all' => true], - Sonata\BlockBundle\SonataBlockBundle::class => ['all' => true], - Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle::class => ['all' => true], - JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], - FOS\RestBundle\FOSRestBundle::class => ['all' => true], Knp\Bundle\GaufretteBundle\KnpGaufretteBundle::class => ['all' => true], Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], - League\FlysystemBundle\FlysystemBundle::class => ['all' => true], Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true], Payum\Bundle\PayumBundle\PayumBundle::class => ['all' => true], Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true], @@ -50,12 +44,26 @@ Sylius\Bundle\ShopBundle\SyliusShopBundle::class => ['all' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], - ApiPlatform\Core\Bridge\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], - Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], + FriendsOfBehat\SymfonyExtension\Bundle\FriendsOfBehatSymfonyExtensionBundle::class => ['test' => true, 'test_cached' => true], + ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], Sylius\Bundle\ApiBundle\SyliusApiBundle::class => ['all' => true], + Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], SyliusLabs\DoctrineMigrationsExtraBundle\SyliusLabsDoctrineMigrationsExtraBundle::class => ['all' => true], BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true], - SyliusLabs\Polyfill\Symfony\Security\Bundle\SyliusLabsPolyfillSymfonySecurityBundle::class => ['all' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], - Sylius\Calendar\SyliusCalendarBundle::class => ['all' => true], + League\FlysystemBundle\FlysystemBundle::class => ['all' => true], + Sylius\TwigExtra\Symfony\SyliusTwigExtraBundle::class => ['all' => true], + Sylius\TwigHooks\SyliusTwigHooksBundle::class => ['all' => true], + Symfony\UX\Icons\UXIconsBundle::class => ['all' => true], + Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true], + Symfony\UX\LiveComponent\LiveComponentBundle::class => ['all' => true], + Symfony\UX\Autocomplete\AutocompleteBundle::class => ['all' => true], + Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true], + Sylius\Abstraction\StateMachine\SyliusStateMachineAbstractionBundle::class => ['all' => true], ]; + +if (class_exists(winzou\Bundle\StateMachineBundle\winzouStateMachineBundle::class)) { + $bundles[winzou\Bundle\StateMachineBundle\winzouStateMachineBundle::class] = ['all' => true]; +} + +return $bundles; diff --git a/tests/Application/config/packages/_sylius.yaml b/tests/Application/config/packages/_sylius.yaml index a78e725..b2ba98f 100644 --- a/tests/Application/config/packages/_sylius.yaml +++ b/tests/Application/config/packages/_sylius.yaml @@ -1,5 +1,6 @@ imports: - { resource: "@SyliusCoreBundle/Resources/config/app/config.yml" } + - { resource: "@SyliusPayumBundle/Resources/config/app/config.yaml" } - { resource: "@SyliusAdminBundle/Resources/config/app/config.yml" } - { resource: "@SyliusShopBundle/Resources/config/app/config.yml" } - { resource: "@SyliusApiBundle/Resources/config/app/config.yaml" } diff --git a/tests/Application/config/packages/api_platform.yaml b/tests/Application/config/packages/api_platform.yaml index 26def49..ceb10e7 100644 --- a/tests/Application/config/packages/api_platform.yaml +++ b/tests/Application/config/packages/api_platform.yaml @@ -1,9 +1,10 @@ api_platform: - mapping: - paths: - - '%kernel.project_dir%/../../vendor/sylius/sylius/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources' - - '%kernel.project_dir%/config/api_platform' - patch_formats: - json: ['application/merge-patch+json'] - swagger: - versions: [3] + mapping: + paths: + - '%kernel.project_dir%/../../vendor/sylius/sylius/src/Sylius/Bundle/ApiBundle/Resources/config/api_platform' + - '%kernel.project_dir%/config/api_platform' + - '%kernel.project_dir%/src/Entity' + patch_formats: + json: ['application/merge-patch+json'] + swagger: + versions: [3] diff --git a/tests/Application/config/packages/assets.yaml b/tests/Application/config/packages/assets.yaml index 2468901..73f9d56 100644 --- a/tests/Application/config/packages/assets.yaml +++ b/tests/Application/config/packages/assets.yaml @@ -5,3 +5,7 @@ framework: json_manifest_path: '%kernel.project_dir%/public/build/shop/manifest.json' admin: json_manifest_path: '%kernel.project_dir%/public/build/admin/manifest.json' + app.admin: + json_manifest_path: '%kernel.project_dir%/public/build/app/admin/manifest.json' + app.shop: + json_manifest_path: '%kernel.project_dir%/public/build/app/shop/manifest.json' diff --git a/tests/Application/config/packages/dev/jms_serializer.yaml b/tests/Application/config/packages/dev/jms_serializer.yaml deleted file mode 100644 index 2f32a9b..0000000 --- a/tests/Application/config/packages/dev/jms_serializer.yaml +++ /dev/null @@ -1,12 +0,0 @@ -jms_serializer: - visitors: - json_serialization: - options: - - JSON_PRETTY_PRINT - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION - json_deserialization: - options: - - JSON_PRETTY_PRINT - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION diff --git a/tests/Application/config/packages/doctrine_migrations.yaml b/tests/Application/config/packages/doctrine_migrations.yaml index cdbc01a..ec35649 100644 --- a/tests/Application/config/packages/doctrine_migrations.yaml +++ b/tests/Application/config/packages/doctrine_migrations.yaml @@ -2,3 +2,5 @@ doctrine_migrations: storage: table_storage: table_name: sylius_migrations + migrations_paths: + 'App\Migrations': '%kernel.project_dir%/../../src/Migrations/' diff --git a/tests/Application/config/packages/fos_rest.yaml b/tests/Application/config/packages/fos_rest.yaml deleted file mode 100644 index eaebb27..0000000 --- a/tests/Application/config/packages/fos_rest.yaml +++ /dev/null @@ -1,11 +0,0 @@ -fos_rest: - exception: true - view: - formats: - json: true - xml: true - empty_content: 204 - format_listener: - rules: - - { path: '^/api/v1/.*', priorities: ['json', 'xml'], fallback_format: json, prefer_extension: true } - - { path: '^/', stop: true } diff --git a/tests/Application/config/packages/framework.yaml b/tests/Application/config/packages/framework.yaml index 3df2c0a..9b44501 100644 --- a/tests/Application/config/packages/framework.yaml +++ b/tests/Application/config/packages/framework.yaml @@ -1,9 +1,6 @@ framework: secret: '%env(APP_SECRET)%' - ide: phpstorm - form: - enabled: true - legacy_error_messages: false + form: true csrf_protection: true session: handler_id: ~ diff --git a/tests/Application/config/packages/http_discovery.yaml b/tests/Application/config/packages/http_discovery.yaml new file mode 100644 index 0000000..2a789e7 --- /dev/null +++ b/tests/Application/config/packages/http_discovery.yaml @@ -0,0 +1,10 @@ +services: + Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory' + + http_discovery.psr17_factory: + class: Http\Discovery\Psr17Factory diff --git a/tests/Application/config/packages/jms_serializer.yaml b/tests/Application/config/packages/jms_serializer.yaml deleted file mode 100644 index ed7bc61..0000000 --- a/tests/Application/config/packages/jms_serializer.yaml +++ /dev/null @@ -1,4 +0,0 @@ -jms_serializer: - visitors: - xml_serialization: - format_output: '%kernel.debug%' diff --git a/tests/Application/config/packages/prod/jms_serializer.yaml b/tests/Application/config/packages/prod/jms_serializer.yaml deleted file mode 100644 index c288182..0000000 --- a/tests/Application/config/packages/prod/jms_serializer.yaml +++ /dev/null @@ -1,10 +0,0 @@ -jms_serializer: - visitors: - json_serialization: - options: - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION - json_deserialization: - options: - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION diff --git a/tests/Application/config/packages/security.yaml b/tests/Application/config/packages/security.yaml index 2f5c687..af38e75 100644 --- a/tests/Application/config/packages/security.yaml +++ b/tests/Application/config/packages/security.yaml @@ -1,5 +1,4 @@ security: - enable_authenticator_manager: true providers: sylius_admin_user_provider: id: sylius.admin_user_provider.email_or_name_based @@ -18,6 +17,7 @@ security: context: admin pattern: "%sylius.security.admin_regex%" provider: sylius_admin_user_provider + user_checker: security.user_checker.chain.admin form_login: provider: sylius_admin_user_provider login_path: sylius_admin_login @@ -39,26 +39,28 @@ security: path: sylius_admin_logout target: sylius_admin_login - new_api_admin_user: - pattern: "%sylius.security.new_api_admin_regex%/.*" + api_admin: + pattern: "%sylius.security.api_admin_regex%/.*" provider: sylius_api_admin_user_provider + user_checker: security.user_checker.chain.api_admin stateless: true entry_point: jwt json_login: - check_path: "%sylius.security.new_api_admin_route%/authentication-token" + check_path: "%sylius.security.api_admin_route%/administrators/token" username_path: email password_path: password success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure jwt: true - new_api_shop_user: - pattern: "%sylius.security.new_api_shop_regex%/.*" + api_shop: + pattern: "%sylius.security.api_shop_regex%/.*" provider: sylius_api_shop_user_provider + user_checker: security.user_checker.chain.api_shop stateless: true entry_point: jwt json_login: - check_path: "%sylius.security.new_api_shop_route%/authentication-token" + check_path: "%sylius.security.api_shop_route%/customers/token" username_path: email password_path: password success_handler: lexik_jwt_authentication.handler.authentication_success @@ -70,6 +72,7 @@ security: context: shop pattern: "%sylius.security.shop_regex%" provider: sylius_shop_user_provider + user_checker: security.user_checker.chain.shop form_login: success_handler: sylius.authentication.success_handler failure_handler: sylius.authentication.failure_handler @@ -83,6 +86,12 @@ security: enable_csrf: true csrf_parameter: _csrf_shop_security_token csrf_token_id: shop_authenticate + json_login: + check_path: sylius_shop_json_login_check + username_path: _username + password_path: _password + success_handler: sylius.authentication.success_handler + failure_handler: sylius.authentication.failure_handler remember_me: secret: "%env(APP_SECRET)%" name: APP_SHOP_REMEMBER_ME @@ -93,16 +102,15 @@ security: target: sylius_shop_homepage invalidate_session: false + image_resolver: + pattern: ^/media/cache/resolve + security: false + dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false access_control: - - { path: "%sylius.security.admin_regex%/_partial", role: PUBLIC_ACCESS, ips: [127.0.0.1, ::1] } - - { path: "%sylius.security.admin_regex%/_partial", role: ROLE_NO_ACCESS } - - { path: "%sylius.security.shop_regex%/_partial", role: PUBLIC_ACCESS, ips: [127.0.0.1, ::1] } - - { path: "%sylius.security.shop_regex%/_partial", role: ROLE_NO_ACCESS } - - { path: "%sylius.security.admin_regex%/forgotten-password", role: PUBLIC_ACCESS } - { path: "%sylius.security.admin_regex%/login", role: PUBLIC_ACCESS } @@ -114,9 +122,9 @@ security: - { path: "%sylius.security.admin_regex%", role: ROLE_ADMINISTRATION_ACCESS } - { path: "%sylius.security.shop_regex%/account", role: ROLE_USER } - - { path: "%sylius.security.new_api_admin_route%/reset-password-requests", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS } - - { path: "%sylius.security.new_api_admin_route%/authentication-token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_user_account_regex%/.*", role: ROLE_USER } - - { path: "%sylius.security.new_api_shop_route%/authentication-token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_shop_regex%/.*", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_admin_route%/administrators/reset-password", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_admin_regex%/.*", role: ROLE_API_ACCESS } + - { path: "%sylius.security.api_admin_route%/administrators/token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_shop_account_regex%/.*", role: ROLE_USER } + - { path: "%sylius.security.api_shop_route%/customers/token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_shop_regex%/.*", role: PUBLIC_ACCESS } diff --git a/tests/Application/config/packages/setono_sylius_terms.yaml b/tests/Application/config/packages/setono_sylius_terms.yaml deleted file mode 100644 index 3e571d3..0000000 --- a/tests/Application/config/packages/setono_sylius_terms.yaml +++ /dev/null @@ -1,2 +0,0 @@ -imports: - - { resource: "@SetonoSyliusTermsPlugin/Resources/config/app/fixtures.yaml" } diff --git a/tests/Application/config/packages/sylius_state_machine_abstraction.yaml b/tests/Application/config/packages/sylius_state_machine_abstraction.yaml new file mode 100644 index 0000000..7f43c0b --- /dev/null +++ b/tests/Application/config/packages/sylius_state_machine_abstraction.yaml @@ -0,0 +1,6 @@ +parameters: + test_default_state_machine_adapter: 'symfony_workflow' + test_sylius_state_machine_adapter: '%env(string:default:test_default_state_machine_adapter:TEST_SYLIUS_STATE_MACHINE_ADAPTER)%' + +sylius_state_machine_abstraction: + default_adapter: '%test_sylius_state_machine_adapter%' diff --git a/tests/Application/config/packages/test/framework.yaml b/tests/Application/config/packages/test/framework.yaml index fc1d3c1..e71603c 100644 --- a/tests/Application/config/packages/test/framework.yaml +++ b/tests/Application/config/packages/test/framework.yaml @@ -2,3 +2,10 @@ framework: test: ~ session: storage_factory_id: session.storage.factory.mock_file + + mailer: + dsn: '%env(MAILER_DSN)%' + cache: + pools: + test.mailer_pool: + adapter: cache.adapter.filesystem diff --git a/tests/Application/config/packages/test/security.yaml b/tests/Application/config/packages/test/security.yaml deleted file mode 100644 index 4071d31..0000000 --- a/tests/Application/config/packages/test/security.yaml +++ /dev/null @@ -1,6 +0,0 @@ -security: - password_hashers: - Sylius\Component\User\Model\UserInterface: - algorithm: argon2i - time_cost: 3 - memory_cost: 10 diff --git a/tests/Application/config/packages/test_cached/fos_rest.yaml b/tests/Application/config/packages/test_cached/fos_rest.yaml deleted file mode 100644 index 2b4189d..0000000 --- a/tests/Application/config/packages/test_cached/fos_rest.yaml +++ /dev/null @@ -1,3 +0,0 @@ -fos_rest: - exception: - debug: true diff --git a/tests/Application/config/packages/test_cached/framework.yaml b/tests/Application/config/packages/test_cached/framework.yaml index 76d7e5e..e9dd6ee 100644 --- a/tests/Application/config/packages/test_cached/framework.yaml +++ b/tests/Application/config/packages/test_cached/framework.yaml @@ -1,4 +1,2 @@ -framework: - test: ~ - session: - storage_id: session.storage.mock_file +imports: + - { resource: ../test/framework.yaml } diff --git a/tests/Application/config/packages/test_cached/security.yaml b/tests/Application/config/packages/test_cached/security.yaml deleted file mode 100644 index 21cc377..0000000 --- a/tests/Application/config/packages/test_cached/security.yaml +++ /dev/null @@ -1,3 +0,0 @@ -security: - encoders: - sha512: sha512 diff --git a/tests/Application/config/packages/twig_extensions.yaml b/tests/Application/config/packages/twig_extensions.yaml deleted file mode 100644 index 0881cc9..0000000 --- a/tests/Application/config/packages/twig_extensions.yaml +++ /dev/null @@ -1,11 +0,0 @@ -services: - _defaults: - public: false - autowire: true - autoconfigure: true - - # Uncomment any lines below to activate that Twig extension - #Twig\Extensions\ArrayExtension: ~ - #Twig\Extensions\DateExtension: ~ - #Twig\Extensions\IntlExtension: ~ - #Twig\Extensions\TextExtension: ~ diff --git a/tests/Application/config/packages/validator.yaml b/tests/Application/config/packages/validator.yaml index 61807db..a695e1a 100644 --- a/tests/Application/config/packages/validator.yaml +++ b/tests/Application/config/packages/validator.yaml @@ -1,3 +1,3 @@ framework: validation: - enable_annotations: true + email_validation_mode: html5 diff --git a/tests/Application/config/packages/webpack_encore.yaml b/tests/Application/config/packages/webpack_encore.yaml index 9bee248..23ddaa2 100644 --- a/tests/Application/config/packages/webpack_encore.yaml +++ b/tests/Application/config/packages/webpack_encore.yaml @@ -3,3 +3,5 @@ webpack_encore: builds: shop: '%kernel.project_dir%/public/build/shop' admin: '%kernel.project_dir%/public/build/admin' + app.admin: '%kernel.project_dir%/public/build/app/admin' + app.shop: '%kernel.project_dir%/public/build/app/shop' diff --git a/tests/Application/config/packages/workflow.yaml b/tests/Application/config/packages/workflow.yaml new file mode 100644 index 0000000..2a716ff --- /dev/null +++ b/tests/Application/config/packages/workflow.yaml @@ -0,0 +1,2 @@ +framework: + workflows: ~ diff --git a/tests/Application/config/routes.yaml b/tests/Application/config/routes.yaml index e69de29..c6596e1 100644 --- a/tests/Application/config/routes.yaml +++ b/tests/Application/config/routes.yaml @@ -0,0 +1,3 @@ +setono_sylius_redirect_admin: + resource: "@SetonoSyliusTermsPlugin/Resources/config/admin_routing.yaml" + prefix: /admin diff --git a/tests/Application/config/routes/setono_sylius_terms.yaml b/tests/Application/config/routes/setono_sylius_terms.yaml index dd4189d..3cdd3b8 100644 --- a/tests/Application/config/routes/setono_sylius_terms.yaml +++ b/tests/Application/config/routes/setono_sylius_terms.yaml @@ -1,2 +1,2 @@ setono_sylius_terms: - resource: "@SetonoSyliusTermsPlugin/Resources/config/routes.yaml" + resource: "@SetonoSyliusTermsPlugin/Resources/config/routes.yaml" diff --git a/tests/Application/config/routes/sylius_api.yaml b/tests/Application/config/routes/sylius_api.yaml index ae01ffc..a7504e8 100644 --- a/tests/Application/config/routes/sylius_api.yaml +++ b/tests/Application/config/routes/sylius_api.yaml @@ -1,3 +1,3 @@ sylius_api: resource: "@SyliusApiBundle/Resources/config/routing.yml" - prefix: "%sylius.security.new_api_route%" + prefix: "%sylius.security.api_route%" diff --git a/tests/Application/config/routes/sylius_shop.yaml b/tests/Application/config/routes/sylius_shop.yaml index 22e7a4a..8e3dd42 100644 --- a/tests/Application/config/routes/sylius_shop.yaml +++ b/tests/Application/config/routes/sylius_shop.yaml @@ -5,13 +5,16 @@ sylius_shop: _locale: ^[A-Za-z]{2,4}(_([A-Za-z]{4}|[0-9]{3}))?(_([A-Za-z]{2}|[0-9]{3}))?$ sylius_shop_payum: - resource: "@SyliusShopBundle/Resources/config/routing/payum.yml" + resource: "@SyliusPayumBundle/Resources/config/routing/integrations/sylius_shop.yaml" + +sylius_payment_notify: + resource: "@SyliusPaymentBundle/Resources/config/routing/integrations/sylius.yaml" sylius_shop_default_locale: path: / methods: [GET] defaults: - _controller: sylius.controller.shop.locale_switch::switchAction + _controller: sylius_shop.controller.locale_switch::switchAction # see https://web.dev/change-password-url/ sylius_shop_request_password_reset_token_redirect: diff --git a/tests/Application/config/services_test.yaml b/tests/Application/config/services_test.yaml new file mode 100644 index 0000000..d072d89 --- /dev/null +++ b/tests/Application/config/services_test.yaml @@ -0,0 +1,8 @@ +imports: + - { resource: "../../../vendor/sylius/sylius/src/Sylius/Behat/Resources/config/services.xml" } + - { resource: "../../Behat/Resources/services.xml" } + +# workaround needed for strange "test.client.history" problem +# see https://github.com/FriendsOfBehat/SymfonyExtension/issues/88 +services: + Symfony\Component\BrowserKit\AbstractBrowser: '@test.client' diff --git a/tests/Application/config/services_test_cached.yaml b/tests/Application/config/services_test_cached.yaml new file mode 100644 index 0000000..0de380e --- /dev/null +++ b/tests/Application/config/services_test_cached.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "services_test.yaml" } diff --git a/tests/Application/package.json b/tests/Application/package.json index 8f62c4c..b91df2a 100644 --- a/tests/Application/package.json +++ b/tests/Application/package.json @@ -1,30 +1,20 @@ { - "dependencies": { - "chart.js": "^3.9", - "jquery": "^3.6", - "jquery.dirtyforms": "^2.0", - "lightbox2": "^2.9", - "semantic-ui-css": "^2.2", - "slick-carousel": "^1.8" - }, - "devDependencies": { - "@symfony/webpack-encore": "^1.8", - "eslint": "^8.18", - "eslint-config-airbnb-base": "^15.0", - "eslint-import-resolver-babel-module": "^5.3", - "eslint-plugin-import": "^2.26", - "node-sass": "^7.0", - "sass-loader": "^12.0" - }, - "scripts": { - "dev": "encore dev", - "build": "encore production", - "watch": "encore dev --watch" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Sylius/Sylius.git" - }, - "author": "Paweł Jędrzejewski", - "license": "MIT" + "license": "UNLICENSED", + "scripts": { + "build": "encore dev", + "build:prod": "encore production", + "watch": "encore dev --watch" + }, + "dependencies": { + "@sylius-ui/admin": "file:../../vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle", + "@sylius-ui/shop": "file:../../vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle", + "@symfony/ux-autocomplete": "file:../../vendor/symfony/ux-autocomplete/assets", + "@symfony/ux-live-component": "file:../../vendor/symfony/ux-live-component/assets" + }, + "devDependencies": { + "@hotwired/stimulus": "^3.0.0", + "@symfony/stimulus-bridge": "^3.2.0", + "@symfony/webpack-encore": "^5.0.1", + "tom-select": "^2.2.2" + } } diff --git a/tests/Application/public/index.php b/tests/Application/public/index.php index 2160592..629b356 100644 --- a/tests/Application/public/index.php +++ b/tests/Application/public/index.php @@ -2,9 +2,9 @@ declare(strict_types=1); -use Setono\SyliusTermsPlugin\Tests\Application\Kernel; use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; +use Tests\Setono\SyliusTermsPlugin\Application\Kernel; require dirname(__DIR__) . '/config/bootstrap.php'; diff --git a/tests/Application/public/media/image/.gitignore b/tests/Application/public/media/image/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/src/Entity/.gitignore b/tests/Application/src/Entity/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/tests/Application/templates/bundles/SetonoSyliusTermsPlugin/shop/terms/show/eula_us.html.twig b/tests/Application/templates/bundles/SetonoSyliusTermsPlugin/shop/terms/show/eula_us.html.twig deleted file mode 100644 index 1c09e0f..0000000 --- a/tests/Application/templates/bundles/SetonoSyliusTermsPlugin/shop/terms/show/eula_us.html.twig +++ /dev/null @@ -1,20 +0,0 @@ -{% extends '@SyliusShop/layout.html.twig' %} - -{%- block title -%} - {{ terms.name }} -{%- endblock -%} - -{% block content %} - {% include '@SetonoSyliusTermsPlugin/shop/terms/show/_breadcrumb.html.twig' %} - - - -
-
-

NOTICE: This is a special template only for the EULA US terms

-

{{ terms.name }}

- - {{ terms.content|raw }} -
-
-{% endblock %} diff --git a/tests/Application/templates/bundles/SyliusAdminBundle/_logo.html.twig b/tests/Application/templates/bundles/SyliusAdminBundle/_logo.html.twig index 1b65d7f..1d9fa7d 100644 --- a/tests/Application/templates/bundles/SyliusAdminBundle/_logo.html.twig +++ b/tests/Application/templates/bundles/SyliusAdminBundle/_logo.html.twig @@ -1,5 +1,5 @@
- Sylius +
diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig deleted file mode 100644 index f4bd66e..0000000 --- a/tests/Application/templates/bundles/SyliusShopBundle/Checkout/Complete/_form.html.twig +++ /dev/null @@ -1,4 +0,0 @@ -{{ form_row(form.notes, {'attr': {'rows': 3}}) }} -{% if form.terms is defined %} - {{ form_row(form.terms) }} -{% endif %} diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig deleted file mode 100644 index bb594f7..0000000 --- a/tests/Application/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig +++ /dev/null @@ -1,2 +0,0 @@ -Sylius - diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_plus.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_plus.html.twig deleted file mode 100644 index 0bf5a06..0000000 --- a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_plus.html.twig +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_your_store.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_your_store.html.twig deleted file mode 100644 index b65f2c1..0000000 --- a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_your_store.html.twig +++ /dev/null @@ -1,9 +0,0 @@ -
-

{{ 'sylius.ui.your_store'|trans }}

- -
diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_header.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_header.html.twig new file mode 100644 index 0000000..915d0a8 --- /dev/null +++ b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_header.html.twig @@ -0,0 +1,5 @@ + diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig deleted file mode 100644 index 39110d6..0000000 --- a/tests/Application/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/tests/Application/webpack.config.js b/tests/Application/webpack.config.js index fae1429..b19eb22 100644 --- a/tests/Application/webpack.config.js +++ b/tests/Application/webpack.config.js @@ -1,47 +1,48 @@ const path = require('path'); const Encore = require('@symfony/webpack-encore'); -const syliusBundles = path.resolve(__dirname, '../../vendor/sylius/sylius/src/Sylius/Bundle/'); -const uiBundleScripts = path.resolve(syliusBundles, 'UiBundle/Resources/private/js/'); -const uiBundleResources = path.resolve(syliusBundles, 'UiBundle/Resources/private/'); +const SyliusAdmin = require('@sylius-ui/admin'); +const SyliusShop = require('@sylius-ui/shop'); + +// Admin config +const adminConfig = SyliusAdmin.getWebpackConfig(path.resolve(__dirname)); // Shop config +const shopConfig = SyliusShop.getWebpackConfig(path.resolve(__dirname)); + +// App shop config Encore - .setOutputPath('public/build/shop/') - .setPublicPath('/build/shop') - .addEntry('shop-entry', './assets/shop/entry.js') - .disableSingleRuntimeChunk() - .cleanupOutputBeforeBuild() - .enableSourceMaps(!Encore.isProduction()) - .enableVersioning(Encore.isProduction()) - .enableSassLoader(); - -const shopConfig = Encore.getWebpackConfig(); - -shopConfig.resolve.alias['sylius/ui'] = uiBundleScripts; -shopConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; -shopConfig.resolve.alias['sylius/bundle'] = syliusBundles; -shopConfig.name = 'shop'; + .setOutputPath('public/build/app/shop') + .setPublicPath('/build/app/shop') + .addEntry('app-shop-entry', './assets/shop/entrypoint.js') + .disableSingleRuntimeChunk() + .cleanupOutputBeforeBuild() + .enableSourceMaps(!Encore.isProduction()) + .enableVersioning(Encore.isProduction()) + .enableSassLoader() +; + +const appShopConfig = Encore.getWebpackConfig(); + +appShopConfig.externals = Object.assign({}, appShopConfig.externals, { window: 'window', document: 'document' }); +appShopConfig.name = 'app.shop'; Encore.reset(); -// Admin config +// App admin config Encore - .setOutputPath('public/build/admin/') - .setPublicPath('/build/admin') - .addEntry('admin-entry', './assets/admin/entry.js') - .disableSingleRuntimeChunk() - .cleanupOutputBeforeBuild() - .enableSourceMaps(!Encore.isProduction()) - .enableVersioning(Encore.isProduction()) - .enableSassLoader(); - -const adminConfig = Encore.getWebpackConfig(); - -adminConfig.resolve.alias['sylius/ui'] = uiBundleScripts; -adminConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; -adminConfig.resolve.alias['sylius/bundle'] = syliusBundles; -adminConfig.externals = Object.assign({}, adminConfig.externals, { window: 'window', document: 'document' }); -adminConfig.name = 'admin'; - -module.exports = [shopConfig, adminConfig]; + .setOutputPath('public/build/app/admin') + .setPublicPath('/build/app/admin') + .addEntry('app-admin-entry', './assets/admin/entrypoint.js') + .disableSingleRuntimeChunk() + .cleanupOutputBeforeBuild() + .enableSourceMaps(!Encore.isProduction()) + .enableVersioning(Encore.isProduction()) + .enableSassLoader(); + +const appAdminConfig = Encore.getWebpackConfig(); + +appAdminConfig.externals = Object.assign({}, appAdminConfig.externals, { window: 'window', document: 'document' }); +appAdminConfig.name = 'app.admin'; + +module.exports = [shopConfig, adminConfig, appShopConfig, appAdminConfig]; diff --git a/tests/Behat/Resources/services.xml b/tests/Behat/Resources/services.xml new file mode 100644 index 0000000..8996f62 --- /dev/null +++ b/tests/Behat/Resources/services.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/Behat/Resources/suites.yml b/tests/Behat/Resources/suites.yml new file mode 100644 index 0000000..4a055e7 --- /dev/null +++ b/tests/Behat/Resources/suites.yml @@ -0,0 +1,4 @@ +# Put your Behat suites definitions here + +default: + suites: