From 95a94ebb001515409da07ab8d3e9280aae0995d1 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 26 Mar 2024 14:49:51 +0100 Subject: [PATCH 01/25] keep a changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0f11b55 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6 @@ + + +# IngoSCostTransparency for Shopware 6 + +## 1.0.0 - tbd +- initial release From 7e971292e0424fe625809085c8cf5e7c978bd997 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 16:27:09 +0100 Subject: [PATCH 02/25] release candidate --- dist/IngoSCostTransparency.zip | Bin 59025 -> 17443 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/IngoSCostTransparency.zip b/dist/IngoSCostTransparency.zip index 4e72acc29f59c5f4c04a399ed837d91aac2d3f7a..3f5375d9d2be66a571ebf1d95f0ca21b7854ece3 100644 GIT binary patch delta 9341 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%0Dujm5G4}H6*DlnCn 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 F0sv{} Date: Wed, 27 Mar 2024 16:27:17 +0100 Subject: [PATCH 03/25] test setup documentation --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 57ae82d..ea5f097 100644 --- a/README.md +++ b/README.md @@ -171,4 +171,16 @@ Pragmatically, we could delete the `vendor` directory before creating the zip di Now we created the file `custom/plugins/dist_tmp/IngoSCostTransparency.zip` which is visible as `src/dist_tmp/IngoSCostTransparency.zip` outside the container and could be moved to `dist`: -- `sudo mv src/dist_tmp/* dist` to commit it in this development repository. \ No newline at end of file +- `sudo mv src/dist_tmp/* dist` to commit it in this development repository. + +### Official Testing Environment + +Instead of our development setup, there is another, official testing environment built with Docker, used by Shopware +for validating plugins. Their setup includes some of the typical gotchas like subdirectory paths and a nonstandard +storefront language (Dutch). + +- `docker run --rm -p 80:80 -e VIRTUAL_HOST=localhost ghcr.io/shopwarelabs/testenv:6.X.X` + +Specific validation rules are listed on their website as well: + +https://developer.shopware.com/docs/resources/guidelines/testing/store/quality-guidelines-plugins/ From 763746407662d9aca85a188e3650813e1b35eda7 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 16:41:45 +0100 Subject: [PATCH 04/25] update icon, description, and documentation --- README.md | 25 +++++++++++++----- src/IngoSCostTransparency/composer.json | 2 +- .../src/Resources/config/plugin.png | Bin 3906 -> 3368 bytes 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ea5f097..090c854 100644 --- a/README.md +++ b/README.md @@ -173,14 +173,27 @@ Now we created the file `custom/plugins/dist_tmp/IngoSCostTransparency.zip` whic `src/dist_tmp/IngoSCostTransparency.zip` outside the container and could be moved to `dist`: - `sudo mv src/dist_tmp/* dist` to commit it in this development repository. -### Official Testing Environment +### Official Testing Environment and Checklist -Instead of our development setup, there is another, official testing environment built with Docker, used by Shopware +Specific validation rules are listed in the official plugin quality guidelines checklist: + +https://developer.shopware.com/docs/resources/guidelines/testing/store/quality-guidelines-plugins/ + +To do after every update: +- validate the plugin against the checklist (manually) +- run all available validations, checks and audits (e.g. using `shopware-cli`) +- build an updated release file inside the development container (see above) +- stop the development container +- run the testing container (see below) +- upload and install the release file in the testing container +- repeat all manual test steps and ensure that the documentation matches the actual behavior +- uninstall, reinstall and re-test the plugin (twice, with or without "delete all data") + +There is an official testing environment built with Docker, used by Shopware for validating plugins. Their setup includes some of the typical gotchas like subdirectory paths and a nonstandard -storefront language (Dutch). +storefront language (Dutch). It always uses the latest 6.x Shopware release. - `docker run --rm -p 80:80 -e VIRTUAL_HOST=localhost ghcr.io/shopwarelabs/testenv:6.X.X` -Specific validation rules are listed on their website as well: - -https://developer.shopware.com/docs/resources/guidelines/testing/store/quality-guidelines-plugins/ +If we want to retain and claim backward compatibility, we must repeat the test with alternative versions, +e.g. by using Dockware Docker tags to rebuild our development environment. \ No newline at end of file diff --git a/src/IngoSCostTransparency/composer.json b/src/IngoSCostTransparency/composer.json index b283860..2d07556 100644 --- a/src/IngoSCostTransparency/composer.json +++ b/src/IngoSCostTransparency/composer.json @@ -18,7 +18,7 @@ "shopware-plugin-class": "IngoSCostTransparency\\IngoSCostTransparency", "plugin-icon": "src/Resources/config/plugin.png", "label": { - "de-DE": "Cost Transparency", + "de-DE": "Kostentransparenz", "en-GB": "Cost Transparency" }, "description": { diff --git a/src/IngoSCostTransparency/src/Resources/config/plugin.png b/src/IngoSCostTransparency/src/Resources/config/plugin.png index f344d38add8f750fce3db4ede01c0b951ec78f77..dfed872e90e7fbb3484b261bf0b85da774e6bc85 100644 GIT binary patch literal 3368 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 literal 3906 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 Rgn@r65DsgiQ>k?`@?VBr4|o6o From 94fc40d6c4f1dce9faae2bd202c2481b70a5269f Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 17:01:28 +0100 Subject: [PATCH 05/25] update description --- README.md | 23 +++++++++++-------- ...ketplace-descriptions-and-screenshots.html | 2 +- .../ingos-cost-transparency-tab.html.twig | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) rename LIESMICH.md => marketplace-descriptions-and-screenshots.html (99%) diff --git a/README.md b/README.md index 090c854..fd0430a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,22 @@ -# Ingo's Cost Transparency for Shopware 6 +# Cost Transparency for Shopware 6 Inspired by potential customers' requirements and based on [Ingo Steinke](https://www.ingo-steinke.com/)'s [Shopware 6 Theme/Plugin Development Template](https://github.com/openmindculture/IngoSDev6CertPrep), [IngoSCostTransparency (`sw-IngoSCostTransparency`)](https://github.com/openmindculture/sw-IngoSCostTransparency) is a free and open-source extension for Shopware 6 that adds optional additional product details as custom fields with responsive and accessible graphic percentage display on the product details. -TODO: add a more specific purpose / use case! +Colors default to theme colors but can be modified by overwriting custom CSS properties. +Label captions can be configured in the extension configuration. -Colors default to theme colors but can be modified by overwriting custom CSS properties. Label captions can be configured in the extension configuration. +Short and long descriptions in German and English, and descriptive screenshots for the extension marketplace can be +previewed in [marketplace-descriptions-and-screenshots.html](./marketplace-descriptions-and-screenshots.html) -There is a short [German description](./LIESMICH.md). +TODO: add a more specific purpose / use case and detailled instructions for installation, usage, and test. + + +## Cost Transparency Display in the Storefront + +The layout is responsive and accessible. Mobile content will be displayed off canvas like the built-in description and reviews tabs. Tablet and mobile views show column rows, while wide desktop screens show columns. Captions of small columns will be shortened. The full caption is available in a title tag. Simple HTML markup is possible in captions, like using bold tags or list items. + +![screenshot collage](./product-cost-percentage-transparency.png) ## Configuration @@ -21,12 +30,6 @@ Custom fields can be found an edited in the "Specifications" tab of each product ![screenshot](./product-fields-editor.png) -## Storefront Display - -The layout is responsive and accessible. Mobile content will be displayed off canvas like the built-in description and reviews tabs. Tablet and mobile views show column rows, while wide desktop screens show columns. Captions of small columns will be shortened. The full caption is available in a title tag. Simple HTML markup is possible in captions, like using bold tags or list items. - -![screenshot collage](./product-cost-percentage-transparency.png) - ## Usage, Notes, and Caveats In the basic plugin version, up to five different cost factors can be defined per product, using the labels defined in the extension settings. If any values are set, an additional data visualization tab will be shown on the product details page using a bar chart with percentage sizes. Please note: using multiple values below 10% might compromise readability. It is possible to use HTML in the description blocks for each cost factor. diff --git a/LIESMICH.md b/marketplace-descriptions-and-screenshots.html similarity index 99% rename from LIESMICH.md rename to marketplace-descriptions-and-screenshots.html index db62410..7314653 100644 --- a/LIESMICH.md +++ b/marketplace-descriptions-and-screenshots.html @@ -1,4 +1,4 @@ -# Ingo's Kostentransparenz für Shopware 6 +# Kostentransparenz für Shopware 6 Inspiriert durch Anforderungen potentieller Kund:innen und basierend auf [Ingo Steinkes](https://www.ingo-steinke.com/) [Shopware 6 Theme/Plugin Development Template](https://github.com/openmindculture/IngoSDev6CertPrep) ist [IngoSCostTransparency (`sw-IngoSCostTransparency`)](https://github.com/openmindculture/sw-IngoSCostTransparency) eine freie und quelloffene Erweiterung für Shopware 6, die zusätzliche optionale Produktdetail-Reiter ergänzt, in denen responsiv und barrierefrei eine grafische Datenvisualisation in Form eines prozentualen Balkendiagramms angezeigt wird. diff --git a/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig b/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig index ef64c45..b05bdf4 100644 --- a/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig +++ b/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig @@ -2,7 +2,7 @@ {% block utilities_offcanvas_content %}

-

{{ 'ingos.costTransparency.costTransparency' | trans }}

+ {{ 'ingos.costTransparency.costTransparency' | trans }}
{% set ingos_cost_transparency_style_landscape = '' %} {% set ingos_cost_transparency_style_portrait = '' %} From fa07aa09b8e107138a56887cb07b6f4674c5c1ab Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 17:17:43 +0100 Subject: [PATCH 06/25] add testing tools --- .eslintrc.js | 60 +++++ README.md | 2 + package.json | 15 ++ phpstan.neon | 26 +++ sonarqube/javascript.xml | 474 +++++++++++++++++++++++++++++++++++++++ sonarqube/php.xml | 402 +++++++++++++++++++++++++++++++++ stylelint.config.js | 24 ++ tsconfig.json | 20 ++ 8 files changed, 1023 insertions(+) create mode 100644 .eslintrc.js create mode 100644 package.json create mode 100644 phpstan.neon create mode 100644 sonarqube/javascript.xml create mode 100644 sonarqube/php.xml create mode 100644 stylelint.config.js create mode 100644 tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..1c7edfd --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,60 @@ +const isDevMode = process.env.NODE_ENV !== 'production'; + +module.exports = { + root: true, + extends: ['eslint:recommended'], + parser: '@typescript-eslint/parser', + 'env': { + 'browser': true, + 'jquery': true, + 'node': true, + 'es6': true, + 'jest/globals': true, + }, + 'globals': { + 'gtag': true, + 'bootstrap': true, + }, + plugins: [ + 'jest', + '@typescript-eslint', + ], + 'parserOptions': { + 'ecmaVersion': 6, + 'sourceType': 'module', + }, + 'rules': { + 'comma-dangle': ['error', 'always-multiline'], + 'one-var': ['error', 'never'], + 'no-console': ['error', { allow: ['warn', 'error'] }], + 'no-debugger': (isDevMode ? 0 : 2), + 'prefer-const': 'warn', + 'quotes': ['warn', 'single'], + 'indent': ['warn', 4, { + 'SwitchCase': 1, + }], + 'jest/no-identical-title': 'warn', + 'jest/no-focused-tests': 'error', + 'jest/no-duplicate-hooks': 'error', + }, + overrides: [ + { + files: ['*.ts'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + ], + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, + rules: { + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/consistent-type-exports': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/switch-exhaustiveness-check': 'error', + '@typescript-eslint/ban-ts-comment': 'off' + }, + }, + ], +}; diff --git a/README.md b/README.md index fd0430a..afe0bec 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ Label captions can be configured in the extension configuration. Short and long descriptions in German and English, and descriptive screenshots for the extension marketplace can be previewed in [marketplace-descriptions-and-screenshots.html](./marketplace-descriptions-and-screenshots.html) +The content of the images/screenshots must be in English. + TODO: add a more specific purpose / use case and detailled instructions for installation, usage, and test. diff --git a/package.json b/package.json new file mode 100644 index 0000000..33c5e5b --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "sw-IngoSCostTransparency", + "version": "1.0.0", + "description": "plugin for Shopware 6", + "scripts": { + "eslint": "eslint src/IngoSCostTransparency", + "stylelint": "stylelint src/IngoSCostTransparency/**/*.css src/IngoSCostTransparency/**/*.scss" + }, + "author": "Ingo Steinke", + "devDependencies": { + "eslint": "^8.57.0", + "stylelint": "^16.0.2", + "stylelint-config-recommended-scss": "^14.0.0" + } +} diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..2cc5e18 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,26 @@ +parameters: + level: 0 + + bootstrapFiles: + - %currentWorkingDirectory%/vendor/autoload.php + paths: + - %currentWorkingDirectory% + excludePaths: + - %currentWorkingDirectory%/Components/Smarty + - %currentWorkingDirectory%/vendor + - %currentWorkingDirectory%/tests/ + - %currentWorkingDirectory%/Test/ + - %currentWorkingDirectory%/Resources/smarty + - %currentWorkingDirectory%/platform + - %currentWorkingDirectory%/autoload-dist/vendor/ + + ignoreErrors: + - '#apcu_#' + - '#ioncube_#' + - '#opcache_#' + - '#imagettftext#' + - '#class Redis#' + - '#Constant STARTTIME#' + + reportUnmatchedIgnoredErrors: false + tipsOfTheDay: false \ No newline at end of file diff --git a/sonarqube/javascript.xml b/sonarqube/javascript.xml new file mode 100644 index 0000000..eb174d8 --- /dev/null +++ b/sonarqube/javascript.xml @@ -0,0 +1,474 @@ + + + Code-Review + js + + + common-js + FailedUnitTests + MAJOR + + + + javascript + BitwiseOperators + MAJOR + + + + javascript + BoundOrAssignedEvalOrArguments + MAJOR + + + + javascript + ConstructorFunctionsForSideEffects + MAJOR + + + + javascript + DebuggerStatement + BLOCKER + + + + javascript + DuplicateFunctionArgument + MAJOR + + + + javascript + DuplicatePropertyName + MAJOR + + + + javascript + Eval + CRITICAL + + + + javascript + ForIn + MAJOR + + + + javascript + FunctionDeclarationsWithinBlocks + MINOR + + + + javascript + NamedFunctionExpression + MINOR + + + + javascript + S1143 + CRITICAL + + + + javascript + S1145 + MAJOR + + + + javascript + S1154 + MAJOR + + + + javascript + S1226 + MINOR + + + + javascript + S1442 + BLOCKER + + + + javascript + S1656 + MAJOR + + + + javascript + S1697 + MAJOR + + + + javascript + S1764 + MAJOR + + + + javascript + S1862 + MAJOR + + + + javascript + S2077 + CRITICAL + + + + javascript + S2123 + MAJOR + + + + javascript + S2137 + MAJOR + + + + javascript + S2189 + BLOCKER + + + + javascript + S2201 + MAJOR + + + + javascript + S2251 + MAJOR + + + + javascript + S2255 + MINOR + + + + javascript + S2259 + MAJOR + + + + javascript + S2424 + MAJOR + + + + javascript + S2427 + MINOR + + + + javascript + S2432 + MAJOR + + + + javascript + S2508 + MINOR + + + + javascript + S2549 + CRITICAL + + + + javascript + S2550 + MAJOR + + + + javascript + S2583 + MAJOR + + + + javascript + S2611 + BLOCKER + + + + javascript + S2688 + MAJOR + + + + javascript + S2757 + MAJOR + + + + javascript + S2769 + MAJOR + + + + javascript + S2817 + BLOCKER + + + + javascript + S2819 + BLOCKER + + + + javascript + S2873 + MAJOR + + + + javascript + S2999 + MAJOR + + + considerJSDoc + false + + + + + javascript + S3001 + MINOR + + + + javascript + S3271 + BLOCKER + + + + javascript + S3403 + MAJOR + + + + javascript + S3500 + MAJOR + + + + javascript + S3531 + MAJOR + + + + javascript + S3616 + MAJOR + + + + javascript + S3699 + MAJOR + + + + javascript + S3759 + MAJOR + + + + javascript + S3785 + CRITICAL + + + + javascript + S3786 + MAJOR + + + + javascript + S3796 + BLOCKER + + + + javascript + S3799 + MAJOR + + + + javascript + S3812 + CRITICAL + + + + javascript + S3828 + BLOCKER + + + + javascript + S3834 + CRITICAL + + + + javascript + S3854 + CRITICAL + + + + javascript + S3923 + MAJOR + + + + javascript + S3981 + MAJOR + + + + javascript + S3984 + MAJOR + + + + javascript + S4043 + MAJOR + + + + javascript + S4143 + MAJOR + + + + javascript + S4721 + CRITICAL + + + + javascript + S4784 + CRITICAL + + + + javascript + S4787 + CRITICAL + + + + javascript + S4790 + CRITICAL + + + + javascript + S4817 + CRITICAL + + + + javascript + S4818 + CRITICAL + + + + javascript + S4823 + CRITICAL + + + + javascript + S4829 + CRITICAL + + + + javascript + S5122 + MINOR + + + + javascript + S905 + MAJOR + + + + javascript + S930 + CRITICAL + + + + javascript + UnreachableCode + MAJOR + + + + javascript + WithStatement + MINOR + + + + \ No newline at end of file diff --git a/sonarqube/php.xml b/sonarqube/php.xml new file mode 100644 index 0000000..7d85847 --- /dev/null +++ b/sonarqube/php.xml @@ -0,0 +1,402 @@ + + + Code-Review + php + + + common-php + FailedUnitTests + MAJOR + + + + php + S1145 + MAJOR + + + + php + S1313 + MINOR + + + + php + S1523 + CRITICAL + + + + php + S1536 + MAJOR + + + + php + S1656 + MAJOR + + + + php + S1697 + MAJOR + + + + php + S1751 + MAJOR + + + + php + S1763 + MAJOR + + + + php + S1764 + MAJOR + + + + php + S1784 + MINOR + + + + php + S1799 + BLOCKER + + + + php + S1848 + MAJOR + + + + php + S1862 + MAJOR + + + + php + S2000 + MINOR + + + + php + S2002 + MINOR + + + + php + S2003 + MINOR + + + + php + S2014 + BLOCKER + + + + php + S2036 + MAJOR + + + + php + S2037 + MINOR + + + + php + S2053 + CRITICAL + + + + php + S2068 + BLOCKER + + + credentialWords + password,passwd,pwd + + + + + php + S2077 + CRITICAL + + + + php + S2092 + BLOCKER + + + + php + S2115 + BLOCKER + + + + php + S2123 + MAJOR + + + + php + S2201 + MAJOR + + + + php + S2245 + CRITICAL + + + + php + S2251 + MAJOR + + + + php + S2255 + MINOR + + + + php + S2277 + CRITICAL + + + + php + S2278 + BLOCKER + + + + php + S2757 + MAJOR + + + + php + S2964 + MINOR + + + + php + S3011 + CRITICAL + + + + php + S3330 + CRITICAL + + + + php + S3331 + CRITICAL + + + + php + S3332 + CRITICAL + + + + php + S3333 + BLOCKER + + + + php + S3334 + BLOCKER + + + + php + S3335 + MAJOR + + + + php + S3336 + BLOCKER + + + + php + S3337 + BLOCKER + + + + php + S3338 + BLOCKER + + + + php + S3699 + MAJOR + + + + php + S3923 + MAJOR + + + + php + S3981 + MAJOR + + + + php + S3984 + MAJOR + + + + php + S4423 + MAJOR + + + + php + S4426 + BLOCKER + + + + php + S4433 + CRITICAL + + + + php + S4507 + CRITICAL + + + + php + S4508 + CRITICAL + + + + php + S4784 + CRITICAL + + + + php + S4787 + CRITICAL + + + + php + S4792 + CRITICAL + + + + php + S4818 + CRITICAL + + + + php + S4823 + CRITICAL + + + + php + S4828 + CRITICAL + + + + php + S4829 + CRITICAL + + + + php + S4830 + CRITICAL + + + + php + S4834 + CRITICAL + + + + php + S5328 + CRITICAL + + + + php + S836 + MAJOR + + + + php + S905 + MAJOR + + + + \ No newline at end of file diff --git a/stylelint.config.js b/stylelint.config.js new file mode 100644 index 0000000..28c1fe6 --- /dev/null +++ b/stylelint.config.js @@ -0,0 +1,24 @@ +module.exports = { + extends: 'stylelint-config-sass-guidelines', + plugins: ['./build/stylelint/shopware-object-fit-polyfill.js'], + customSyntax: 'postcss-html', + rules: { + indentation: 4, + 'max-nesting-depth': 3, + 'order/properties-alphabetical-order': null, + 'scss/at-extend-no-missing-placeholder': null, + 'at-rule-disallowed-list': 'always', + 'selector-class-pattern': [ + '^[a-z0-9\\-]+$', + { + message: + 'Selector should be written in lowercase with hyphens (selector-class-pattern)' + } + ], + 'selector-no-qualifying-type': [ + true, { + ignore: ['attribute', 'class'] + } + ], + } +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0cf85c1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noUncheckedIndexedAccess": true, + "baseUrl": "./", + "paths": { + "src/*": [ + "./src/*" + ] + } + }, + "exclude": [ + "node_modules" + ], + "include": [ + "src/**/*" + ] +} From 04aaf757502d0fb080b5fd690c523c16dd13ee60 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 17:52:13 +0100 Subject: [PATCH 07/25] remove defunct tools --- .eslintrc.js | 60 --------------------------------------------- package.json | 15 ------------ stylelint.config.js | 24 ------------------ 3 files changed, 99 deletions(-) delete mode 100644 .eslintrc.js delete mode 100644 package.json delete mode 100644 stylelint.config.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 1c7edfd..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,60 +0,0 @@ -const isDevMode = process.env.NODE_ENV !== 'production'; - -module.exports = { - root: true, - extends: ['eslint:recommended'], - parser: '@typescript-eslint/parser', - 'env': { - 'browser': true, - 'jquery': true, - 'node': true, - 'es6': true, - 'jest/globals': true, - }, - 'globals': { - 'gtag': true, - 'bootstrap': true, - }, - plugins: [ - 'jest', - '@typescript-eslint', - ], - 'parserOptions': { - 'ecmaVersion': 6, - 'sourceType': 'module', - }, - 'rules': { - 'comma-dangle': ['error', 'always-multiline'], - 'one-var': ['error', 'never'], - 'no-console': ['error', { allow: ['warn', 'error'] }], - 'no-debugger': (isDevMode ? 0 : 2), - 'prefer-const': 'warn', - 'quotes': ['warn', 'single'], - 'indent': ['warn', 4, { - 'SwitchCase': 1, - }], - 'jest/no-identical-title': 'warn', - 'jest/no-focused-tests': 'error', - 'jest/no-duplicate-hooks': 'error', - }, - overrides: [ - { - files: ['*.ts'], - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking', - ], - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: __dirname, - }, - rules: { - '@typescript-eslint/await-thenable': 'error', - '@typescript-eslint/consistent-type-exports': 'error', - '@typescript-eslint/consistent-type-imports': 'error', - '@typescript-eslint/switch-exhaustiveness-check': 'error', - '@typescript-eslint/ban-ts-comment': 'off' - }, - }, - ], -}; diff --git a/package.json b/package.json deleted file mode 100644 index 33c5e5b..0000000 --- a/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "sw-IngoSCostTransparency", - "version": "1.0.0", - "description": "plugin for Shopware 6", - "scripts": { - "eslint": "eslint src/IngoSCostTransparency", - "stylelint": "stylelint src/IngoSCostTransparency/**/*.css src/IngoSCostTransparency/**/*.scss" - }, - "author": "Ingo Steinke", - "devDependencies": { - "eslint": "^8.57.0", - "stylelint": "^16.0.2", - "stylelint-config-recommended-scss": "^14.0.0" - } -} diff --git a/stylelint.config.js b/stylelint.config.js deleted file mode 100644 index 28c1fe6..0000000 --- a/stylelint.config.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - extends: 'stylelint-config-sass-guidelines', - plugins: ['./build/stylelint/shopware-object-fit-polyfill.js'], - customSyntax: 'postcss-html', - rules: { - indentation: 4, - 'max-nesting-depth': 3, - 'order/properties-alphabetical-order': null, - 'scss/at-extend-no-missing-placeholder': null, - 'at-rule-disallowed-list': 'always', - 'selector-class-pattern': [ - '^[a-z0-9\\-]+$', - { - message: - 'Selector should be written in lowercase with hyphens (selector-class-pattern)' - } - ], - 'selector-no-qualifying-type': [ - true, { - ignore: ['attribute', 'class'] - } - ], - } -}; From 2309d850d9134bc6f9d0af9598ccbdc7d7347f7f Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 18:12:29 +0100 Subject: [PATCH 08/25] add plugin review test config --- composer.json | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 composer.json diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..e8c3498 --- /dev/null +++ b/composer.json @@ -0,0 +1,34 @@ +{ + "name": "shopwarelabs/phpstan-shopware", + "type": "phpstan-extension", + "description": "Shopware extensions and rules for PHPStan", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Soner Sayakci", + "email": "s.sayakci@shopware.com", + "homepage": "https://shyim.de" + } + ], + "minimum-stability": "dev", + "prefer-stable": true, + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "require": { + "php": "^7.2", + "ext-simplexml": "*", + "phpstan/phpstan": "^0.11" + }, + "autoload": { + "psr-4": { + "Shopware\\PhpStan\\": "src/" + } + } +} From 9f7e4c59b959fe2c4fec5996d292433da2bdbd51 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 27 Mar 2024 18:57:43 +0100 Subject: [PATCH 09/25] add qa rule config --- README.md | 2 +- src/IngoSCostTransparency/composer.json | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index afe0bec..172c755 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ https://developer.shopware.com/docs/resources/guidelines/testing/store/quality-g To do after every update: - validate the plugin against the checklist (manually) -- run all available validations, checks and audits (e.g. using `shopware-cli`) +- run all available validations, checks and audits (e.g. using `shopware-cli` which obsoletes the `FroshPluginUploader`) - build an updated release file inside the development container (see above) - stop the development container - run the testing container (see below) diff --git a/src/IngoSCostTransparency/composer.json b/src/IngoSCostTransparency/composer.json index 2d07556..2b99787 100644 --- a/src/IngoSCostTransparency/composer.json +++ b/src/IngoSCostTransparency/composer.json @@ -1,9 +1,10 @@ { "name": "ingo-s/ingo-s-cost-transparency", - "description": "Ingo's Cost Transparency", - "type": "shopware-platform-plugin", "version": "1.0.0", - "license": "proprietary", + "type": "shopware-platform-plugin", + "description": "Cost Transparency", + "keywords": ["shopware", "performance", "minify", "http2"], + "license": "MIT", "require": { "shopware/core": "^6.6.0", "shopware/storefront": "^6.6.0" From bfe9904350a61ab6c5ec77afd946c9b4f608dba5 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Thu, 28 Mar 2024 14:01:48 +0100 Subject: [PATCH 10/25] refactor composer according to official example --- src/IngoSCostTransparency/composer.json | 29 ++++++++++--------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/IngoSCostTransparency/composer.json b/src/IngoSCostTransparency/composer.json index 2b99787..9942c36 100644 --- a/src/IngoSCostTransparency/composer.json +++ b/src/IngoSCostTransparency/composer.json @@ -3,13 +3,15 @@ "version": "1.0.0", "type": "shopware-platform-plugin", "description": "Cost Transparency", - "keywords": ["shopware", "performance", "minify", "http2"], + "keywords": ["shopware", "storefront", "custom-fields", "product-details", "tabs"], "license": "MIT", - "require": { - "shopware/core": "^6.6.0", - "shopware/storefront": "^6.6.0" - }, - "minimum-stability": "RC", + "authors": [ + { + "name": "Ingo Steinke", + "role": "Manufacturer", + "homepage": "https://www.ingo-steinke.de/" + } + ], "autoload": { "psr-4": { "IngoSCostTransparency\\": "src/" @@ -29,17 +31,10 @@ "manufacturerLink": { "en-GB": "https://www.ingo-steinke.de/", "de-DE": "https://www.ingo-steinke.de/" - }, - "supportLink": { - "en-GB": "https://www.ingo-steinke.de/", - "de-DE": "https://www.ingo-steinke.de/" } }, - "authors": [ - { - "name": "Ingo Steinke", - "role": "Manufacturer", - "homepage": "https://www.ingo-steinke.de/" - } - ] + "require": { + "shopware/core": "^6.6.0", + "shopware/storefront": "^6.6.0" + } } From 46e19089ae80af53a5dc9178a1108a020d41b39f Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Thu, 28 Mar 2024 14:05:03 +0100 Subject: [PATCH 11/25] re-add required supportLink --- src/IngoSCostTransparency/composer.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/IngoSCostTransparency/composer.json b/src/IngoSCostTransparency/composer.json index 9942c36..3b8fc7d 100644 --- a/src/IngoSCostTransparency/composer.json +++ b/src/IngoSCostTransparency/composer.json @@ -31,6 +31,10 @@ "manufacturerLink": { "en-GB": "https://www.ingo-steinke.de/", "de-DE": "https://www.ingo-steinke.de/" + }, + "supportLink": { + "en-GB": "https://www.ingo-steinke.com/#plugin-programmierung", + "de-DE": "https://www.ingo-steinke.de/#plugin-programmierung" } }, "require": { From afe16f3309bbd2db7ce677f23f29d875602fca8d Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Thu, 28 Mar 2024 14:07:31 +0100 Subject: [PATCH 12/25] rebuild release candidate --- dist/IngoSCostTransparency.zip | Bin 17443 -> 16961 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/IngoSCostTransparency.zip b/dist/IngoSCostTransparency.zip index 3f5375d9d2be66a571ebf1d95f0ca21b7854ece3..a7351677126edd38c1b455895712d12ab89f1f3d 100644 GIT binary patch delta 5102 zcmYLNbx<41*9`#*6o=qeTHGCiyHniVo!}G=MT$!aUaZifg;y-JP$1A2D_%Sl_W;2u z{`I|i@B8h}?4EPx-u+`|&d%Ojk%-X~hmolO%{J=sK?)FbZgb z2mb>ze`e=-ZpFIUc@6C@HHUStVW?#hWtEcAjI4t1dclA08 zPG3^bndtEs=>yGH+e3`}#1ha_h?YT7CHWo0{=06%)0GSUU zbhB?wgNEFcrN@3Wp>G^AgAiO?Jk3VXBN5C`$Sl8lLt`--irb5F zw(5^X{zUMY_@_eD;*SY?#YIv*IqMa}FlgMPo4yBhb|l@&(RE02UCW8D_#Qr(H@B9?>B+K~w*zLLNpW$N9vVsqNSS~! znM>Ji>C5k@GTS#>r-wIE-KQEMEp23!nWO-KJhcyD5D-wdS6U*A0YG#uIEw*}-ap~x zWmtvg=03JxeH-%n5)&XVD$YDR)&4{O>GvL*-0p?Y9_%#VGjs z(s~=LM^oKANNjjy;Cyq1u6*7^?X*gJ9|OMI#!S-?>Ew5L;+e# z8t9Xg z1bdt6EIo7fL+&Pv)=nD{wJOe|cAp>mt3o)Q>uHTE_y08+8q0Nfd4VoLH3j`PT_ajE zX$X${Z950KaTE;lVL5UAX|163H7>e$^Lna^p)4Z4PB+T5yI~=SSGZkSQE!C96`BBD zZf2;>Sqs&dvZ}a^69_GMkSH*p{a6w*iqtS>$#M{ws=Et`E%VX4Q0+}tm;uK#Fpsg0 zyvuuvd2EKZ+xS?n_~v7kE6gW)M@n+preJ(Zm|xWMO}9iwThIlU=zTirtqnOHsnyW^ zsH==c>@<4kRs~rT!CK41R+$7J;<Eg%re z^AsBpv*x>FOf_}pfwy)K4k@rXZQ9ZZ@6L90Fy=wHSgiJaiiR-U?|p=|D?>4j6?(4E zVU#Vs!c{v~Q-KTkShBGv#l-RI#QC9=`IbZ{AcB?GqSr^O)b?kIC*)ppM)!CIjSB0X zW8Bt9O!Jx-Koa*HN0*Z|7Nh{AA|EwRZZGDDxKg-^$>c_0nng^(+@b{aVguYKgZzwMq%N+D?1I|~=D?)a)k4UBL_K>vWAq67%(ot&0`mUHk>e zP!B=r$n4hfJSsZ6o8Ou^u3tgt2W^SpHt}@E8SycR3cRn*d5A60$a6<27+7+_d5*E` zg^a|f>mQt4OxFtQcbqd9_u&wqi?P0`@Y}4yG#va;A`2TRFW=Hq>Y&E7>gTeij*;uP z1gsIJg>D7bsI@Oj(7#4mH%E}tM9vs@AMKSBxIFN`Tq2^x}~M1DQJm> z@vzgM&4_QzeHTSlX5Oz+_Cql_n_4XiBqGDo*SEC}eZL^aPDPdUQ!cxqm<={K^`$+$ zU4!7@i*abecLz>hn?rC4 zPE9q5`a9-B_!s+64dp+%b=Q}mOP_w%rOcrvy|C%!;{%7p>#3@$c17KJn0^p9J42m#kpC>{MIlOo zZIR6{j_iUy!;9CJ6DVx!xcT`ZK1+AprW4cC=fS;OOgr!8j73GX*Sc^lEP@XLkV+Ms zP`(Xcw&f+fdu7d)Agwf6A+CW+akc9FH*Kayi&xTm>YhaVlfiYzpH??p+i5O+1)Wy- zUIyQ?NN~7CibusN1ym0pWWNmLZXNW=Em#Of48-(>Zf0(C`jt%II+V-wt+opZ=vW$4 znNqi|QOxf3HDiYykQS^d$PD?hzx5iZgA%fq1bsREyb5c3iu*S3qSiE&=;4&P3unL|-X6JXze9#hJ ziXSRD14gzU-dV#b^hD1y#pxwnbai=~lE$Z5djGuoU=8?XccoXDn|h_vM3XUkFF>zw z$YI(r)ZEto_GEWFQS+>Ov@57Bw3#W*a3o?q@6$g&}## z1spQoA&HW@=!@_U-;)VY1C^oAH1stL9(O8(h6sT|z0$P=K(kI{mikRT3T9l(7N?@b4Ynr z)kNE@6-)c}*IP^=B^9NY7LEbLdj7}_$;)>$UXI1?X+%EF9?=@!i&)~_iHUy01_T$7 zEXBbksMEjKktM16&(CQ7cCL_uSDbeloGml+5kyu=!Od8?1D@)ykc^f`n}75lcFinz z$b*y6YY~#gz`cF;&VDaLy^73pa&zJA65X&cv&tUYK!Ggs<7=mZ!MK)D8@D|0E-BUI z>8;k4$JsOSw%ZBTq`EEmXv?W2(WLbJ2ZGxG?fRGkw$_mF4`ia!)lI`)xZTp^82t^( zZ6;3@&Q_Uw)9j8i1eMFfUfGI?8~a2cMIe3&7!K4Eq#AA%;5SN8kA-_He^ffh)&WG* z7ys)N$GiKwfQ=p-)@`$|p@tF{TBS*9(;Qf80=yd8f|8-XGAwv*d=u$9kJYF2m=0h9 z0yyz5CjJ8@amJ!IG04vW>GlWMcES#rNCxwtp>~#yPE;v6Vrf~^HqoQU1mT5|W9$bp zo+LZ%^Nj-eI^uUw6pfAkd-q$|uIk_gQ=#MbdUuH9D;ZIip!)_D-1%K8nIiF*UyPom zErOo2S-BJ!_<#6pv?tP?pI&`l@LjD%vrH1_bWEe{=lz}9J(GaxoVCty*S$$hsyM~w zU>FlKcKece`xX3m+b<9dsh#xVV#`EUc}xU75T4q&)J5h7z4=Y8*a<)C;~I>}iERl% zqxkKwM@ENbg&IEU5n5)?pA3wr5_wJxT2n5tPIJ8AcLQr##i1yc zL1ioLb@w9@37?P)>gDA=re@@e(z(mge*fcwD;t{2Lo@a39C2pK5H>z9aA~& zlC@xxE&2U`q6m&lNe91pE%tCJr|+h$Gw2D9Ic0R`dj&L|4%aX(5)2y^#o}To4B(}J zKK1C%2CA1?q2MFZr^<1Gc6VoK6(f1q!(@rz2yRWO#qZNT@eG?m(m$u_l4>>DAvT4A zE50RNS55ZX;#xBYh~W>m`TcMr;pMu-uhrB}!8e^yPUG#?OcKkU$>YRrO6kQ%n}bu| z2CodxA66D0@C~4A7YEM8LwIc+Hz_}Upu8F5Ej{tgPHU}|I%W0v6$svLB3`sZtPELD zt?cf3f_#EfQpnv??@zrRvR(#HUeMQm(5B|)xneIg8~Q@BM@zA+miC1`tFpR6IIQh( zi@z8Oy>G1p-FIcA{xI{EV0TyNd@cEGlJJsOp`#<6U*(UnY**DDtL?hg6y;`~MN8_r zVhgNBG=dJGh6dLP%SjpQm}hopmCCQWyl(YQUlcVbeD$1~yC!z+IciquDr3Gtw!Y|I z#%F$zJaWH(dE0DxkbF)Y5%{MfS`i5680_7qxO{m0UwQQ5y0Y+q007`1{JT7Y*$N84 z5DIk7)&f7Vp*oN~3DB=gQ!ABZp=Ub4Go@O|=yvKL(T=W2Co;?#e7LhMN2L2TvUFch zJ*l|T{I`R3; zCr+{m`#Rj-y}eojd;P?HcKX@M{#JK334?SOW&lD2>MAwxxcr>QE`l|%2ro^LtGAUU z`D9;IwJDKxRYc6JSHgIl@$pvfn7@a{Z=Bt0w){L+jO4LRDy`j@y%h-4*W9ko~0 zJ*Y)br8((7m1MhZL*Y`fu`G`WUN;Mp5>%@CW8uVdV*V}_=6FRFY9jkgBj@aA=K6%f z9C8XHQ1VDZ?S9w}28;QGGS_Q}uy#|uYGbHF%Rta%%4(_o&@2_VEwNG8XR|ApvXg`F zLv5HjXg-s!8x|{YOc1A0h8=ca_=m~uTO308KE^9?4i4K@+AV=#(jLx^$4zD5gIXtM`W`8e;y~PS(P5+{bgRqnd45%-YeV*&rUX-Bzw`W5ZS6uz z-?-N!a@;!1Y^Q2MZC-(fM`bl7#28va~bO?_Ws5d562JLzbaF*HodtQ*e};# z+v`K#otwz*^}MM`FZ6x2p9d8V_$#hza@x|GWI8GUzntDRUsnx`B%Erj!oRiCdeX7l z2o?QdGQH%YqjsXG-^o@>c|gHsU*(Vx&tTZO=U>rsQ_;%)wIh#Nb73MXxF#_AZ5&nZ z`ZWeYWkM;MB>q7W`!%fjrf?tGM-YfoKjLln^0?D@C3=WFT~iPB*>iMUBdMr*ILvN) z1eS8bUsH5V*6_l)nR+Utv7(DOJ*r>ygC2i+3x0Mq`)YqZwhlIU*SYv`;HL66V?*$f zbn?N(?ttI7-D+`T_Rw0AawPi|smU;raMwKcOw5Kb8Wj7OmOVHx_1o_nOY6n;i2$ zlc4WpZ!rEaF!4V<1Viv05byu{3NUkN2VgA_CP+gMo0nDs9zFU4MPU#!Y#2QbF3e7b z3+RaRufz@8mr(_(ll@EiU;=U^uqs(vpaR7o2@JcHwEH56l{pdaX4nj2ghd;i49#!ZXpL%oxP7KS%8Uc}tcfFC0 z6*5`Wewdl)l1YH8!$Y+kbPvV)TB<8WkJJykC$zd%T@$VBxx=fgMt!Ra)#j(Fe5-B= zQ=_lk@Il%tfzx-g4!_=1$>+I)WeH`PxZ^c)h#iLc&!rnPEJOf!;e!JwLHEDgP(HrJ{1aA7|Yj3Dl1TY+G7>j z1%ZB(vDX_UR?FDm`zArRXQq}hoz{@-;0js&8pWX0F!KJPL6bPERu&tif``pqENefC zWBj-O>bTG9_SN_qa=U%3rKYQ9Jg{pFtvO)E;8RD?hy~~lmk{}k1$e(c{>B^tz!wjm z1_0ixkbywNi`@##sXt-CsJ}E(mq_uFo*#Uk`aK-RSo3-q)u>mwj_B_(5ZSfZ6&>ZOKsvf^zxX^e7i1md z)JYs4XzI20%iq?q4Qqg`A~_JG=Yg~aM%wZc-f`Wr`{p4%4+>!h_9`mS#gEHD3cfLo zrM2t)&fn73?cEYAG+TCCdfk{YQRw6TJD{E9HOB_qn#-|bPQXp_LnRca%+$&%u{<%wG0^yBxy)=H z+IRcV$F55eJOF#pvNe+s!El?S()2a&1j)Q74=VVPOm^)qraNSmN|lon0rAi^ToOAG zR;Is9gg6w{%zhdaFb_5BDI$Vs22kWRDP>yVZMytsaVnr?>mik!e?TwsA?afSJ?y5R zrlLLIL<4!MO&mONM?=o-w4W4ZsS}VmJHH)&X_=jx@&;xa5hdB)+9wVGnB8eJfdD_{ z_Q&7Er3&GK0G@2*Zs9WZ-?|65dU)LA5kSBj{YOKr6Wz3_{$~W(#Q5&b3SSx5Sy{pl z*9Tt_jg*<`VgY`psWR>^P#{f-I@%AGqk>a@e_O`WDjyVkaIsm?N|NjOmL}d%ZyB|= zEL@;zXbzj#|J`B9{GwcUrq5jWT1?B})FjGNruqmG1*SsTNh zM56B~bR5)sCWk}(N)(|?31>$cD3Z@!`Iy#iM={tza)vsw)nS-|uAW})r^?+Mv)2UK zu*M&fgQN8yK01a{=6`}so9GN@`di%`zuI3AtQoPPJ%8sqOd3`*?W!B2{p1S@7jHG` z=~ZiX(NpWN)v=YZOXh($&F4H476%DjPQNTRX)r&$rq^sRb0Q=Y*pENb zc4Aw8lWUh;bUi`a|f)c4+onRb4gmImf{CAqx}mODQ`SGX82RHU>!raW9(`BBk6 zWskiyTFjO*Qut?mXI1IEr?+O#8Ayel*F=|XHZAWy-mRKe)=)WwxvJGasJ1pMY{2U$ zP3-+O9vBp4-JQyxxT}IMBq+F95pc3(ONlULxO1fALsU}r`Yof+sOZei%`+X6v|%ze zHaVg4J8Hw>*6jfwKOU4jIm*%`7UUA=YVPNPu(VHt1o4Q-bhLG3xkHvvN6WUceQO&Z zxr#4l!6MtoaX90mLu^_pT{SfURrJF>H@?kHpD|K7BQ*=t1DcvOSYQv7=AZ$VJY z)Sz0=amSO4#Kb5j9n26lg^`#T3@Y1(U1k|M=PbP~5x4jyfPxS=gv;gOO{Nqw{fd@< zhyenjyqa%XcJRMuKe@uPV!iQ?TK*zoK!{sqG(wFaQu$IOP1({XX7-*UwdnnBxT2W= zne6b$iY;@P(oAsWfp5$6`t-)eoVq&CYIHEcK}mt_CUW3@=2&A!iUv0gb`2U(2k+rh z9o9}F(;XZfP<@H00?>*b!S+aqUrQFKt)XpJrF85c3s$pKS2wW; zt=>j9QsAw6U%|?Mwe(M>MfdcIV>#JXQK^IIqm}MN+Edk*n0!X_uUpza=q{6E;1yrZ zr^-f0dpEP9y;!byi!G1Y)&&p^2?;Dxe*O-=?jC%tPPRYS9LIBCdEwx&03gs|eEiCQ zMTbK+Nox^8>!bv_2L+hn@CdAVJ)og*AJ5si7^p%w~X~5z?cCu zGAp?VyH6!pZ3VP)(zS{dIdB$#GgM-Ja^^8U6>1xnxQ>cD5_=7i}_LEFF2r?O}!BO^iUThQ?D9&e|n zYT%=akk>Wb0z}i0zY6wPxbrRZ_w*#$tr3EGu4vFk+c_Rhbp#p>buJPV46bXgC-POo z&g0C>1HScE3=>9kC3iQQ(9l9O$xY#MWl+EPMPXgx3`0#V`U2>*BlSYtZOj{NYd@L< zq*R!A`|{|gGa%aTZ0;2DDvlwDK5^2ien6^RgAu8ZY|QG`ZDh=91=yaPgE(Yq$3@=emG<># zXmQ}(N4Og<(N-8L-`nCA*|aC_=0k#@vk#kJL_YGj1i&qiB8SqE7M9Bu-29E%i3D^O9k8t%W)J&qXQS+96g8IfWK110Y;2DCdNj7{EVV zJJmi|1zbq!O2WXOG7${XGQ!lVjs1JcGh*DfkGMhUyz5?co$8;jZRi=O&0#MhH0tS8 zt|aISOAXS)6-R{iEf%5%&I!HjP|GGlE<0q3-!}0CEnY?RL-K#VR%ob!^KI+zsgN;F z?6q!v^&VtS4@%YEd~cv7VEc(Y8E=w9alz~NWN3TFy0~7X9Bzr38Y{*r5QFTpyn%hs z4yEP$8t@`{UzMTR_t5Z2H3p`-HMWk6*AzLW+;R}Onvv{hGIJ50rz8Yz+J8Erv2k>o zW9E=;jLyW{T8vOkk)CZc?H5h?tXo}E6Ol_t$a!ZI+6?MNZM$C>n~(tyn*?IE0ycDyXT zf@7y%%jy4yqCdG0-@UHd9_V_7IVZgnZn7d#{8eU}IeO1tdVjO^ z8_5;l>{J$l3)@D%#klL@V~ci#{)`e5rx+CVdNIssrE&hPb|7&lGJa9j?rNZ?LI5mE z(}&9IZ(CT<9#Hlzxq?xDSNT-jjUC1oARDM`1Q!m*L%WameMxua*T5G?P9t!f=h7is}782Drv_3|>JpFF{h+?{aJ;qeiTl4*>mH%=ErC3$j z2Ezzqi$>Wes*w!#V=_wnVQcQhNPSnxiH`P3_k+(s?wvz0Q3M;sovl2h>(!ye!qz;c?2;PF+oUqz{qskt(DnwD5t`s)0z0#ddxwm zN82I-LPT7fnq_sidMbxl9WkNz6Tn);M~y3+5N4{iC&RL9>%Pp)dWTR>o?ldC&MemL z432Iie*B0L244B<@Pot>1yrMkbEU0gAdh+Wgl`ivGu7t#Wh4XDjw zzPfVLCK%|{mJbRDnE$b%(At~ap{DN|P#%)f{X18fdcSH^@Mqg|ln__5!6=^OP((J0 z@Nf6fySjS499;1(R_1j{I>lY1&+991glR)&LJrJWAfqx`S(2OSwrttsNhwXauOJ~k z1~P-`y2jkpqP2umGOp1cLODvMlHFi)d#x11?`1o>jB;)1zfIht4$MEUayrzwtI1d= zFk#s^dSxBKKN-&mC*LR0(9k3%CPws(qlnC!UnjJ%JPmWTv!$TACpvTHS~0O4Q&nkp z6o*x}Elos~-daf+Lmn7ReDrCHDhNnCP!_inl`g%tuG#x&BO{HeCB11{@dV-5CVPjs z9ffCqc_`#+j57sF2K6^&iss~CWn5%`P#WeL1;!^F+*=o0dTG39GnSiM%l7SMBs6b3 zi6PiCf49yOsqe!Z_=XjO+nX@&``|X!>59L}T^-%H_7-;Yf*b?@D3l10ATDZ=cY1*T z8=Au=)$1^%0DuzNKSML05DP9$(c@H#yaU!{N5wl-^O@jyQu8^jJ{h9$a<)UAOXQ_n zonY{LU)1^6+I{_J@dYuS*WSRTBQV-wP>ff3qLvr@XtO0|=QmFD2Yybel=JItQuCfP z1MmaHbG1K(JNA)FY(1t;DUYhcZh4f=XxPxSx=<8qQJj*ASG|!O@G=Y52)4(W3}SiQ zNh32BHAqLjX7NBZ@REkzeDJL&1EYX#KHn=c9HL<-X-Sl-xsv_$gT5=h$eJhQJ+fxt zPn8R=#N5cGCFk@-Q|pu2=C7wm%11}b8CD73(L`;_u)pnP`ml3$Y-;eVSf3(BnU3Q* z{pPb-<36S#Vf{0eRS@a~#u0?AF)N;~xzR=pcP%$?Eut6nE;zUQ1IalZ&&!078W*lq z$uWNl@ozl+p|FY0%RK7BH%)nIMKHr|7JkBlIOoI|L{{Uet%(yNl0B-vAa=elO?5kB{hXi_L!&FNlD>vG-*JyFKS}5M7tA*1bMNGi4B>wzt4<9PlZwLpys3@Y(fGGUj*;LEF8eF9l(S%LkW-RIeiWj`KPgX!hli4CSwE)%uN zK*XHw4NQ`$FCT+%Z{P6TQu4*+=l__qUzKotZ^<2j7-^`u;HRH$_7F~F-)yN!O^$~o z6=K?qRv0#1;|1f03V6BdnfJvK&pE=MVhQ(s^+pb$vbK`CVIG#=aj7-BTx4XY$89Cl z(eiK0>5h4t)ScLo6iy{goZ#x3lHETdB_MyWjLz3iI#F;C;|a&T|ohN14>ok&lu zo7}yOvfEFw?4+;1{%rLlFI~*IZI{9`^$Q8d^1sYd0aF<}88+}EW}mNSx+fQ1G~6I0 zs_x1DQ3c6gFNyC6X@&mlCGq`77G9EfK!X4Gm*D;~cEC44_?jFO{7Oa{IEecfK7p^w z;=ui6MS;?I|57h37Px_23KlK=r(6zDgzoRMG`x-u58evq15(rfLm$dZ0Vn Date: Thu, 28 Mar 2024 14:10:52 +0100 Subject: [PATCH 13/25] apply SonarLint fixes --- src/IngoSCostTransparency/src/IngoSCostTransparency.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IngoSCostTransparency/src/IngoSCostTransparency.php b/src/IngoSCostTransparency/src/IngoSCostTransparency.php index 02194cb..52222f4 100644 --- a/src/IngoSCostTransparency/src/IngoSCostTransparency.php +++ b/src/IngoSCostTransparency/src/IngoSCostTransparency.php @@ -154,6 +154,6 @@ private function customFieldExists($context): bool $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('name', self::CUSTOM_FIELD_01_NAME)); $customField = $customFieldRepository->search($criteria, $context)->first(); - return ($customField !== null); + return $customField !== null; } -} \ No newline at end of file +} From 6587a0fb35ade22d352fb09efb9b811c50642b2f Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Thu, 28 Mar 2024 14:26:25 +0100 Subject: [PATCH 14/25] update plugin description and icon --- dist/IngoSCostTransparency.zip | Bin 16961 -> 15709 bytes src/IngoSCostTransparency/composer.json | 8 ++++---- .../src/Resources/config/plugin.png | Bin 3368 -> 2091 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/IngoSCostTransparency.zip b/dist/IngoSCostTransparency.zip index a7351677126edd38c1b455895712d12ab89f1f3d..3d356372ff45cf13e96f42c3399a123edf31bf6a 100644 GIT binary patch delta 4042 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 J#s9Bj{{jcYqN)G@ delta 5306 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 From d5c2214abe87b85c6c3c965e547c7eaf65e751c6 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 13:32:15 +0200 Subject: [PATCH 15/25] add test information --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 172c755..c822433 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,13 @@ There is an official testing environment built with Docker, used by Shopware for validating plugins. Their setup includes some of the typical gotchas like subdirectory paths and a nonstandard storefront language (Dutch). It always uses the latest 6.x Shopware release. -- `docker run --rm -p 80:80 -e VIRTUAL_HOST=localhost ghcr.io/shopwarelabs/testenv:6.X.X` +- `docker run --rm -p 80:80 -e VIRTUAL_HOST=localhost ghcr.io/shopwarelabs/testenv:6.6.0` +- replace '6.6.0' with the latest tag found at https://github.com/shopwareLabs/testenv-platform/pkgs/container/testenv +- Access shop at http://localhost/shop/public +- Admin ("Beheer" in Dutch) at http://localhost/shop/public/admin#/login/ +- Admin credentials: + - User: demo + - Password: demodemo If we want to retain and claim backward compatibility, we must repeat the test with alternative versions, e.g. by using Dockware Docker tags to rebuild our development environment. \ No newline at end of file From a8a554088da8c8fdc755b147f824c56212da73e0 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 14:59:38 +0200 Subject: [PATCH 16/25] facilitate and document color customization --- README.md | 25 +++++++++++++++--- css-custom-properties.png | Bin 0 -> 97570 bytes .../page/product-detail/product-detail.scss | 14 +++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 css-custom-properties.png diff --git a/README.md b/README.md index c822433..3c89f81 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Inspired by potential customers' requirements and based on [Ingo Steinke](https://www.ingo-steinke.com/)'s [Shopware 6 Theme/Plugin Development Template](https://github.com/openmindculture/IngoSDev6CertPrep), [IngoSCostTransparency (`sw-IngoSCostTransparency`)](https://github.com/openmindculture/sw-IngoSCostTransparency) is a free and open-source extension for Shopware 6 that adds optional additional product details as custom fields with responsive and accessible graphic percentage display on the product details. +The extension adds a new tab on the product details page for data visualization of a product's cost factors, so we can show our customers where exactly their money goes to build trust and add facts to sustain our sustainability claims. + Colors default to theme colors but can be modified by overwriting custom CSS properties. Label captions can be configured in the extension configuration. @@ -11,9 +13,6 @@ previewed in [marketplace-descriptions-and-screenshots.html](./marketplace-descr The content of the images/screenshots must be in English. -TODO: add a more specific purpose / use case and detailled instructions for installation, usage, and test. - - ## Cost Transparency Display in the Storefront The layout is responsive and accessible. Mobile content will be displayed off canvas like the built-in description and reviews tabs. Tablet and mobile views show column rows, while wide desktop screens show columns. Captions of small columns will be shortened. The full caption is available in a title tag. Simple HTML markup is possible in captions, like using bold tags or list items. @@ -61,9 +60,27 @@ The basic plugin version uses the following five percentage values per product: - value: integer `product.customFields.ingos_cost_transparency_percentage_04` - value: integer `product.customFields.ingos_cost_transparency_percentage_05` +## Customizing the extension in another extension/theme + +Technically, the data is stored in custom product fields and global text snippets, so you can backup and modify this data in your own custom code. + +You can also use custom CSS to override the default bar chart colors, shadows, and layout defined in `product-detail.scss`, e.g. + +```css +:root { + --ingos-cost-transparency-color-01: #f5e04d; + --ingos-cost-transparency-color-02: #3b9df9; + --ingos-cost-transparency-color-03: #45b571; + --ingos-cost-transparency-color-04: #e44a74; + --ingos-cost-transparency-color-05: #eebd57; +} +``` + +![screenshot](./css-custom-properties.png) + ## Compatibility and Contribution -### Initial Release 1.0, March 2024 +### Initial Release 1.0, April 2024 The storefront has been tested with the lastest major browsers, including Chrome, Firefox, Edge, and Safari, on desktop and mobile devices. Chromium, Vivaldi and Opera have also been tested successfully. The basic functionality should, but is not guaranteed, to work in other browsers like Internet Explorer and older Safari versions. The plugin has been tested with and released for Shopware 6.6, and it is probably backwards compatible with Shopware 6.5 for which it had initially been developed. diff --git a/css-custom-properties.png b/css-custom-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..a24b4117ba26d7c92d60d8693ae033fa1901ba8d GIT binary patch literal 97570 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 E0BI}Pl>h($ literal 0 HcmV?d00001 diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/src/scss/page/product-detail/product-detail.scss b/src/IngoSCostTransparency/src/Resources/app/storefront/src/scss/page/product-detail/product-detail.scss index 4a706f8..9566fdf 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/src/scss/page/product-detail/product-detail.scss +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/src/scss/page/product-detail/product-detail.scss @@ -1,5 +1,12 @@ -/** additional cost-transparency information */ :root { + /* default colors can be overridden by themes or other extensions */ + --ingos-cost-transparency-color-01: #f5e04d; + --ingos-cost-transparency-color-02: #3b9df9; + --ingos-cost-transparency-color-03: #45b571; + --ingos-cost-transparency-color-04: #e44a74; + --ingos-cost-transparency-color-05: #eebd57; + + /* widths will be overridden using JavaScript or fallback body styles */ --ingos-cost-transparency-percentage-01: 100%; --ingos-cost-transparency-percentage-02: 100%; --ingos-cost-transparency-percentage-03: 100%; @@ -60,22 +67,27 @@ &:nth-child(1) .ingos-cost-group-bar { background-color: #f5e04d; + background-color: var(--ingos-cost-transparency-color-01); } &:nth-child(2) .ingos-cost-group-bar { background-color: #3b9df9; + background-color: var(--ingos-cost-transparency-color-02); } &:nth-child(3) .ingos-cost-group-bar { background-color: #45b571; + background-color: var(--ingos-cost-transparency-color-03); } &:nth-child(4) .ingos-cost-group-bar { background-color: #e44a74; + background-color: var(--ingos-cost-transparency-color-04); } &:nth-child(5) .ingos-cost-group-bar { background-color: #eebd57; + background-color: var(--ingos-cost-transparency-color-05); } @media (max-width: 1188px) { From fd262df508f4142172d4ba3e7dcf463b25d8c92b Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 15:07:35 +0200 Subject: [PATCH 17/25] document cross browser testing --- README.md | 10 +++++++++- storefront-testing-dutch-bs-local.png | Bin 0 -> 34346 bytes 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 storefront-testing-dutch-bs-local.png diff --git a/README.md b/README.md index 3c89f81..9ebce9a 100644 --- a/README.md +++ b/README.md @@ -224,4 +224,12 @@ storefront language (Dutch). It always uses the latest 6.x Shopware release. - Password: demodemo If we want to retain and claim backward compatibility, we must repeat the test with alternative versions, -e.g. by using Dockware Docker tags to rebuild our development environment. \ No newline at end of file +e.g. by using Dockware Docker tags to rebuild our development environment. + +#### Cross-Device / Mobile Testing + +We can use a service like BrowserStack to verify functionality in different devices. + +We can add an alternative host name, like `bs-local.com` in the storefront configuration. + +![settings screenshot](storefront-testing-dutch-bs-local.png) \ No newline at end of file diff --git a/storefront-testing-dutch-bs-local.png b/storefront-testing-dutch-bs-local.png new file mode 100644 index 0000000000000000000000000000000000000000..e84cc3cec5a390c5059a0860fc6d47b8eceda526 GIT binary patch literal 34346 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 Z8WW$KvowvkR_gXu(&7qYg`x)E{tq=`>o))Z literal 0 HcmV?d00001 From 894190e7783762e22c08781050f9028f82995485 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 16:24:39 +0200 Subject: [PATCH 18/25] hide 0% column --- .../page/product-detail/ingos-cost-transparency-tab.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig b/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig index b05bdf4..bf7f975 100644 --- a/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig +++ b/src/IngoSCostTransparency/src/Resources/views/storefront/page/product-detail/ingos-cost-transparency-tab.html.twig @@ -14,7 +14,7 @@ 'ingos_cost_transparency_percentage_05': page.product.customFields.ingos_cost_transparency_percentage_05 } %} {% for ingos_cost_transparency_percentage in ingos_cost_transparency_percentages %} - {% if ingos_cost_transparency_percentage | length > 0 %} + {% if ingos_cost_transparency_percentage | length > 0 && ingos_cost_transparency_percentage > 0 %} {% set labelSnippetSlug = 'ingos.costTransparency.costFactorLabel0' ~ loop.index %}
Date: Tue, 2 Apr 2024 17:04:11 +0200 Subject: [PATCH 19/25] handle off-canvas display (WIP) --- .../ingo-s-cost-transparency.js | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js b/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js index 70a6a52..ac42501 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js @@ -2,14 +2,50 @@ import Plugin from 'src/plugin-system/plugin.class'; export default class IngoSCostTransparency extends Plugin { init() { - this.addAnimationEffectClassNames(); + console.log('ready to set regular event handler'); + this.addEffectsAndSwitchDetailsHandler(); + + console.log('ready to set percentage styles'); this.applyPercentageStyles(); + + // this.$emitter.publish('onClickOffCanvasTab'); + + console.log('done setting regular event handler, now add plugin emitter listener'); + const tabElement = document.querySelector('#ingos-cost-transparency-tab'); + if (tabElement) { + const offCanvasTabPlugin = window.PluginManager.getPluginInstanceFromElement(tabElement); + if (offCanvasTabPlugin) { + offCanvasTabPlugin.$emitter.subscribe('hideCookieBar', this.onHideCookieBar); + } else { + console.log('no offCanvasTabPlugin'); + } + } else { + console.log('no tabElement'); + } + + /* + if (tabElement && tabElement.$emitter && tabElement.$emitter.subscribe && typeof tabElement.$emitter.subscribe === 'function') { + tabElement.$emitter.subscribe('onClickOffCanvasTab', () => { + this.addEffectsAndSwitchDetailsHandler(); + }) + } + */ } - addAnimationEffectClassNames() { + addEffectsAndSwitchDetailsHandler() { + console.log('addEffectsAndSwitchDetailsHandler'); const animatableElements = document.querySelectorAll('.ingos-cost-group'); + console.log('animatableElements', animatableElements); for (let i=0; i < animatableElements.length; i++) { - animatableElements[i].addEventListener('click', this.costGroupEnterHandler); + console.log(`animatableElements[${i}]`, animatableElements[i]); + if (!animatableElements[i].dataset.hasEventListener) { + console.log('Element had no event listener yet. Add event listener...') + animatableElements[i].addEventListener('click', this.addEffectsAndSwitchDetails); + animatableElements[i].dataset.hasEventListener='true'; + } else { + console.log('element already has an event listener'); + } } + console.log('after iterating animatableElements'); } applyPercentageStyles() { @@ -24,7 +60,7 @@ export default class IngoSCostTransparency extends Plugin { } } } - costGroupEnterHandler(event) { + addEffectsAndSwitchDetails(event) { if (!event) { return; } const activeGroupElement = event.currentTarget; activeGroupElement.classList.add('ingos-active'); From f1899669c7b81fd70baae12a516068ec1d14782a Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 17:39:53 +0200 Subject: [PATCH 20/25] debugging (fixup) --- .../ingo-s-cost-transparency.js | 2 +- .../ingo-s-cost-transparency.js | 37 +++++++++++-------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js index d591bf5..64487b1 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js @@ -1 +1 @@ -(()=>{"use strict";var t={857:t=>{var e=function(t){var e;return!!t&&"object"==typeof t&&"[object RegExp]"!==(e=Object.prototype.toString.call(t))&&"[object Date]"!==e&&t.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function i(t,e){return!1!==e.clone&&e.isMergeableObject(t)?a(Array.isArray(t)?[]:{},t,e):t}function n(t,e,r){return t.concat(e).map(function(t){return i(t,r)})}function s(t){return Object.keys(t).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return Object.propertyIsEnumerable.call(t,e)}):[])}function o(t,e){try{return e in t}catch(t){return!1}}function a(t,r,c){(c=c||{}).arrayMerge=c.arrayMerge||n,c.isMergeableObject=c.isMergeableObject||e,c.cloneUnlessOtherwiseSpecified=i;var l,u,h=Array.isArray(r);return h!==Array.isArray(t)?i(r,c):h?c.arrayMerge(t,r,c):(u={},(l=c).isMergeableObject(t)&&s(t).forEach(function(e){u[e]=i(t[e],l)}),s(r).forEach(function(e){(!o(t,e)||Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))&&(o(t,e)&&l.isMergeableObject(r[e])?u[e]=(function(t,e){if(!e.customMerge)return a;var r=e.customMerge(t);return"function"==typeof r?r:a})(e,l)(t[e],r[e],l):u[e]=i(r[e],l))}),u)}a.all=function(t,e){if(!Array.isArray(t))throw Error("first argument should be an array");return t.reduce(function(t,r){return a(t,r,e)},{})},t.exports=a}},e={};function r(i){var n=e[i];if(void 0!==n)return n.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}(()=>{r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e}})(),(()=>{r.d=(t,e)=>{for(var i in e)r.o(e,i)&&!r.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}})(),(()=>{r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e)})(),(()=>{var t=r(857),e=r.n(t);class i{static ucFirst(t){return t.charAt(0).toUpperCase()+t.slice(1)}static lcFirst(t){return t.charAt(0).toLowerCase()+t.slice(1)}static toDashCase(t){return t.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(t,e){let r=i.toUpperCamelCase(t,e);return i.lcFirst(r)}static toUpperCamelCase(t,e){return e?t.split(e).map(t=>i.ucFirst(t.toLowerCase())).join(""):i.ucFirst(t.toLowerCase())}static parsePrimitive(t){try{return/^\d+(.|,)\d+$/.test(t)&&(t=t.replace(",",".")),JSON.parse(t)}catch(e){return t.toString()}}}class n{static isNode(t){return"object"==typeof t&&null!==t&&(t===document||t===window||t instanceof Node)}static hasAttribute(t,e){if(!n.isNode(t))throw Error("The element must be a valid HTML Node!");return"function"==typeof t.hasAttribute&&t.hasAttribute(e)}static getAttribute(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===n.hasAttribute(t,e))throw Error('The required property "'.concat(e,'" does not exist!'));if("function"!=typeof t.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return t.getAttribute(e)}static getDataAttribute(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s=e.replace(/^data(|-)/,""),o=i.toLowerCamelCase(s,"-");if(!n.isNode(t)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===t.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=t.dataset[o];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(e,'" does not exist on ').concat(t,"!"));return a}return i.parsePrimitive(a)}static querySelector(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!n.isNode(t))throw Error("The parent node is not a valid HTML Node!");let i=t.querySelector(e)||!1;if(r&&!1===i)throw Error('The required element "'.concat(e,'" does not exist in parent node!'));return i}static querySelectorAll(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!n.isNode(t))throw Error("The parent node is not a valid HTML Node!");let i=t.querySelectorAll(e);if(0===i.length&&(i=!1),r&&!1===i)throw Error('At least one item of "'.concat(e,'" must exist in parent node!'));return i}}class s{publish(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new CustomEvent(t,{detail:e,cancelable:r});return this.el.dispatchEvent(i),i}subscribe(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=this,n=t.split("."),s=r.scope?e.bind(r.scope):e;if(r.once&&!0===r.once){let e=s;s=function(r){i.unsubscribe(t),e(r)}}return this.el.addEventListener(n[0],s),this.listeners.push({splitEventName:n,opts:r,cb:s}),!0}unsubscribe(t){let e=t.split(".");return this.listeners=this.listeners.reduce((t,r)=>([...r.splitEventName].sort().toString()===e.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):t.push(r),t),[]),!0}reset(){return this.listeners.forEach(t=>{this.el.removeEventListener(t.splitEventName[0],t.cb)}),this.listeners=[],!0}get el(){return this._el}set el(t){this._el=t}get listeners(){return this._listeners}set listeners(t){this._listeners=t}constructor(t=document){this._el=t,t.$emitter=this,this._listeners=[]}}class o{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(t){let r=i.toDashCase(this._pluginName),s=n.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),o=n.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,t];s&&a.push(window.PluginConfigManager.get(this._pluginName,s));try{o&&a.push(JSON.parse(o))}catch(t){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(t.message))}return e().all(a.filter(t=>t instanceof Object&&!(t instanceof Array)).map(t=>t||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(t){return t||(t=this.constructor.name),t}constructor(t,e={},r=!1){if(!n.isNode(t))throw Error("There is no valid element given.");this.el=t,this.$emitter=new s(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(e),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends o{init(){this.addAnimationEffectClassNames(),this.applyPercentageStyles()}addAnimationEffectClassNames(){let t=document.querySelectorAll(".ingos-cost-group");for(let e=0;e{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function i(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function s(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||i,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&s(e).forEach(function(t){u[t]=n(e[t],c)}),s(r).forEach(function(t){(!o(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(o(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class i{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!i.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===i.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s=t.replace(/^data(|-)/,""),o=n.toLowerCamelCase(s,"-");if(!i.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[o];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!i.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!i.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class s{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,i=e.split("."),s=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=s;s=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(i[0],s),this.listeners.push({splitEventName:i,opts:r,cb:s}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class o{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),s=i.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),o=i.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];s&&a.push(window.PluginConfigManager.get(this._pluginName,s));try{o&&a.push(JSON.parse(o))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!i.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new s(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends o{init(){console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t { + console.log('subscribed onClickOffCanvasTab callback function start...'); + this.addEffectsAndSwitchDetailsHandler(); + console.log('... subscribed onClickOffCanvasTab callback function end.'); + }) + console.log('Added subscriber to onClickOffCanvasTab.'); + } } } else { console.log('no tabElement'); } - - /* - if (tabElement && tabElement.$emitter && tabElement.$emitter.subscribe && typeof tabElement.$emitter.subscribe === 'function') { - tabElement.$emitter.subscribe('onClickOffCanvasTab', () => { - this.addEffectsAndSwitchDetailsHandler(); - }) - } - */ } addEffectsAndSwitchDetailsHandler() { console.log('addEffectsAndSwitchDetailsHandler'); @@ -37,13 +37,7 @@ export default class IngoSCostTransparency extends Plugin { console.log('animatableElements', animatableElements); for (let i=0; i < animatableElements.length; i++) { console.log(`animatableElements[${i}]`, animatableElements[i]); - if (!animatableElements[i].dataset.hasEventListener) { - console.log('Element had no event listener yet. Add event listener...') - animatableElements[i].addEventListener('click', this.addEffectsAndSwitchDetails); - animatableElements[i].dataset.hasEventListener='true'; - } else { - console.log('element already has an event listener'); - } + animatableElements[i].addEventListener('click', this.addEffectsAndSwitchDetails); } console.log('after iterating animatableElements'); } @@ -62,23 +56,34 @@ export default class IngoSCostTransparency extends Plugin { } addEffectsAndSwitchDetails(event) { if (!event) { return; } + console.log('addEffectsAndSwitchDetails(event), event:', event); const activeGroupElement = event.currentTarget; + console.log(' activeGroupElement = event.currentTarget:', activeGroupElement); + if (!activeGroupElement) { console.log('no activeGroupElement'); return; } activeGroupElement.classList.add('ingos-active'); const activeId = activeGroupElement.id; const costGroupContentWrapper = document.getElementById('ingos-cost-group-contents'); + console.log('costGroupContentWrapper:', costGroupContentWrapper); if (!costGroupContentWrapper) { return; } const activeContent = costGroupContentWrapper.querySelector('*[data-for="' + activeId + '"]'); if (!activeContent) { return; } activeContent.classList.add('ingos-active'); + console.log('added className ingos-active to activeContent', activeContent); const inactiveGroups = document.getElementsByClassName('ingos-cost-group'); for (let i = 0; i < inactiveGroups.length; i++) { + console.log(`try to compare if inactiveGroups.item(${i}) !== activeGroupElement`); if (inactiveGroups.item(i) !== activeGroupElement) { inactiveGroups.item(i).classList.remove('ingos-active'); } } let activeGroup = document.getElementsByClassName('ingos-cost-group-content'); + console.log('activeGroup = .ingos-cost-group-content : ', activeGroup); for (let i = 0; i < activeGroup.length; i++) { + console.log(`try to compare if activeGroup.item(${i}) !== activeContent`); + console.log('activeContent:', activeContent); + console.log(`activeGroup.item(${i})`, activeGroup.item(i)); + // could there be a safer, more generic approach, comparing data or tokens instead of elements? if (activeGroup.item(i) !== activeContent) { activeGroup.item(i).classList.remove('ingos-active'); } From 2f0a1245e37a0441a43e8ef46e1ab291c93e66c2 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 18:08:59 +0200 Subject: [PATCH 21/25] fixup id assumption --- .../ingo-s-cost-transparency.js | 2 +- .../ingo-s-cost-transparency.js | 66 ++++++++++++------- .../ingos-cost-transparency-tab.html.twig | 1 + 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js index 64487b1..4ec2f42 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js @@ -1 +1 @@ -(()=>{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function i(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function s(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||i,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&s(e).forEach(function(t){u[t]=n(e[t],c)}),s(r).forEach(function(t){(!o(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(o(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class i{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!i.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===i.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s=t.replace(/^data(|-)/,""),o=n.toLowerCamelCase(s,"-");if(!i.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[o];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!i.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!i.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class s{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,i=e.split("."),s=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=s;s=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(i[0],s),this.listeners.push({splitEventName:i,opts:r,cb:s}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class o{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),s=i.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),o=i.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];s&&a.push(window.PluginConfigManager.get(this._pluginName,s));try{o&&a.push(JSON.parse(o))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!i.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new s(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends o{init(){console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function o(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function i(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||o,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&i(e).forEach(function(t){u[t]=n(e[t],c)}),i(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class o{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!o.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===o.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),s=n.toLowerCamelCase(i,"-");if(!o.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[s];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class i{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=e.split("."),i=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=i;i=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(o[0],i),this.listeners.push({splitEventName:o,opts:r,cb:i}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class s{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),i=o.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),s=o.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!o.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new i(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends s{init(){console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t From a91b1c403654ed225009e8869e569e5e80d82a73 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Tue, 2 Apr 2024 19:39:43 +0200 Subject: [PATCH 22/25] more robust styles --- .../ingo-s-cost-transparency.js | 2 +- .../ingo-s-cost-transparency.js | 12 +++- .../page/product-detail/product-detail.scss | 60 +++++++++---------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js index 4ec2f42..b0f51b3 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js @@ -1 +1 @@ -(()=>{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function o(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function i(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||o,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&i(e).forEach(function(t){u[t]=n(e[t],c)}),i(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class o{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!o.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===o.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),s=n.toLowerCamelCase(i,"-");if(!o.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[s];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class i{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=e.split("."),i=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=i;i=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(o[0],i),this.listeners.push({splitEventName:o,opts:r,cb:i}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class s{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),i=o.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),s=o.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!o.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new i(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends s{init(){console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function o(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function i(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||o,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&i(e).forEach(function(t){u[t]=n(e[t],c)}),i(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class o{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!o.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===o.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),s=n.toLowerCamelCase(i,"-");if(!o.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[s];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class i{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=e.split("."),i=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=i;i=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(o[0],i),this.listeners.push({splitEventName:o,opts:r,cb:i}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class s{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),i=o.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),s=o.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!o.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new i(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends s{init(){console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t Date: Tue, 2 Apr 2024 20:27:41 +0200 Subject: [PATCH 23/25] fixup fixup fixup --- .../ingo-s-cost-transparency.js | 2 +- .../ingo-s-cost-transparency.js | 14 +++++++------- .../scss/page/product-detail/product-detail.scss | 4 ++-- .../ingos-cost-transparency-tab.html.twig | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js index b0f51b3..7ddc341 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/dist/storefront/js/ingo-s-cost-transparency/ingo-s-cost-transparency.js @@ -1 +1 @@ -(()=>{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function o(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function i(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||o,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&i(e).forEach(function(t){u[t]=n(e[t],c)}),i(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class o{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!o.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===o.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),s=n.toLowerCamelCase(i,"-");if(!o.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[s];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class i{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=e.split("."),i=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=i;i=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(o[0],i),this.listeners.push({splitEventName:o,opts:r,cb:i}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class s{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),i=o.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),s=o.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!o.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new i(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends s{init(){console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t{"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function o(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function i(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||o,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&i(e).forEach(function(t){u[t]=n(e[t],c)}),i(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class o{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!o.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===o.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),s=n.toLowerCamelCase(i,"-");if(!o.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[s];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class i{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=e.split("."),i=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=i;i=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(o[0],i),this.listeners.push({splitEventName:o,opts:r,cb:i}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class s{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),i=o.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),s=o.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!o.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new i(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends s{init(){console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t
-
+
{% for i in 1..5 %} {% set descriptionSnippetSlug = 'ingos.costTransparency.costFactorDescription0' ~ i %}
{{ descriptionSnippetSlug | trans | sw_sanitize }}
From 0f261742c44624ee1ba7696c6c30df3e1b799ad5 Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 3 Apr 2024 11:24:52 +0200 Subject: [PATCH 24/25] refactor names, remove console log --- .../ingo-s-cost-transparency.js | 89 ++++--------------- 1 file changed, 19 insertions(+), 70 deletions(-) diff --git a/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js b/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js index d736abc..3c5a579 100644 --- a/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js +++ b/src/IngoSCostTransparency/src/Resources/app/storefront/src/ingo-s-cost-transparency/ingo-s-cost-transparency.js @@ -2,49 +2,29 @@ import Plugin from 'src/plugin-system/plugin.class'; export default class IngoSCostTransparency extends Plugin { init() { - console.log('ready to set percentage styles'); this.applyPercentageStyles(); - - console.log('ready to set regular event handler'); this.addEffectsAndSwitchDetailsHandler(); - - // this.$emitter.publish('onClickOffCanvasTab'); - - console.log('done setting regular event handler, now add plugin emitter listener'); + // same for mobile off-canvas version: const tabElement = document.querySelector('#ingos-cost-transparency-tab'); - if (tabElement) { - const offCanvasTabPlugin = window.PluginManager.getPluginInstanceFromElement(tabElement); - if (offCanvasTabPlugin) { - offCanvasTabPlugin.$emitter.subscribe('hideCookieBar', this.onHideCookieBar); - } else { - console.log('no offCanvasTabPlugin, try alternative approach ...'); - if (tabElement && tabElement.$emitter && tabElement.$emitter.subscribe && typeof tabElement.$emitter.subscribe === 'function') { - tabElement.$emitter.subscribe('onClickOffCanvasTab', () => { - console.log('subscribed onClickOffCanvasTab callback function start...'); - this.addEffectsAndSwitchDetailsHandler(); - console.log('... subscribed onClickOffCanvasTab callback function end.'); - }) - console.log('Added subscriber to onClickOffCanvasTab.'); - } - } - } else { - console.log('no tabElement'); + if (tabElement && + tabElement.$emitter && + tabElement.$emitter.subscribe && + typeof tabElement.$emitter.subscribe === 'function' + ) { + tabElement.$emitter.subscribe('onClickOffCanvasTab', () => { + this.addEffectsAndSwitchDetailsHandler(); + }) } } addEffectsAndSwitchDetailsHandler() { - console.log('addEffectsAndSwitchDetailsHandler'); const animatableElements = document.querySelectorAll('.ingos-cost-group'); - console.log('animatableElements', animatableElements); for (let i=0; i < animatableElements.length; i++) { - console.log(`animatableElements[${i}]`, animatableElements[i]); animatableElements[i].addEventListener('click', this.addEffectsAndSwitchDetails); } - console.log('after iterating animatableElements'); } applyPercentageStyles() { const rootStyle = document.documentElement.style; - console.log('applyPercentageStyles, rootStyle:', rootStyle); const percentageBars = document.getElementsByClassName('ingos-cost-group'); for (let i=0; i < percentageBars.length; i++) { if (percentageBars[i].dataset && percentageBars[i].dataset.percentage && percentageBars[i].dataset.index) { @@ -52,65 +32,34 @@ export default class IngoSCostTransparency extends Plugin { '--ingos-cost-transparency-percentage-' + percentageBars[i].dataset.index, '' + percentageBars[i].dataset.percentage + '%' ); - console.log('set rootStyle propery ' + '--ingos-cost-transparency-percentage-' + percentageBars[i].dataset.index - + ' to value ' + percentageBars[i].dataset.percentage + '%'); - } else { - console.log('cant set percentage style'); } } - console.log('done iterating percentageBars'); } addEffectsAndSwitchDetails(event) { - /* - Nach Off-Canvas-Rendering können wir nicht mehr davon ausgehen, dass es unsere Elemente jeweils nur einmal git. - Somit verbietet es sich, mit document.getElementById oder analogen Selektoren zu arbeiten. - Also arbeiten wir entweder über die Plugin-Instanz (als Frontend-Entwickler bestimmt nicht!) - oder iterieren über alles passende, was wir mit getElementsByClassName finden? - */ - if (!event) { return; } - console.log('addEffectsAndSwitchDetails(event), event:', event); const activeGroupElement = event.currentTarget; - console.log(' activeGroupElement = event.currentTarget:', activeGroupElement); - if (!activeGroupElement) { console.log('no activeGroupElement'); return; } + if (!activeGroupElement) { return; } activeGroupElement.classList.add('ingos-active'); const activeId = activeGroupElement.dataset.id; const costDetailsWrappers = document.getElementsByClassName('ingos-cost-details'); - console.log('costDetailsWrappers:', costDetailsWrappers); + for (let cgIndex = 0; cgIndex < costDetailsWrappers.length; cgIndex++) { let costDetailsWrapper = costDetailsWrappers.item(cgIndex); const activeContent = costDetailsWrapper.querySelector('*[data-for="' + activeId + '"]'); if (!activeContent) { continue; } activeContent.classList.add('ingos-active'); - console.log('added className ingos-active to activeContent', activeContent); - - // völlig unlesbare Benamung, die noch auf Code von Chris basiert :((((( - - // wie hätte ich den den sinnvollerweise semantisch und selbsterklärend selbst benannt? - // was aber auch noch lange nicht erklärt, warum der bloß im offcanvas nicht funktioniert - // .ingos-cost .ingos-cost-group.ingos-cost-group-0x - // cost-group are the containers around the bar chart bars and their captions - const inactiveGroups = document.getElementsByClassName('ingos-cost-group'); - for (let i = 0; i < inactiveGroups.length; i++) { - console.log(`try to compare if inactiveGroups.item(${i}) !== activeGroupElement`); - if (inactiveGroups.item(i) !== activeGroupElement) { - inactiveGroups.item(i).classList.remove('ingos-active'); + const costGroups = document.getElementsByClassName('ingos-cost-group'); + for (let i = 0; i < costGroups.length; i++) { + if (costGroups.item(i) !== activeGroupElement) { + costGroups.item(i).classList.remove('ingos-active'); } } - // .ingos-cost-group-contents .ingos-cost-group-content (ohne Eigenklasse, aber mit data-for=...) - // cost-group-content are the details description elements below the bar charts - let activeGroup = document.getElementsByClassName('ingos-cost-detail'); - console.log('activeGroup = .ingos-cost-detail : ', activeGroup); - for (let i = 0; i < activeGroup.length; i++) { - console.log(`try to compare if activeGroup.item(${i}) !== activeContent`); - console.log('activeContent:', activeContent); - console.log(`activeGroup.item(${i})`, activeGroup.item(i)); - // could there be a safer, more generic approach, comparing data or tokens instead of elements? - if (activeGroup.item(i) !== activeContent) { - console.log('remove active class from this element',activeGroup.item(i) ); - activeGroup.item(i).classList.remove('ingos-active'); + let costDetails = document.getElementsByClassName('ingos-cost-detail'); + for (let i = 0; i < costDetails.length; i++) { + if (costDetails.item(i) !== activeContent) { + costDetails.item(i).classList.remove('ingos-active'); } } } From 6d8115d16e06602a496e6d1071922a030c4e5eaa Mon Sep 17 00:00:00 2001 From: Ingo Steinke Date: Wed, 3 Apr 2024 11:50:19 +0200 Subject: [PATCH 25/25] rebuild extension package --- dist/IngoSCostTransparency.zip | Bin 15709 -> 16061 bytes .../ingo-s-cost-transparency.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/IngoSCostTransparency.zip b/dist/IngoSCostTransparency.zip index 3d356372ff45cf13e96f42c3399a123edf31bf6a..8a6a0efd7582d74dbbc2d4450a336a770dfda903 100644 GIT binary patch delta 5566 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 delta 5242 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"use strict";var e={857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function o(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function i(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||o,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c,u,d=Array.isArray(r);return d!==Array.isArray(e)?n(r,l):d?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&i(e).forEach(function(t){u[t]=n(e[t],c)}),i(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return a(e,r,t)},{})},e.exports=a}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}(()=>{r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t}})(),(()=>{r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}})(),(()=>{r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e=r(857),t=r.n(e);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class o{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!o.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===o.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),s=n.toLowerCamelCase(i,"-");if(!o.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[s];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return n.parsePrimitive(a)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelector(t)||!1;if(r&&!1===n)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return n}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!o.isNode(e))throw Error("The parent node is not a valid HTML Node!");let n=e.querySelectorAll(t);if(0===n.length&&(n=!1),r&&!1===n)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return n}}class i{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(n),n}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=e.split("."),i=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=i;i=function(r){n.unsubscribe(e),t(r)}}return this.el.addEventListener(o[0],i),this.listeners.push({splitEventName:o,opts:r,cb:i}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class s{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let r=n.toDashCase(this._pluginName),i=o.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),s=o.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(e.message))}return t().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},r=!1){if(!o.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new i(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends s{init(){console.log("ready to set percentage styles"),this.applyPercentageStyles(),console.log("ready to set regular event handler"),this.addEffectsAndSwitchDetailsHandler(),console.log("done setting regular event handler, now add plugin emitter listener");let e=document.querySelector("#ingos-cost-transparency-tab");if(e){let t=window.PluginManager.getPluginInstanceFromElement(e);t?t.$emitter.subscribe("hideCookieBar",this.onHideCookieBar):(console.log("no offCanvasTabPlugin, try alternative approach ..."),e&&e.$emitter&&e.$emitter.subscribe&&"function"==typeof e.$emitter.subscribe&&(e.$emitter.subscribe("onClickOffCanvasTab",()=>{console.log("subscribed onClickOffCanvasTab callback function start..."),this.addEffectsAndSwitchDetailsHandler(),console.log("... subscribed onClickOffCanvasTab callback function end.")}),console.log("Added subscriber to onClickOffCanvasTab.")))}else console.log("no tabElement")}addEffectsAndSwitchDetailsHandler(){console.log("addEffectsAndSwitchDetailsHandler");let e=document.querySelectorAll(".ingos-cost-group");console.log("animatableElements",e);for(let t=0;t{"use strict";var t={857:t=>{var e=function(t){var e;return!!t&&"object"==typeof t&&"[object RegExp]"!==(e=Object.prototype.toString.call(t))&&"[object Date]"!==e&&t.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function i(t,e){return!1!==e.clone&&e.isMergeableObject(t)?a(Array.isArray(t)?[]:{},t,e):t}function s(t,e,r){return t.concat(e).map(function(t){return i(t,r)})}function n(t){return Object.keys(t).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter(function(e){return Object.propertyIsEnumerable.call(t,e)}):[])}function o(t,e){try{return e in t}catch(t){return!1}}function a(t,r,c){(c=c||{}).arrayMerge=c.arrayMerge||s,c.isMergeableObject=c.isMergeableObject||e,c.cloneUnlessOtherwiseSpecified=i;var l,u,d=Array.isArray(r);return d!==Array.isArray(t)?i(r,c):d?c.arrayMerge(t,r,c):(u={},(l=c).isMergeableObject(t)&&n(t).forEach(function(e){u[e]=i(t[e],l)}),n(r).forEach(function(e){(!o(t,e)||Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))&&(o(t,e)&&l.isMergeableObject(r[e])?u[e]=(function(t,e){if(!e.customMerge)return a;var r=e.customMerge(t);return"function"==typeof r?r:a})(e,l)(t[e],r[e],l):u[e]=i(r[e],l))}),u)}a.all=function(t,e){if(!Array.isArray(t))throw Error("first argument should be an array");return t.reduce(function(t,r){return a(t,r,e)},{})},t.exports=a}},e={};function r(i){var s=e[i];if(void 0!==s)return s.exports;var n=e[i]={exports:{}};return t[i](n,n.exports,r),n.exports}(()=>{r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e}})(),(()=>{r.d=(t,e)=>{for(var i in e)r.o(e,i)&&!r.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}})(),(()=>{r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e)})(),(()=>{var t=r(857),e=r.n(t);class i{static ucFirst(t){return t.charAt(0).toUpperCase()+t.slice(1)}static lcFirst(t){return t.charAt(0).toLowerCase()+t.slice(1)}static toDashCase(t){return t.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(t,e){let r=i.toUpperCamelCase(t,e);return i.lcFirst(r)}static toUpperCamelCase(t,e){return e?t.split(e).map(t=>i.ucFirst(t.toLowerCase())).join(""):i.ucFirst(t.toLowerCase())}static parsePrimitive(t){try{return/^\d+(.|,)\d+$/.test(t)&&(t=t.replace(",",".")),JSON.parse(t)}catch(e){return t.toString()}}}class s{static isNode(t){return"object"==typeof t&&null!==t&&(t===document||t===window||t instanceof Node)}static hasAttribute(t,e){if(!s.isNode(t))throw Error("The element must be a valid HTML Node!");return"function"==typeof t.hasAttribute&&t.hasAttribute(e)}static getAttribute(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===s.hasAttribute(t,e))throw Error('The required property "'.concat(e,'" does not exist!'));if("function"!=typeof t.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return t.getAttribute(e)}static getDataAttribute(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],n=e.replace(/^data(|-)/,""),o=i.toLowerCamelCase(n,"-");if(!s.isNode(t)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===t.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let a=t.dataset[o];if(void 0===a){if(r)throw Error('The required data attribute "'.concat(e,'" does not exist on ').concat(t,"!"));return a}return i.parsePrimitive(a)}static querySelector(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!s.isNode(t))throw Error("The parent node is not a valid HTML Node!");let i=t.querySelector(e)||!1;if(r&&!1===i)throw Error('The required element "'.concat(e,'" does not exist in parent node!'));return i}static querySelectorAll(t,e){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!s.isNode(t))throw Error("The parent node is not a valid HTML Node!");let i=t.querySelectorAll(e);if(0===i.length&&(i=!1),r&&!1===i)throw Error('At least one item of "'.concat(e,'" must exist in parent node!'));return i}}class n{publish(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new CustomEvent(t,{detail:e,cancelable:r});return this.el.dispatchEvent(i),i}subscribe(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=this,s=t.split("."),n=r.scope?e.bind(r.scope):e;if(r.once&&!0===r.once){let e=n;n=function(r){i.unsubscribe(t),e(r)}}return this.el.addEventListener(s[0],n),this.listeners.push({splitEventName:s,opts:r,cb:n}),!0}unsubscribe(t){let e=t.split(".");return this.listeners=this.listeners.reduce((t,r)=>([...r.splitEventName].sort().toString()===e.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):t.push(r),t),[]),!0}reset(){return this.listeners.forEach(t=>{this.el.removeEventListener(t.splitEventName[0],t.cb)}),this.listeners=[],!0}get el(){return this._el}set el(t){this._el=t}get listeners(){return this._listeners}set listeners(t){this._listeners=t}constructor(t=document){this._el=t,t.$emitter=this,this._listeners=[]}}class o{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(t){let r=i.toDashCase(this._pluginName),n=s.getDataAttribute(this.el,"data-".concat(r,"-config"),!1),o=s.getAttribute(this.el,"data-".concat(r,"-options"),!1),a=[this.constructor.options,this.options,t];n&&a.push(window.PluginConfigManager.get(this._pluginName,n));try{o&&a.push(JSON.parse(o))}catch(t){throw console.error(this.el),Error('The data attribute "data-'.concat(r,'-options" could not be parsed to json: ').concat(t.message))}return e().all(a.filter(t=>t instanceof Object&&!(t instanceof Array)).map(t=>t||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(t){return t||(t=this.constructor.name),t}constructor(t,e={},r=!1){if(!s.isNode(t))throw Error("There is no valid element given.");this.el=t,this.$emitter=new n(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(e),this._initialized=!1,this._registerInstance(),this._init()}}window.PluginManager.register("IngoSCostTransparency",class extends o{init(){this.applyPercentageStyles(),this.addEffectsAndSwitchDetailsHandler();let t=document.querySelector("#ingos-cost-transparency-tab");t&&t.$emitter&&t.$emitter.subscribe&&"function"==typeof t.$emitter.subscribe&&t.$emitter.subscribe("onClickOffCanvasTab",()=>{this.addEffectsAndSwitchDetailsHandler()})}addEffectsAndSwitchDetailsHandler(){let t=document.querySelectorAll(".ingos-cost-group");for(let e=0;e