Skip to content

Commit

Permalink
Migrate to Webpack based UI build
Browse files Browse the repository at this point in the history
  • Loading branch information
mbabker committed Jun 16, 2022
1 parent 346051f commit 445c9c1
Show file tree
Hide file tree
Showing 14 changed files with 182 additions and 78 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
.gitignore export-ignore
behat.yml.dist export-ignore
ecs.php export-ignore
package.json export-ignore
phpspec.yml.dist export-ignore
phpstan.neon export-ignore
phpstan-baseline.neon export-ignore
Expand Down
9 changes: 9 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@babdev/product-samples-plugin",
"description": "Product samples plugin for Sylius.",
"repository": "https://github.com/BabDev/SyliusProductSamplesPlugin.git",
"license": "MIT",
"scripts": {
"dist": "yarn encore production --config-name product-samples-plugin-dist"
}
}
1 change: 1 addition & 0 deletions src/Resources/assets/shop/entry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import './js';
107 changes: 107 additions & 0 deletions src/Resources/assets/shop/js/add-to-cart.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
export default class AddToCart {
/**
* @param {HTMLElement} button
*/
constructor(button) {
/**
* @type {HTMLElement}
*/
this.button = button;

/**
* @type {Element|null}
*/
this.buttonMessageContainer = this.button.querySelector('.button-message');
}

static maybeInit() {
const button = document.getElementById('sylius_add_to_cart_requestSample');

if (button === null) {
return;
}

(new AddToCart(button)).init();
}

init() {
if (document.getElementById('sylius-variants-pricing') !== null) {
document.querySelectorAll('[name*="sylius_add_to_cart[cartItem][variant]"]').forEach(element => {
element.addEventListener('change', event => this.handleProductOptionsChange(event));
});
} else if (document.getElementById('sylius-product-variants') !== null) {
document.querySelectorAll('[name="sylius_add_to_cart[cartItem][variant]"]').forEach(element => {
element.addEventListener('change', event => this.handleProductVariantsChange(event));
});
} else {
console.log('no init');
}
}

/**
* @param {Event} event
*/
handleProductOptionsChange(event) {
const pricingContainer = document.getElementById('sylius-variants-pricing');
let optionPricingSelector = '';

document.querySelectorAll('#sylius-product-adding-to-cart select[data-option]').forEach(element => {
const option = element.options[element.options.selectedIndex];

optionPricingSelector += `[data-${element.dataset.option}="${option.value}"]`;
});

const optionPricing = pricingContainer.querySelector(optionPricingSelector);

if (optionPricing === null) {
this.updateButtonDisplayText(this.button.dataset.sampleMessage ?? 'Request a Sample');

return;
}

const isFreeSample = (optionPricing.dataset.freeSample ?? false) === 'yes';

if (isFreeSample) {
this.updateButtonDisplayText(this.button.dataset.freeSampleMessage ?? this.button.dataset.sampleMessage ?? 'Request a Sample');
} else {
const samplePrice = optionPricing.dataset.samplePrice ?? null;

if (samplePrice !== null) {
this.updateButtonDisplayText((this.button.dataset.paidSampleMessage ?? this.button.dataset.sampleMessage ?? 'Request a Sample').replace('%price%', samplePrice));
} else {
this.updateButtonDisplayText(this.button.dataset.sampleMessage ?? 'Request a Sample');
}
}
}

/**
* @param {Event} event
*/
handleProductVariantsChange(event) {
const priceRow = event.currentTarget.closest('tr').querySelector('.sylius-product-variant-price');
const isFreeSample = (priceRow.dataset.freeSample ?? false) === 'yes';

if (isFreeSample) {
this.updateButtonDisplayText(this.button.dataset.freeSampleMessage ?? this.button.dataset.sampleMessage ?? 'Request a Sample');
} else {
const samplePrice = priceRow.dataset.samplePrice ?? null;

if (samplePrice !== null) {
this.updateButtonDisplayText((this.button.dataset.paidSampleMessage ?? this.button.dataset.sampleMessage ?? 'Request a Sample').replace('%price%', samplePrice));
} else {
this.updateButtonDisplayText(this.button.dataset.sampleMessage ?? 'Request a Sample');
}
}
}

/**
* @param {String} text
*/
updateButtonDisplayText(text) {
if (this.buttonMessageContainer !== null) {
this.buttonMessageContainer.innerText = text;
} else {
this.button.innerText = text;
}
}
}
3 changes: 3 additions & 0 deletions src/Resources/assets/shop/js/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import AddToCart from './add-to-cart';

AddToCart.maybeInit();
6 changes: 0 additions & 6 deletions src/Resources/config/app/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,3 @@ sylius_ui:
product_samples:
template: "@BabDevSyliusProductSamplesPlugin/Admin/Channel/_product_samples_form.html.twig"
priority: 0

sylius.shop.layout.javascripts:
blocks:
request_a_sample_javascript:
template: "@BabDevSyliusProductSamplesPlugin/Shop/JavaScript/_request_a_sample.html.twig"
priority: 0
1 change: 1 addition & 0 deletions src/Resources/public/babdev-product-samples-shop.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions src/Resources/public/entrypoints.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"entrypoints": {
"babdev-product-samples-shop": {
"js": [
"/public/babdev-product-samples-shop.js"
]
}
}
}
70 changes: 0 additions & 70 deletions src/Resources/public/js/request-a-sample.js

This file was deleted.

3 changes: 3 additions & 0 deletions src/Resources/public/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"public/babdev-product-samples-shop.js": "/public/babdev-product-samples-shop.js"
}
8 changes: 8 additions & 0 deletions tests/Application/config/packages/_sylius.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,11 @@ sylius_product:
classes:
model: 'BabDev\SyliusProductSamplesPlugin\Tests\App\Model\ProductVariant'
repository: 'BabDev\SyliusProductSamplesPlugin\Doctrine\ORM\ProductVariantRepository'

sylius_ui:
events:
sylius.shop.layout.javascripts:
blocks:
request_a_sample_javascript:
template: 'JavaScript/plugin.html.twig'
priority: 0
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{% if app.request.attributes.get('_route') == 'sylius_shop_product_show' %}
{% include '@SyliusUi/_javascripts.html.twig' with {'path': 'bundles/babdevsyliusproductsamplesplugin/js/request-a-sample.js'} %}
{% include '@SyliusUi/_javascripts.html.twig' with {'path': 'bundles/babdevsyliusproductsamplesplugin/babdev-product-samples-shop.js'} %}
{% endif %}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<div class="ui large buttons">
<button type="submit" class="ui primary icon labeled button" {{ sylius_test_html_attribute('add-to-cart-button') }}><i class="cart icon"></i> {{ 'sylius.ui.add_to_cart'|trans }}</button>
<div class="or" data-text="{{ 'sylius.ui.or'|trans|e('html_attr') }}"></div>
<button type="button" class="ui icon labeled button" id="{{ form.requestSample.vars.id }}" name="{{ form.requestSample.vars.full_name }}" data-free-sample-message="{{ 'babdev_sylius_product_samples.ui.request_a_free_sample'|trans|e('html_attr') }}" data-paid-sample-message="{{ 'babdev_sylius_product_samples.ui.request_a_paid_sample'|trans|e('html_attr') }}" {{ sylius_test_html_attribute('request-a-sample-button') }}>
<button type="button" class="ui icon labeled button" id="{{ form.requestSample.vars.id }}" name="{{ form.requestSample.vars.full_name }}" data-free-sample-message="{{ 'babdev_sylius_product_samples.ui.request_a_free_sample'|trans|e('html_attr') }}" data-paid-sample-message="{{ 'babdev_sylius_product_samples.ui.request_a_paid_sample'|trans|e('html_attr') }}" data-sample-message="{{ 'babdev_sylius_product_samples.ui.request_a_sample'|trans|e('html_attr') }}" {{ sylius_test_html_attribute('request-a-sample-button') }}>
<i class="envelope icon"></i>&nbsp;
{%- if samplePricing.price == 0 %}
<span class="button-message">{{ 'babdev_sylius_product_samples.ui.request_a_free_sample'|trans }}</span>
Expand Down
38 changes: 38 additions & 0 deletions webpack.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const path = require('path');
const Encore = require('@symfony/webpack-encore');
const pluginName = 'product-samples';

const getConfig = (pluginName, type) => {
Encore.reset();

Encore
.setOutputPath(`public/build/babdev/${pluginName}/${type}/`)
.setPublicPath(`/build/babdev/${pluginName}/${type}/`)
.addEntry(`babdev-${pluginName}-${type}`, path.resolve(__dirname, `./src/Resources/assets/${type}/entry.js`))
.disableSingleRuntimeChunk()
.cleanupOutputBeforeBuild()
.enableSourceMaps(!Encore.isProduction())
.enableSassLoader();

const config = Encore.getWebpackConfig();
config.name = `babdev-${pluginName}-${type}`;

return config;
}

Encore
.setOutputPath('src/Resources/public/')
.setPublicPath('/public/')
.addEntry(`babdev-${pluginName}-shop`, path.resolve(__dirname, './src/Resources/assets/shop/entry.js'))
.cleanupOutputBeforeBuild()
.disableSingleRuntimeChunk()
.enableSassLoader();

const distConfig = Encore.getWebpackConfig();
distConfig.name = 'product-samples-plugin-dist';

Encore.reset();

const shopConfig = getConfig(pluginName, 'shop')

module.exports = [shopConfig, distConfig];

0 comments on commit 445c9c1

Please sign in to comment.