├── .env ├── .gitignore ├── README.md ├── _tuts ├── 2ndcontroller-add-cart-list-controller.diff ├── 2ndcontroller-ajax-to-refresh-cart-list.diff ├── 2ndcontroller-css-fade-out.diff ├── 2ndcontroller-dispatch-an-event.diff ├── 2ndcontroller-listen-to-event.diff ├── 2ndcontroller-refactor-cart-to-partial.diff ├── 2ndcontroller-remove-debug.diff ├── 2ndcontroller-route-controller-to-partial.diff ├── 3rdparty-delete-old-controller.diff ├── 3rdparty-install-stimulus-autocomplete.diff ├── 3rdparty-make-controller-lazy.diff ├── 3rdparty-register-controller.diff ├── 3rdparty-role-option.diff ├── 3rdparty-sending-preview.diff ├── 3rdparty-using-controller.diff ├── README.md ├── actions-add-button.diff ├── actions-add-data-action.diff ├── actions-remove-connect.diff ├── actions-use-default-action.diff ├── addtransition-add-the-toggle-action.diff ├── addtransition-calling-enter-leave.diff ├── addtransition-create-new-controller.diff ├── addtransition-initialize-usetransition.diff ├── addtransition-skiphiddenproperty.diff ├── addtransition-use-my-fork.diff ├── assets-activate-data-turbo-track.diff ├── assets-remove-log.diff ├── assets-turn-on-versioning.diff ├── assets-tweak-app-js.diff ├── asyncform-close-on-success.diff ├── asyncform-listen-to-bs-event.diff ├── asyncform-return-422-or-200.diff ├── asyncform-try-catch-on-ajax.diff ├── chartjs-install-it.diff ├── chartjs-render-chart.diff ├── chartjs-set-option.diff ├── chartjs-yarn-install-force.diff ├── chartjsextend-add-custom-controller-2.diff ├── chartjsextend-add-custom-controller.diff ├── chartjsextend-change-chart-in-5-seconds.diff ├── chartjsextend-listen-to-connect-event.diff ├── colorselector-add-action-to-squares.diff ├── colorselector-add-click.diff ├── colorselector-add-missing-static.diff ├── colorselector-add-selected-class.diff ├── colorselector-bootstrap-controller.diff ├── colorselector-change-to-buttons.diff ├── colorselector-colorsquare-target.diff ├── colorselector-loop-and-print-out-hex.diff ├── colorselector-removing-border-on-others.diff ├── colorselector-render-color-boxes.diff ├── controllerbasics-add-2nd-element.diff ├── controllerbasics-add-first-element.diff ├── controllerbasics-create-first-controller.diff ├── controllerbasics-delete-hello-controller.diff ├── controllerbasics-increment-on-click.diff ├── dataset-add-data-color-id.diff ├── dataset-hide-select-on-load.diff ├── dataset-set-selected-option.diff ├── disable-add-data-turbo-false.diff ├── disable-re-enable-one-link.diff ├── disable-remove-data-turbo.diff ├── drivebasics-add-sleep.diff ├── drivebasics-install-turbo.diff ├── drivebasics-remove-sleep.diff ├── drivebasics-yarn-install-force.diff ├── drivejs-add-document-ready.diff ├── drivejs-adding-js-to-body.diff ├── drivejs-attaching-document-listener.diff ├── drivejs-remove-extra-js.diff ├── entitybroadcast-add-annotation.diff ├── entitybroadcast-add-dummy-template.diff ├── entitybroadcast-add-listen-in-tpl.diff ├── entitybroadcast-add-remove.diff ├── entitybroadcast-add-update.diff ├── entitybroadcast-move-stream-to-new-tpl.diff ├── entitybroadcast-remove-with-fade-out.diff ├── entitybroadcast-rename-variable-to-entity.diff ├── fixredirect-add-request-header.diff ├── fixredirect-add-shouldwrapredirect.diff ├── fixredirect-bootstrap-subscriber.diff ├── fixredirect-finish-subscriber.diff ├── fixredirect-listen-to-before-fetch-request.diff ├── fixredirect-read-header-in-js.diff ├── fixredirect-redirect-on-login.diff ├── forms-add-422-by-hand.diff ├── forms-renderform.diff ├── forms-updating-all-other-forms.diff ├── framebusy-add-busy-css.diff ├── framebusy-add-display-block.diff ├── framebusy-conditional-loading.diff ├── framebusy-make-checkout-a-lazy-frame.diff ├── framebusy-make-effect-less-dramatic.diff ├── framebusy-set-low-opacity.diff ├── frameredirect-add-data-turbo-form-redirect.diff ├── frameredirect-add-getcurrentframe.diff ├── frameredirect-clear-cache-manually.diff ├── frameredirect-data-turbo-form-redirect-again.diff ├── frameredirect-finish-frame-function.diff ├── frameredirect-frame-around-cart-controls.diff ├── frameredirect-move-listener-to-turbo-helper.diff ├── inlineedit-add-an-edit-button.diff ├── inlineedit-add-form-action.diff ├── inlineedit-add-frame-target-to-edit.diff ├── inlineedit-conditionally-add-form-target.diff ├── inlineedit-make-form-target-frame.diff ├── inlineedit-redirect-back-to-show-page.diff ├── inlineedit-use-turbo-frame-for-row.diff ├── inlineedit-wrap-form-in-frame.diff ├── inlineedit-wrap-product-show-in-frame.diff ├── installencore-add-bootstrap.diff ├── installencore-add-encore-twig-functions.diff ├── installencore-import-bootstrap.diff ├── installencore-install-encore.diff ├── installencore-move-styles.diff ├── installencore-yarn-install.diff ├── jquery-also-ajax-on-direct-form-submit.diff ├── jquery-clear-modal-to-start.diff ├── jquery-hide-button.diff ├── jquery-install-it.diff ├── jquery-make-ajax-call.diff ├── jquery-return-form-partial.diff ├── jquery-serialize-form-on-save.diff ├── jquery-submit-form-ajax.diff ├── jquery-use-formurlvalue.diff ├── laziness-dynamic-import-react-dom.diff ├── laziness-install-webpack-bundle-analyzer.diff ├── laziness-lazy-controller.diff ├── laziness-set-lazy-in-controllers-json.diff ├── lazy-sidebar-upgrade-turbo.diff ├── lazyframe-add-2nd-frame-on-homepage.diff ├── lazyframe-add-frame-to-weather-tpl.diff ├── lazyframe-add-lazy-weather-frame.diff ├── lazyframe-bootstrap-stimulus-controller.diff ├── lazyframe-check-for-weatherwidget-init.diff ├── lazyframe-make-it-lazy.diff ├── lazyframe-make-weather-page.diff ├── lazyframe-move-in-script.diff ├── lazyframe-move-into-connect.diff ├── lazyframe-move-weatherwidget-init-into-ctrl.diff ├── lazyframe-remove-extra-weather.diff ├── lazyframe-upgrade-turbo-again.diff ├── lazysidebar-add-internal-turbo-frame.diff ├── lazysidebar-enabling-fragments.diff ├── lazysidebar-remove-extra-args-cart.diff ├── lazysidebar-sidebar-controller.diff ├── lazysidebar-use-fragment-uri.diff ├── manualstream-add-data-turbo-cache-false.diff ├── manualstream-stream-from-javascript.diff ├── manualvisit-import-visit.diff ├── manualvisit-navigate-with-turbo.diff ├── manualvisit-redirect-on-10-clicks.diff ├── manualvisit-use-global-turbo.diff ├── mercure-add-turbo-stream-listen.diff ├── mercure-adding-docker-config.diff ├── mercure-dd-server.diff ├── mercure-install-symfony-ux-turbo-mercure.diff ├── mercure-publish-message.diff ├── mercure-remove-dd.diff ├── mercure-verify-peer-false.diff ├── mercure-yarn-install-force.diff ├── modal-add-action-method.diff ├── modal-add-container-div.diff ├── modal-add-formurl-value.diff ├── modal-add-modal-partial.diff ├── modal-add-new-button.diff ├── modal-bootstrap-stimulus-controller.diff ├── modal-category-tostring.diff ├── modal-change-url.diff ├── modal-customize-modal-header-buttons.diff ├── modal-import-modal.diff ├── modal-install-popper.diff ├── modal-make-crud-product.diff ├── modal-make-form-smaller.diff ├── modal-open-modal.diff ├── modal-sort-newest-first.diff ├── modal-upgrade-to-bootstrap5.diff ├── modalframe-add-id-to-frame.diff ├── modalframe-add-turbo-frame-to-new.diff ├── modalframe-bind-the-method-to-this.diff ├── modalframe-close-modal-on-success.diff ├── modalframe-disconnect-listener.diff ├── modalframe-extract-to-method.diff ├── modalframe-hide-modal.diff ├── modalframe-listen-to-before-fetch-response.diff ├── modalframe-listen-to-submit-end.diff ├── modalframe-loading-lazy.diff ├── modalframe-no-need-to-hide-the-modal.diff ├── modalframe-redirect-back-to-index.diff ├── modalframe-redirect-to-reviews-page.diff ├── modalframe-remove-extra-stuff.diff ├── modalframe-remove-modal-footer.diff ├── modalframe-remove-modal-form-target.diff ├── modalframe-set-formtarget-in-new.diff ├── modalframe-turn-modal-into-frame.diff ├── modalframe-visit-redirect-url.diff ├── organization-create-setselectedcolor-method.diff ├── organization-create-turbo-helper-js.diff ├── organization-organize-into-methods.diff ├── pre-turbo-add-counting-page.diff ├── pre-turbo-add-log-in-helper-links.diff ├── pre-turbo-add-more-types.diff ├── pre-turbo-adding-review-system.diff ├── pre-turbo-change-add-to-cart-url.diff ├── pre-turbo-empty-migrations.diff ├── pre-turbo-fix-deprecations.diff ├── pre-turbo-fixing-review-admin-area.diff ├── pre-turbo-foundry.diff ├── pre-turbo-making-entity-setters-relaxed.diff ├── pre-turbo-remove-modal-on-close.diff ├── pre-turbo-review-admin.diff ├── pre-turbo-set-up-tutorial.diff ├── pre-turbo-styling-changes.diff ├── pre-turbo-tweak-add-transition-module.diff ├── pre-turbo-tweak-review-flash-system.diff ├── pre-turbo-updating-readme.diff ├── pre-turbo-upgrade-deps.diff ├── pre-turbo-upgrade-yarn-deps.diff ├── pre-turbo-upgrading-recipes.diff ├── pre-turbo-use-new-security.diff ├── pre-turbo-various-minor-tweaks.diff ├── prefetch-copy-prefetch-script.diff ├── prefetch-import-script.diff ├── prefetch-manual-prefetch-link.diff ├── prefetch-remove-prefetch-import.diff ├── react-bootstrap-controller.diff ├── react-copy-in-component.diff ├── react-enable-the-preset.diff ├── react-install-react-preset.diff ├── react-install-react.diff ├── react-render-component.diff ├── reactprops-add-controller.diff ├── reactprops-add-data-controller.diff ├── reactprops-copy-in-component.diff ├── reactprops-manually-pass-prop.diff ├── reactprops-pass-real-serialized-value.diff ├── reloadcontroller-bootstrap-controller.diff ├── reloadcontroller-dispatch-event.diff ├── reloadcontroller-list-into-partial.diff ├── reloadcontroller-listen-to-event.diff ├── reloadcontroller-make-ajax-call.diff ├── reloadcontroller-make-target-optional.diff ├── reloadcontroller-not-relying-on-xmlhttprequest.diff ├── reloadcontroller-opacity-trick.diff ├── reloadcontroller-partial-value.diff ├── reloadcontroller-re-use-on-cart.diff ├── restorevisit-do-a-restore-visit.diff ├── restorevisit-normal-visit-again.diff ├── restorevisit-put-snapshot-into-cache.diff ├── restorevisit-upgrade-turbo.diff ├── reviews-disable-all-submit-buttons.diff ├── reviews-fix-disabled-buttons-on-back.diff ├── reviews-fix-flash.diff ├── reviews-fix-log-in-target.diff ├── reviews-log-inside-turbo-submit-start.diff ├── reviews-wrap-reviews-in-frame.diff ├── searchpreview-add-input-action.diff ├── searchpreview-add-target-and-fill-in.diff ├── searchpreview-add-url-value.diff ├── searchpreview-adding-await.diff ├── searchpreview-bootstrap-controller.diff ├── searchpreview-create-ajax-endpoint.diff ├── searchpreview-make-ajax-call.diff ├── searchpreview-make-it-prettier.diff ├── see-more-add-truncated-description.diff ├── see-more-adding-turbo-frame.diff ├── see-more-install-twig-string-extra.diff ├── see-more-put-back-featured-route.diff ├── see-more-read-more-link.diff ├── snapshot-close-modal.diff ├── snapshot-complex-close-modal.diff ├── snapshot-disable-preview.diff ├── snapshot-lazily-load-swal.diff ├── snapshot-listen-to-turbo-before-cache.diff ├── snapshot-lower-opacity-on-preview.diff ├── snapshot-remove-opacity.diff ├── snapshot-remove-swal-animation.diff ├── snapshot-try-sweetalert.diff ├── snapshot-webpackmode-weak.diff ├── state-add-this-selectedcolorid.diff ├── state-unselect-on-2nd-click.diff ├── steps.json ├── stimulus-use-install-it.diff ├── stimulus-use-refactor-to-method.diff ├── stimulus-use-useclickoutside.diff ├── stimulus-use-usedebounce.diff ├── streamcleanup-change-frame-to-div.diff ├── streamcleanup-fade-out-highlight.diff ├── streamcleanup-highlight-new-with-css.diff ├── streamcleanup-isolate-review-into-tpl.diff ├── streamcleanup-isolate-to-reviews-list-tpl.diff ├── streamcleanup-only-stream-list.diff ├── streamcleanup-remove-with-timeout.diff ├── streamcleanup-separate-reviews-frame.diff ├── streamcleanup-stream-append-review.diff ├── streamcleanup-tweak-target-to-review-list.diff ├── streamstats-add-another-review.diff ├── streamstats-conditionally-stream.diff ├── streamstats-extra-flash.diff ├── streamstats-include-template-in-stream.diff ├── streamstats-pass-in-product.diff ├── streamstats-refactor-to-quickstats-template.diff ├── streamstats-return-simple-stream.diff ├── streamstats-stream-reviews-html-twig.diff ├── successstream-add-id-to-targets.diff ├── successstream-put-back-reviews-html-twig.diff ├── successstream-renderview.diff ├── successstream-stop-streaming-reviews.diff ├── successstream-update-review-stream.diff ├── sweetalert-add-form-submit-action.diff ├── sweetalert-add-submit-confirm-controller.diff ├── sweetalert-ajax-submit-form.diff ├── sweetalert-install-sweetalert2.diff ├── sweetalert-make-configurable.diff ├── sweetalert-option-to-submit-async.diff ├── sweetalert-pass-value-to-submit-async.diff ├── sweetalert-paste-in-swal.diff ├── sweetalert-resubmit-on-success.diff ├── sweetalert-use-preconfirm.diff ├── targets-add-span-element.diff ├── targets-add-target.diff ├── targets-remove-2nd-element.diff ├── targetting-add-target-top.diff ├── targetting-also-add-to-internal-frame.diff ├── toast-add-toast-template.diff ├── toast-broadcast-a-toast-also.diff ├── toast-creating-the-toast-controller.diff ├── toast-include-customize.diff ├── toast-move-into-toast-container.diff ├── toast-open-toast-in-js.diff ├── transition-add-css.diff ├── transition-upgrade-package.diff ├── transition-use-behavior.diff ├── transitions-different-on-preview.diff ├── transitions-fix-restoration-visit.diff ├── transitions-organize-to-method.diff ├── transitions-remove-slowness.diff ├── transitions-setup-initial-transition.diff ├── values-add-changed-hook.diff ├── values-add-data-color-id-attribute.diff ├── values-doing-all-the-work-in-the-hook.diff ├── values-fixing-type-problem.diff ├── values-hello-values-api.diff ├── values-setting-initial-selected.diff ├── values-unselect-on-click-again.diff ├── values-use-stimulus-controller.diff ├── values-use-value-exclusively.diff ├── values-value-names-are-normalized.diff ├── widgets-add-weather-widget.diff ├── widgets-always-add-script.diff ├── widgets-expand-widget-code.diff ├── widgets-log-in-body.diff ├── widgets-log-on-turbo-before-render.diff ├── widgets-refactor-to-method.diff ├── widgets-remove-log.diff ├── widgets-remove-script-element.diff ├── widgets-turbo-render-function.diff └── widgets-undo-on-every-page.diff ├── bin └── console ├── composer.json ├── composer.lock ├── config ├── bundles.php ├── packages │ ├── cache.yaml │ ├── dev │ │ ├── debug.yaml │ │ ├── monolog.yaml │ │ └── web_profiler.yaml │ ├── doctrine.yaml │ ├── doctrine_migrations.yaml │ ├── framework.yaml │ ├── prod │ │ ├── deprecations.yaml │ │ ├── doctrine.yaml │ │ ├── monolog.yaml │ │ └── routing.yaml │ ├── routing.yaml │ ├── security.yaml │ ├── sensio_framework_extra.yaml │ ├── test │ │ ├── framework.yaml │ │ ├── monolog.yaml │ │ ├── twig.yaml │ │ ├── validator.yaml │ │ └── web_profiler.yaml │ ├── twig.yaml │ └── validator.yaml ├── preload.php ├── routes.yaml ├── routes │ ├── annotations.yaml │ └── dev │ │ ├── framework.yaml │ │ └── web_profiler.yaml └── services.yaml ├── docker-compose.yaml ├── migrations ├── .gitignore ├── Version20191206161148.php └── Version20200127144611.php ├── public ├── images │ └── mvp-logo-light.png ├── index.php ├── styles │ └── app.css └── uploads │ └── products │ ├── blank-cds.png │ ├── dog-lamp.png │ ├── floppy-disc.png │ ├── hammock.png │ ├── indoor-plant.png │ ├── inflatable-sofa.png │ ├── papers.png │ ├── pen.png │ ├── popcorn.png │ ├── puzzle.png │ ├── spigot.png │ └── velvis.png ├── sfcasts ├── stimulus │ ├── 3rd-party-controllers.md │ ├── actions.md │ ├── ajax-html.md │ ├── analyze.md │ ├── async-imports.md │ ├── autocomplete-controller.md │ ├── autocomplete-transitions.md │ ├── color-selector.md │ ├── controllers.md │ ├── css-transitions.md │ ├── current-target.md │ ├── dataset.md │ ├── delete-confirm.md │ ├── dispatch-event.md │ ├── encore.md │ ├── extend-chartjs.md │ ├── fetch.md │ ├── finish-transition.md │ ├── form-action.md │ ├── form-ajax.md │ ├── form-responses.md │ ├── fresh-html.md │ ├── lazy.md │ ├── listen-reload-html.md │ ├── metadata.yml │ ├── modal-form.md │ ├── modal.md │ ├── multi-controller-dispatch.md │ ├── options-form-ajax.md │ ├── product-crud.md │ ├── properties-events.md │ ├── react-props.md │ ├── react.md │ ├── reload-controller.md │ ├── reuse-controller.md │ ├── search-preview.md │ ├── splitting-importing.md │ ├── state.md │ ├── stimulus-bridge.md │ ├── stimulus-fetch-lazy.md │ ├── stimulus-use.md │ ├── targets.md │ ├── transition-classes.md │ ├── ux-chart-js.md │ ├── ux.md │ ├── value-change.md │ └── values.md └── turbo │ ├── analytics.md │ ├── asset-tracking.md │ ├── broadcast-remove.md │ ├── cleaned-preview.md │ ├── disabling.md │ ├── entity-broadcast.md │ ├── external-js-stimulus.md │ ├── form-disable-submit.md │ ├── forms.md │ ├── frame-custom-header.md │ ├── frame-form-action.md │ ├── frame-loading.md │ ├── frame-redirect-cache.md │ ├── frame-redirect.md │ ├── frame-target.md │ ├── frames-find-frames.md │ ├── full-frame-redirect.md │ ├── how-drive-works.md │ ├── inline-edit.md │ ├── install.md │ ├── intro.md │ ├── javascript.md │ ├── js-widget.md │ ├── lazy-frame-full-page.md │ ├── lazy-frame.md │ ├── listen-publish.md │ ├── login-redirect.md │ ├── manual-stream.md │ ├── manual-visit.md │ ├── mercure-jwt.md │ ├── mercure-php.md │ ├── mercure-service.md │ ├── mercure.md │ ├── metadata.yml │ ├── modal-cleanup.md │ ├── modal-frame-close.md │ ├── modal-frame.md │ ├── modal-preview.md │ ├── modal-redirect.md │ ├── native-prefetch.md │ ├── no-preview.md │ ├── organize.md │ ├── prefetch.md │ ├── prevent-frame-rendering.md │ ├── read-more-frame.md │ ├── restore-visit.md │ ├── reviews-frame.md │ ├── reviews-stream-update.md │ ├── reviews-stream.md │ ├── server-frame-redirect.md │ ├── stream-everything.md │ ├── stream-include.md │ ├── streamed-item-highlight.md │ ├── sweet-alert.md │ ├── toast.md │ ├── transition-finish.md │ ├── transitions.md │ └── turbo-stream.md ├── src ├── Controller │ ├── .gitignore │ ├── AdminController.php │ ├── CartController.php │ ├── CheckoutController.php │ ├── ProductController.php │ ├── RegistrationController.php │ └── SecurityController.php ├── DataFixtures │ ├── AppFixtures.php │ └── uploads │ │ └── products │ │ ├── blank-cds.png │ │ ├── dog-lamp.png │ │ ├── floppy-disc.png │ │ ├── hammock.png │ │ ├── indoor-plant.png │ │ ├── inflatable-sofa.png │ │ ├── papers.png │ │ ├── pen.png │ │ ├── popcorn.png │ │ ├── puzzle.png │ │ ├── spigot.png │ │ └── velvis.png ├── Entity │ ├── .gitignore │ ├── Cart.php │ ├── CartItem.php │ ├── Category.php │ ├── Color.php │ ├── Product.php │ ├── Purchase.php │ ├── PurchaseItem.php │ └── User.php ├── Form │ ├── AddItemToCartFormType.php │ ├── CheckoutFormType.php │ └── RegistrationFormType.php ├── Kernel.php ├── Repository │ ├── .gitignore │ ├── CategoryRepository.php │ ├── ColorRepository.php │ ├── ProductRepository.php │ ├── PurchaseItemRepository.php │ ├── PurchaseRepository.php │ └── UserRepository.php ├── Security │ └── LoginFormAuthenticator.php ├── Service │ └── CartStorage.php └── Twig │ ├── CartExtension.php │ └── SerializeExtension.php ├── symfony.lock ├── templates ├── admin │ └── dashboard.html.twig ├── base.html.twig ├── cart │ ├── _featuredSidebar.html.twig │ └── cart.html.twig ├── checkout │ ├── checkout.html.twig │ └── confirmation.html.twig ├── product │ ├── _cart_add_controls.html.twig │ ├── _categoriesSidebar.html.twig │ ├── index.html.twig │ └── show.html.twig ├── registration │ └── register.html.twig └── security │ └── login.html.twig └── tutorial ├── FeaturedProduct.js └── MadeWithLove.js /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ###> symfony/framework-bundle ### 3 | /.env.local 4 | /.env.local.php 5 | /.env.*.local 6 | /config/secrets/prod/prod.decrypt.private.php 7 | /public/bundles/ 8 | /var/ 9 | /vendor/ 10 | ###< symfony/framework-bundle ### 11 | -------------------------------------------------------------------------------- /_tuts/2ndcontroller-add-cart-list-controller.diff: -------------------------------------------------------------------------------- 1 | diff --git a/assets/controllers/cart-list_controller.js b/assets/controllers/cart-list_controller.js 2 | new file mode 100644 3 | index 0000000..b3f6ff5 4 | --- /dev/null 5 | +++ b/assets/controllers/cart-list_controller.js 6 | @@ -0,0 +1,7 @@ 7 | +import { Controller } from 'stimulus'; 8 | + 9 | +export default class extends Controller { 10 | + connect() { 11 | + console.log('🛒'); 12 | + } 13 | +} 14 | diff --git a/templates/cart/cart.html.twig b/templates/cart/cart.html.twig 15 | index 57bdc0e..c076fbd 100644 16 | --- a/templates/cart/cart.html.twig 17 | +++ b/templates/cart/cart.html.twig 18 | @@ -11,7 +11,10 @@ 19 | 20 |