inital commit

This commit is contained in:
Raphael Martin
2023-12-05 10:40:47 +01:00
commit d950880d65
150 changed files with 10942 additions and 0 deletions

11
Resources/Private/.htaccess Executable file
View File

@@ -0,0 +1,11 @@
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache >= 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang.xlf" date="2021-11-18T10:42:07Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="product_list.product_detail_link" resname="product_list.product_detail_link">
<source>detail</source>
<target>mehr erfahren</target>
</trans-unit>
<trans-unit id="product.product_nr" resname="product.product_nr">
<source>article nr</source>
<target>Artikel Nr</target>
</trans-unit>
<trans-unit id="product_list.search" resname="product_list.search">
<source>search</source>
<target>suchen</target>
</trans-unit>
<trans-unit id="product_list.advanced_search" resname="product_list.advanced_search">
<source>advanced search</source>
<target>erweiterte Suche</target>
</trans-unit>
<trans-unit id="product_list.search_input_placeholder" resname="product_list.search_input_placeholder">
<source>search</source>
<target>suche</target>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>related products</source>
<target>Produkte mit dieser Zutat</target>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
<target>Verwendete Zutaten</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh_tx_a2gproducts_domain_model_products.xlf" date="2021-11-18T11:17:01Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="nr.description" resname="nr.description">
<source>product nr</source>
<target>Produkt Nr</target>
</trans-unit>
<trans-unit id="title.description" resname="title.description">
<source>product title &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
<target>Produkt Titel / Name &lt;br/&gt;
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</target>
</trans-unit>
<trans-unit id="description.description" resname="description.description">
<source>description &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
<target>Produkt Beschreibung &lt;br/&gt;
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</target>
</trans-unit>
<trans-unit id="image.description" resname="image.description">
<source>product list image &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
<target>Produkt Listen Bild &lt;br/&gt;
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</target>
</trans-unit>
<trans-unit id="images.description" resname="images.description">
<source>images</source>
<target>Produkt Detail Seiten Bild Slider</target>
</trans-unit>
<trans-unit id="rel_category.description" resname="rel_category.description">
<source>relCategory</source>
<target>Produkt Kategorie ( Verwendet für Filter )</target>
</trans-unit>
<trans-unit id="rel_filter_values.description" resname="rel_filter_values.description">
<source>relFilterValues</source>
<target>Filterbare Optionen
von dem FIlter aus der Kategorie</target>
</trans-unit>
<trans-unit id="path_segment.description" resname="path_segment.description">
<source>url segment generated from the product title</source>
<target>URL Segment generiert aus dem Produk-Titel</target>
</trans-unit>
<trans-unit id="description_html.description" resname="description_html.description">
<source>farmateable description </source>
<target>Formatierbare Beschreibung unter der Beschreibung</target>
</trans-unit>
<trans-unit id="rel_ingedients.description" resname="rel_ingedients.description">
<source>ingredients</source>
<target>Verwendete Inhaltsstoffe, Bauteile oder Zutaten</target>
</trans-unit>
<trans-unit id="rel_productvariants.description" resname="rel_productvariants.description">
<source></source>
<target></target>
</trans-unit>
<trans-unit id="rel_delivery_costs.description" resname="rel_delivery_costs.description">
<source>deliverycosts conditions per each product</source>
<target>Liefergebühren abzüge zuschläge pro Produkt</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,308 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_db.xlf" date="2022-01-25T14:39:22Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="tx_a2gproducts_domain_model_brands" resname="tx_a2gproducts_domain_model_brands">
<source>Brands</source>
<target>Marken / Kollektionen</target>
</trans-unit>
<trans-unit id="wizard.group.products" resname="wizard.group.products">
<source>Products</source>
<target>Produkte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products" resname="tx_a2gproducts_domain_model_products">
<source>Products</source>
<target>Produkte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.nr" resname="tx_a2gproducts_domain_model_products.nr">
<source>Nr</source>
<target></target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.title" resname="tx_a2gproducts_domain_model_products.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.description" resname="tx_a2gproducts_domain_model_products.description">
<source>Description</source>
<target>Beschreibung</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.image" resname="tx_a2gproducts_domain_model_products.image">
<source>Image</source>
<target>Bild</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.images" resname="tx_a2gproducts_domain_model_products.images">
<source>Images</source>
<target>Bilder</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.net_price" resname="tx_a2gproducts_domain_model_products.net_price">
<source>Net Price</source>
<target>Netto Preis</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.gross_price" resname="tx_a2gproducts_domain_model_products.gross_price">
<source>Gross Price</source>
<target>Brutto Preis</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.rel_category" resname="tx_a2gproducts_domain_model_products.rel_category">
<source>Category</source>
<target>Kategorie</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.rel_filter_values" resname="tx_a2gproducts_domain_model_products.rel_filter_values">
<source>Filter Values</source>
<target>Filter Werte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories" resname="tx_a2gproducts_domain_model_categories">
<source>Categories</source>
<target>Kategorien</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.title" resname="tx_a2gproducts_domain_model_categories.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.description" resname="tx_a2gproducts_domain_model_categories.description">
<source>Description</source>
<target>Beschreibung</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.image" resname="tx_a2gproducts_domain_model_categories.image">
<source>Image</source>
<target>Bild</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.rel_filters" resname="tx_a2gproducts_domain_model_categories.rel_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters" resname="tx_a2gproducts_domain_model_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.title" resname="tx_a2gproducts_domain_model_filters.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.filter_type" resname="tx_a2gproducts_domain_model_filters.filter_type">
<source>Filter Type</source>
<target>Filter Typ</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.db_operation_max" resname="tx_a2gproducts_domain_model_filters.db_operation_max">
<source>Db Operation Max</source>
<target>Db Operation Max</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.db_operation_min" resname="tx_a2gproducts_domain_model_filters.db_operation_min">
<source>Db Operation Min</source>
<target>Db Operation Min</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.rel_filter_option" resname="tx_a2gproducts_domain_model_filters.rel_filter_option">
<source>Filter Option</source>
<target>Filter Option</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions" resname="tx_a2gproducts_domain_model_filteroptions">
<source>Filter Options</source>
<target>Filter Optionen</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.title" resname="tx_a2gproducts_domain_model_filteroptions.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.value_min" resname="tx_a2gproducts_domain_model_filteroptions.value_min">
<source>Value Min</source>
<target>min. Wert</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.value_max" resname="tx_a2gproducts_domain_model_filteroptions.value_max">
<source>Value Max</source>
<target>max. Wert</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues" resname="tx_a2gproducts_domain_model_filtervalues">
<source>Filter Values</source>
<target>Filter Werte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues.value" resname="tx_a2gproducts_domain_model_filtervalues.value">
<source>Value</source>
<target>Wert</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues.rel_filters" resname="tx_a2gproducts_domain_model_filtervalues.rel_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductslist.name" resname="tx_a2g_products_a2gproductslist.name">
<source>Altogether Products - Product List</source>
<target>Altogether Produkte - Produktliste</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductslist.description" resname="tx_a2g_products_a2gproductslist.description">
<source></source>
<target>Liste der Produkte mit filter und such Möglichkeit.</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductsdetail.name" resname="tx_a2g_products_a2gproductsdetail.name">
<source>Altogether Products - Product Detail</source>
<target>Altogether Produkte - Produkt Detail Seite</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductsdetail.description" resname="tx_a2g_products_a2gproductsdetail.description">
<source></source>
<target>Detailseite eines Produktes</target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientslist.name" resname="tx_a2g_products_ingredientslist.name">
<source>Altogether Products - Ingredients List</source>
<target>Altogether Produkte - Liste der Inhaltsstoffe</target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientslist.description" resname="tx_a2g_products_ingredientslist.description">
<source></source>
<target></target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientsdetail.name" resname="tx_a2g_products_ingredientsdetail.name">
<source>Altogether Products - Ingredients Detail</source>
<target>Altogether Produkte - Inhaltsstoffe Detail Seite</target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientsdetail.description" resname="tx_a2g_products_ingredientsdetail.description">
<source></source>
<target></target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_ingredients" resname="tx_a2gproducts_domain_model_ingredients">
<source>Ingredients</source>
<target>Inhaltstoffe</target>
</trans-unit>
<trans-unit id="title" resname="title">
<source>title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="description" resname="description">
<source>description</source>
<target>Beschreibung</target>
</trans-unit>
<trans-unit id="image" resname="image">
<source>image</source>
<target>Bild</target>
</trans-unit>
<trans-unit id="rel_filters" resname="rel_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="value_min" resname="value_min">
<source>min value</source>
<target>min. Wert</target>
</trans-unit>
<trans-unit id="value_max" resname="value_max">
<source>max value</source>
<target>max. Wert</target>
</trans-unit>
<trans-unit id="filter_type" resname="filter_type">
<source>filter type</source>
<target>Filter Typ</target>
</trans-unit>
<trans-unit id="db_operation_min" resname="db_operation_min">
<source>operation min</source>
<target>min. Operant</target>
</trans-unit>
<trans-unit id="db_operation_max" resname="db_operation_max">
<source>operation max</source>
<target>max. Operant</target>
</trans-unit>
<trans-unit id="rel_filter_option" resname="rel_filter_option">
<source>filter option</source>
<target>Filter Optionen</target>
</trans-unit>
<trans-unit id="value" resname="value">
<source>value</source>
<target>Wert</target>
</trans-unit>
<trans-unit id="images" resname="images">
<source>images</source>
<target>Bilder</target>
</trans-unit>
<trans-unit id="rel_products" resname="rel_products">
<source>products</source>
<target>Produkte</target>
</trans-unit>
<trans-unit id="product_nr" resname="product_nr">
<source>product nr</source>
<target>Produkt Nr.</target>
</trans-unit>
<trans-unit id="rel_category" resname="rel_category">
<source>category</source>
<target>Kateogie</target>
</trans-unit>
<trans-unit id="rel_filter_values" resname="rel_filter_values">
<source>filter values</source>
<target>Filter Werte</target>
</trans-unit>
<trans-unit id="rel_ingredients" resname="rel_ingredients">
<source>ingredients</source>
<target>Inhaltsstoffe</target>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
<target>verwendete Zutaten</target>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>products with this ingredient</source>
<target>Produkte mit dieser Zutat</target>
</trans-unit>
<trans-unit id="filter_type.useFilterOptions" resname="filter_type.useFilterOptions">
<source>just use Filter Options</source>
<target>Filteroptionen verwenden</target>
</trans-unit>
<trans-unit id="slug" resname="slug">
<source>slug</source>
<target>Url Segment</target>
</trans-unit>
<trans-unit id="images_tab" resname="images_tab">
<source>Images</source>
<target>Bilder</target>
</trans-unit>
<trans-unit id="product_variants_tab" resname="product_variants_tab">
<source>Varainats</source>
<target>Varianten</target>
</trans-unit>
<trans-unit id="filters_tab" resname="filters_tab">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="ingredients_tab" resname="ingredients_tab">
<source>Ingredients</source>
<target>Inhaltsstoffe</target>
</trans-unit>
<trans-unit id="sizes_tab" resname="images_tab">
<source>Sizes</source>
<target>Größen</target>
</trans-unit>
<trans-unit id="rel_productvariants" resname="rel_productvariants">
<source>Product-Variants</source>
<target>Produkt Varianten</target>
</trans-unit>
<trans-unit id="description_html" resname="description_html">
<source>Description ( RTE )</source>
<target>Beschreibung ( RTE )</target>
</trans-unit>
<trans-unit id="selectabel_product_attribute_tab" resname="selectabel_product_attribute_tab">
<source>Product Options</source>
<target>Produkt Optionen</target>
</trans-unit>
<trans-unit id="rel_selectableattribute" resname="rel_selectableattribute">
<source>Selectable Produkt Options</source>
<target>Wählbare Produkt Optionen</target>
</trans-unit>
<trans-unit id="rel_brand" resname="rel_brand">
<source>Brand</source>
<target>Marke</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_brands" resname="tx_a2gproducts_domain_model_brands">
<source>Brands</source>
<target>Marken</target>
</trans-unit>
<trans-unit id="seo_image1x1" resname="seo_image1x1">
<source>SEO Image 1x1</source>
<target></target>
</trans-unit>
<trans-unit id="seo_image4x3" resname="seo_image4x3">
<source>SEO Image 4x3</source>
<target></target>
</trans-unit>
<trans-unit id="seo_image16x9" resname="seo_image16x9">
<source>SEO Image 16x9</source>
<target></target>
</trans-unit>
<trans-unit id="seo_tab" resname="seo_tab">
<source>SEO</source>
<target></target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang.xlf" date="2021-11-18T10:42:07Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="product_list.product_detail_link" resname="product_list.product_detail_link">
<source>detail</source>
</trans-unit>
<trans-unit id="product.product_nr" resname="product.product_nr">
<source>article nr</source>
</trans-unit>
<trans-unit id="product_list.search" resname="product_list.search">
<source>search</source>
</trans-unit>
<trans-unit id="product_list.advanced_search" resname="product_list.advanced_search">
<source>advanced search</source>
</trans-unit>
<trans-unit id="product_list.search_input_placeholder" resname="product_list.search_input_placeholder">
<source>search</source>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>related products</source>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="title.description" resname="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="description.description" resname="description.description">
<source>description</source>
</trans-unit>
<trans-unit id="image.description" resname="image.description">
<source>image</source>
</trans-unit>
<trans-unit id="rel_filters.description" resname="rel_filters.description">
<source>relFilters</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="title.description" resname="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="value_min.description" resname="value_min.description">
<source>valueMin</source>
</trans-unit>
<trans-unit id="value_max.description" resname="value_max.description">
<source>valueMax</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="title.description" resname="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="filter_type.description" resname="filter_type.description">
<source>filterType</source>
</trans-unit>
<trans-unit id="db_operation_max.description" resname="db_operation_max.description">
<source>dbOperationMax</source>
</trans-unit>
<trans-unit id="db_operation_min.description" resname="db_operation_min.description">
<source>dbOperationMin</source>
</trans-unit>
<trans-unit id="rel_filter_option.description" resname="rel_filter_option.description">
<source>relFilterOption</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="value.description" resname="value.description">
<source>value</source>
</trans-unit>
<trans-unit id="rel_filters.description" resname="rel_filters.description">
<source>relFilters</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh_tx_a2gproducts_domain_model_products.xlf" date="2021-11-18T11:17:01Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="nr.description" resname="nr.description">
<source>product nr</source>
</trans-unit>
<trans-unit id="title.description" resname="title.description">
<source>product title &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
</trans-unit>
<trans-unit id="description.description" resname="description.description">
<source>description &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
</trans-unit>
<trans-unit id="image.description" resname="image.description">
<source>product list image &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
</trans-unit>
<trans-unit id="images.description" resname="images.description">
<source>images</source>
</trans-unit>
<trans-unit id="rel_category.description" resname="rel_category.description">
<source>relCategory</source>
</trans-unit>
<trans-unit id="rel_filter_values.description" resname="rel_filter_values.description">
<source>relFilterValues</source>
</trans-unit>
<trans-unit id="path_segment.description" resname="path_segment.description">
<source>url segment generated from the product title</source>
</trans-unit>
<trans-unit id="description_html.description" resname="description_html.description">
<source>farmateable description </source>
</trans-unit>
<trans-unit id="rel_ingedients.description" resname="rel_ingedients.description">
<source>ingredients</source>
</trans-unit>
<trans-unit id="rel_productvariants.description" resname="rel_productvariants.description">
<source></source>
</trans-unit>
<trans-unit id="rel_delivery_costs.description" resname="rel_delivery_costs.description">
<source>deliverycosts conditions per each product</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_db.xlf" date="2021-11-14T20:20:24Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="tx_a2gproducts_domain_model_brands" resname="tx_a2gproducts_domain_model_brands">
<source>Brands</source>
</trans-unit>
<trans-unit id="wizard.group.products" resname="wizard.group.products">
<source>Products</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products" resname="tx_a2gproducts_domain_model_products">
<source>Products</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.nr" resname="tx_a2gproducts_domain_model_products.nr">
<source>Nr</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.title" resname="tx_a2gproducts_domain_model_products.title">
<source>Title</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.description" resname="tx_a2gproducts_domain_model_products.description">
<source>Description</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.image" resname="tx_a2gproducts_domain_model_products.image">
<source>Image</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.images" resname="tx_a2gproducts_domain_model_products.images">
<source>Images</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.net_price" resname="tx_a2gproducts_domain_model_products.net_price">
<source>Net Price</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.gross_price" resname="tx_a2gproducts_domain_model_products.gross_price">
<source>Gross Price</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.rel_category" resname="tx_a2gproducts_domain_model_products.rel_category">
<source>Category</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.rel_filter_values" resname="tx_a2gproducts_domain_model_products.rel_filter_values">
<source>Filter Values</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories" resname="tx_a2gproducts_domain_model_categories">
<source>Categories</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.title" resname="tx_a2gproducts_domain_model_categories.title">
<source>Title</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.description" resname="tx_a2gproducts_domain_model_categories.description">
<source>Description</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.image" resname="tx_a2gproducts_domain_model_categories.image">
<source>Image</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.rel_filters" resname="tx_a2gproducts_domain_model_categories.rel_filters">
<source>Filters</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters" resname="tx_a2gproducts_domain_model_filters">
<source>Filters</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.title" resname="tx_a2gproducts_domain_model_filters.title">
<source>Title</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.filter_type" resname="tx_a2gproducts_domain_model_filters.filter_type">
<source>Filter Type</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.db_operation_max" resname="tx_a2gproducts_domain_model_filters.db_operation_max">
<source>Db Operation Max</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.db_operation_min" resname="tx_a2gproducts_domain_model_filters.db_operation_min">
<source>Db Operation Min</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.rel_filter_option" resname="tx_a2gproducts_domain_model_filters.rel_filter_option">
<source>Filter Option</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions" resname="tx_a2gproducts_domain_model_filteroptions">
<source>Filter Options</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.title" resname="tx_a2gproducts_domain_model_filteroptions.title">
<source>Title</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.value_min" resname="tx_a2gproducts_domain_model_filteroptions.value_min">
<source>Value Min</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.value_max" resname="tx_a2gproducts_domain_model_filteroptions.value_max">
<source>Value Max</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues" resname="tx_a2gproducts_domain_model_filtervalues">
<source>Filter Values</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues.value" resname="tx_a2gproducts_domain_model_filtervalues.value">
<source>Value</source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues.rel_filters" resname="tx_a2gproducts_domain_model_filtervalues.rel_filters">
<source>Filters</source>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductslist.name" resname="tx_a2g_products_a2gproductslist.name">
<source>Altogether Products - Product List</source>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductslist.description" resname="tx_a2g_products_a2gproductslist.description">
<source></source>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductsdetail.name" resname="tx_a2g_products_a2gproductsdetail.name">
<source>Altogether Products - Product Detail</source>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductsdetail.description" resname="tx_a2g_products_a2gproductsdetail.description">
<source></source>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientslist.name" resname="tx_a2g_products_ingredientslist.name">
<source>Altogether Products - Ingredients List</source>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientslist.description" resname="tx_a2g_products_ingredientslist.description">
<source></source>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientsdetail.name" resname="tx_a2g_products_ingredientsdetail.name">
<source>Altogether Products - Ingredients Detail</source>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientsdetail.description" resname="tx_a2g_products_ingredientsdetail.description">
<source></source>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_ingredients" resname="tx_a2gproducts_domain_model_ingredients">
<source>Ingredients</source>
</trans-unit>
<trans-unit id="title" resname="title">
<source>title</source>
</trans-unit>
<trans-unit id="description" resname="description">
<source>description</source>
</trans-unit>
<trans-unit id="image" resname="image">
<source>image</source>
</trans-unit>
<trans-unit id="rel_filters" resname="rel_filters">
<source>Filters</source>
</trans-unit>
<trans-unit id="value_min" resname="value_min">
<source>min value</source>
</trans-unit>
<trans-unit id="value_max" resname="value_max">
<source>max value</source>
</trans-unit>
<trans-unit id="filter_type" resname="filter_type">
<source>filter type</source>
</trans-unit>
<trans-unit id="db_operation_min" resname="db_operation_min">
<source>operation min</source>
</trans-unit>
<trans-unit id="db_operation_max" resname="db_operation_max">
<source>operation max</source>
</trans-unit>
<trans-unit id="rel_filter_option" resname="rel_filter_option">
<source>filter option</source>
</trans-unit>
<trans-unit id="value" resname="value">
<source>value</source>
</trans-unit>
<trans-unit id="images" resname="images">
<source>images</source>
</trans-unit>
<trans-unit id="rel_products" resname="rel_products">
<source>products</source>
</trans-unit>
<trans-unit id="product_nr" resname="product_nr">
<source>product nr</source>
</trans-unit>
<trans-unit id="rel_category" resname="rel_category">
<source>category</source>
</trans-unit>
<trans-unit id="rel_filter_values" resname="rel_filter_values">
<source>filter values</source>
</trans-unit>
<trans-unit id="rel_ingredients" resname="rel_ingredients">
<source>ingredients</source>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>products with this ingredient</source>
</trans-unit>
<trans-unit id="filter_type.useFilterOptions" resname="filter_type.useFilterOptions">
<source>just use Filter Options</source>
</trans-unit>
<trans-unit id="slug" resname="slug">
<source>slug</source>
</trans-unit>
<trans-unit id="images_tab" resname="images_tab">
<source>Images</source>
</trans-unit>
<trans-unit id="seo_tab" resname="images_tab">
<source>SEO</source>
</trans-unit>
<trans-unit id="sizes_tab" resname="images_tab">
<source>Sizes</source>
</trans-unit>
<trans-unit id="product_variants_tab" resname="product_variants_tab">
<source>Varainats</source>
</trans-unit>
<trans-unit id="filters_tab" resname="filters_tab">
<source>Filters</source>
</trans-unit>
<trans-unit id="ingredients_tab" resname="ingredients_tab">
<source>Ingredients</source>
</trans-unit>
<trans-unit id="rel_productvariants" resname="rel_productvariants">
<source>Product-Variants</source>
</trans-unit>
<trans-unit id="description_html" resname="description_html">
<source>Description ( RTE )</source>
</trans-unit>
<trans-unit id="selectabel_product_attribute_tab" resname="selectabel_product_attribute_tab">
<source>Product Options</source>
</trans-unit>
<trans-unit id="rel_selectableattribute" resname="rel_selectableattribute">
<source>Selectable Produkt Options</source>
</trans-unit>
<trans-unit id="tab_icon" resname="tab_icon">
<source>Tab Icon</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:render section="content" />
</html>

View File

@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="altogether-products">
<f:render section="content" />
</div>
</html>

View File

@@ -0,0 +1,54 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers" xmlns:a2g="http://typo3.org/ns/A2G/AltogetherToolkit/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{records}">
<div id="masonry-ingredent-detail" class="grid mt-0 position-relative"
data-masonry='{ "itemSelector": ".masonry-item", "columnWidth": ".grid-sizer", "percentPosition": true, "transitionDuration": "0.05s"}'>
<f:for each="{records}" as="item" iteration="iteration">
<div class="grid-sizer masonry-item--width1-3"></div>
<div class="masonry-item masonry-item--width1-3 p-1" data-itemno="{iteration.index}">
<f:if condition="{useLightbox}">
<f:then>
<bk2k:link.lightbox
image="{item.image}"
maxHeight="{settings.lightbox.image.maxHeight}"
maxWidth="{settings.lightbox.image.maxWidth}"
class="{settings.lightbox.cssClass}"
rel="{settings.lightbox.prefix}-{data.uid}"
title="{item.images.0.properties.title}"
caption="{item.images.0.properties.description}"
>
<f:render partial="Masonry/Item/{item.data.item_type -> bk2k:format.upperCamelCase()}" arguments="{_all}" />
</bk2k:link.lightbox>
</f:then>
<f:else> <f:if condition="{item.image}">
<f:switch expression="{item.itemClass}">
<f:case value="">
<f:variable name="imageWidth">300</f:variable>
</f:case>
<f:case value="--width2">
<f:variable name="imageWidth">350</f:variable>
</f:case>
<f:case value="--width3">
<f:variable name="imageWidth">650</f:variable>
</f:case>
<f:case value="--width4">
<f:variable name="imageWidth">970</f:variable>
</f:case>
<f:case value="--width5">
<f:variable name="imageWidth">1280</f:variable>
</f:case>
<f:defaultCase>
<f:variable name="imageWidth">{item.image.data.width}</f:variable>
</f:defaultCase>
</f:switch>
<img loading="lazy" width="100%" src="{f:uri.image(image: item.image, cropVariant: 'default', width: imageWidth)}" title="a2g-{item.image.properties.title}" alt="a2g-{item.image.properties.alternative}">
</f:if></f:else>
</f:if>
</div>
</f:for>
</div>
</f:if>
</html>

View File

@@ -0,0 +1,2 @@
<f:render partial="{settings.style}/Products/List/List" arguments="{_all}" />

View File

@@ -0,0 +1,12 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class='row'>
<div class='col-md-4 col-lg-3'>
<f:render partial="{settings.style}/Products/List/Filter" arguments="{uniqid: uniqid, filters: filters}" />
</div>
<div class='col-md-8 col-lg-9'>
<div class="row h-100 a2g-ajax-content">
<f:render partial="{settings.style}/Products/List/List" arguments="{products: products, settings: settings}" />
</div>
</div>
</div>
</html>

View File

@@ -0,0 +1,34 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:form class='a2g-ajax-form' action='ajaxList' pageType='1629140329'>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[sc]' value='{settings.showCategories}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[dp]' value='{settings.detailPage}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[style]' value='{settings.style}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[limit]' value='{settings.ajaxListLimit}'/>
<input class='a2g-ajax-loads' type='hidden' name='tx_a2gproducts_a2gproductlist[loads]' value='0'/>
<input type='input' name='tx_a2gproducts_a2gproductlist[searchField]' value='{searchField}' class="form-control form-control-lg" placeholder="{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search_input_placeholder',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search_input_placeholder')}"/>
<f:if condition="{filters -> f:count()} > 0">
<button class="btn btn-light form-control-lg mt-2 mb-2 me-2" type="button" data-bs-toggle="collapse" data-bs-target="#collapseFilter{uniqid}" aria-expanded="false" aria-controls="collapseExample">
{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.advanced_search',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.advanced_search')}
</button>
<div class="collapse" id="collapseFilter{uniqid}">
<div class="d-flex flex-wrap">
<f:for each="{filters}" as="filter">
<f:if condition="{filter.relFilterOption -> f:count()} > 0">
<div class="m-2 card card-body">
<f:render partial="FilterElements/Checkbox" arguments="{uniqid: uniqid, filter: filter}" />
</div>
</f:if>
</f:for>
</div>
</div>
</f:if>
<f:form.submit value="{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search')}" class="btn btn-secondary form-control-lg" />
</f:form>
</html>

View File

@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{products -> f:count()} > 0">
<f:then>
<f:for each="{products}" as="product" iteration='it'>
<f:if condition='{it.index} < {settings.ajaxListLimit} || {settings.ajaxListLimit} == 0'>
<f:then>
<div class="col-md-12 col-lg-6 col-sm-6">
<f:render partial="ListElements/CardContent" arguments="{_all}" />
</div>
</f:then>
</f:if>
</f:for>
<f:if condition='{products -> f:count()} > {settings.ajaxListLimit} && {settings.ajaxListLimit} > 0'>
<f:then>
<f:render partial="ListElements/LoadMoreButton" arguments="{_all}" />
</f:then>
</f:if>
</f:then>
<f:else>
<f:render partial="ListElements/NoProductFound" arguments="{_all}" />
</f:else>
</f:if>
</html>

View File

@@ -0,0 +1,58 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:debug>{_all}</f:debug>
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": <f:comment>lol</f:comment>"{products.title}",
"description": <f:comment>lol</f:comment>"{products.description}",
"brand": {
"@type": "Brand",
"name": "altogether"
},
"review": {
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "Raphael Martin"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "89"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/anvil",
"priceCurrency": "EUR",
"price": "119.99",
"priceValidUntil": "2020-11-20",
"itemCondition": "https://schema.org/UsedCondition",
"availability": "https://schema.org/InStock"
}
}
</script>
<h1>{product.title}</h1>
<span><f:translate key="prduct_nr" default="prduct_nr" ></f:translate>: {product.nr}</span>
<div class="row">
<div class="col-lg-4">
<f:if condition="{product.image}">
<f:then>
<f:image image="{product.image}" alt="{product.title}" title="{product.title}" width="400c" height="300" cropVariant="default" loading="lazy"></f:image>
</f:then>
</f:if>
</div>
<div class="col-lg-8">
</div>
</div>
</html>

View File

@@ -0,0 +1,42 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<h1>Single View for Products</h1>
<f:flashMessages />
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": <f:comment>lol</f:comment>"{products.title}",
"description": <f:comment>lol</f:comment>"{products.description}",
"brand": {
"@type": "Brand",
"name": "altogether"
},
"additionalProperty": [
{
"@type": "https://schema.org/PropertyValue",
"name": "wight",
"value": "200",
"unitText": "kg"
}
],
"author": {
"@type": "Person",
"name": "Raphael Martin"
}
},
"offers": {
"@type": "Offer",
"url": "https://example.com/anvil",
"priceCurrency": "EUR",
"price": "119.99",
"priceValidUntil": "2020-11-20",
"availability": "https://schema.org/InStock"
}
}
</script>
<f:link.action action="list" pageUid="{settings.listPage}">Back to list</f:link.action>
</html>

View File

@@ -0,0 +1,20 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="filter{filter.uid}">
<div class="">
{filter.title}
</div>
<div class="">
<f:for each="{filter.relFilterOption}" as="opt">
<div class="ml-2">
<input type="checkbox" data-name="filterOption-{uniqid}-{filter.uid}-{opt.uid}" data-group="{filter.title}" name="tx_a2gproducts_a2gproductlist[filter][{filter.uid}][{opt.uid}]" value="1" id="filterOption-{uniqid}-{filter.uid}-{opt.uid}">
<label for="filterOption-{uniqid}-{filter.uid}-{opt.uid}">
<f:comment>
<span class="pill-icon"><svg id="house-entrance" xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"> <path data-name="Pfad 2136" d="M12,4.75a.5.5,0,0,0-.194-.4L6.306.1a.5.5,0,0,0-.612,0l-5.5,4.25A.5.5,0,0,0,0,4.75V11.5a.5.5,0,0,0,.5.5h4a.25.25,0,0,0,.25-.25V9.5a1.25,1.25,0,0,1,2.5,0v2.25A.25.25,0,0,0,7.5,12h4a.5.5,0,0,0,.5-.5Z" fill="#5d5d5d"></path></svg></span>
</f:comment>
{opt.title}
</label>
</div>
</f:for>
</div>
</div>
</html>

View File

@@ -0,0 +1,46 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:form class='a2g-ajax-form' action='ajaxList' pageType='1629140329'>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[sc]' value='{settings.showCategories}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[dp]' value='{settings.detailPage}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[style]' value='{settings.style}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[limit]' value='{settings.ajaxListLimit}'/>
<input class='a2g-ajax-loads' type='hidden' name='tx_a2gproducts_a2gproductlist[loads]' value='0'/>
<f:if condition="{filters -> f:count()} > 0">
<f:then>
<div class="row">
<div class="col-md-8">
<input type='input' name='tx_a2gproducts_a2gproductlist[searchField]' value='' class="form-control mb-2 form-control-lg" placeholder="search"/>
</div>
<div class="col-md-4">
<button class="btn btn-light form-control-lg" type="button" data-bs-toggle="collapse" data-bs-target="#collapseFilter{uniqid}" aria-expanded="false" aria-controls="collapseExample">
advanced search
</button>
</div>
</div>
<div class="collapse" id="collapseFilter{uniqid}">
<div class="d-flex flex-wrap">
<f:for each="{filters}" as="filter">
<f:if condition="{filter.relFilterOption -> f:count()} > 0">
<div class="m-2 card card-body">
<f:render partial="FilterElements/Checkbox" arguments="{uniqid: uniqid, filter: filter}" />
</div>
</f:if>
</f:for>
</div>
</div>
</f:then>
<f:else>
<div class="row">
<div class="col-md-12">
<input type='input' name='tx_a2gproducts_a2gproductlist[searchField]' value='' class="form-control mb-2 form-control-lg" placeholder="search"/>
</div>
</div>
</f:else>
</f:if>
<f:form.submit value="search" class="btn btn-secondary mt-2" />
</f:form>
</html>

View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>TODO write content</div>
</body>
</html>

View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>TODO write content</div>
</body>
</html>

View File

@@ -0,0 +1,80 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers" data-namespace-typo3-fluid="true">
<picture>
<f:for each="{variants}" key="name" as="variant">
<f:variable name="breakpoint">{variant.breakpoint as integer}</f:variable>
<f:variable name="width">{variant.width as integer}</f:variable>
<f:variable name="height" value="" />
<f:if condition="{width}">
<f:if condition="{variant.aspectRatio}">
<f:variable name="aspectRatio">{variant.aspectRatio as float}</f:variable>
<f:variable name="height">{width / aspectRatio}</f:variable>
<f:variable name="height">{height as integer}</f:variable>
</f:if>
<f:variable name="mediaQuery">{f:if(condition: breakpoint, then: 'media="(min-width: {breakpoint}px)"')}</f:variable>
<f:if condition="{variant.sizes}">
<f:variable name="srcset" value="" />
<f:for each="{variant.sizes}" key="sizeKey" as="sizeConfig" iteration="iteration">
<f:variable name="sizeWidth">{sizeConfig.multiplier as float}</f:variable>
<f:variable name="sizeWidth">{sizeWidth * width}</f:variable>
<f:variable name="sizeHeight" value="" />
<f:if condition="{height}">
<f:then>
<f:variable name="sizeHeight">{sizeConfig.multiplier as float}</f:variable>
<f:variable name="sizeHeight">{sizeHeight * height}</f:variable>
<f:variable name="sizeUrl">{f:uri.image(image: file, cropVariant: name, width: '{sizeWidth}c', height: '{sizeHeight}c',absolute:'true')}</f:variable>
</f:then>
<f:else>
<f:if condition="{maxWidth} < {sizeWidth}">
<f:then>
<f:variable name="sizeUrl">{f:uri.image(image: file, cropVariant: 'default', width: maxWidth, absolute:'true')}</f:variable>
</f:then>
<f:else>
<f:variable name="sizeUrl">{f:uri.image(image: file, cropVariant: 'default', width: sizeWidth, absolute:'true')}</f:variable>
</f:else>
</f:if>
</f:else>
</f:if>
<f:variable name="srcset">{srcset}{sizeUrl} {sizeKey}{f:if(condition: iteration.isLast, else: ',')}</f:variable>
</f:for>
</f:if>
<source data-variant="{name}" {f:if(condition: sizeHeight, then: 'data-width="{width}" data-height="{sizeHeight}"', else: 'data-maxwidth="{width}"')} {mediaQuery->f:format.raw()} srcset="{srcset}">
</f:if>
</f:for>
<f:variable name="defaultWidth" value="{variants.default.width}" />
<f:variable name="defaultAspectRatio" value="{variants.default.aspectRatio}" />
<f:if condition="{defaultAspectRatio}">
<f:variable name="aspectRatio">{defaultAspectRatio as float}</f:variable>
<f:variable name="defaultHeight">{defaultWidth / aspectRatio}</f:variable>
<f:variable name="defaultHeight">{defaultHeight as integer}c</f:variable>
</f:if>
<f:if condition="{defaultHeight}">
<f:then>
<f:variable name="src" value="{f:uri.image(image: file, cropVariant: 'default', width: defaultWidth, height: defaultHeight, absolute:'true')}" />
</f:then>
<f:else>
<f:if condition="{maxWidth}">
<f:then>
<f:variable name="src" value="{f:uri.image(image: file, cropVariant: 'default', width: maxWidth, absolute:'true')}" />
</f:then>
<f:else>
<f:variable name="src" value="{f:uri.image(image: file, cropVariant: 'default', width: defaultWidth, absolute:'true')}" />
</f:else>
</f:if>
</f:else>
</f:if>
<f:variable name="finalWidth" value="{bk2k:data.imageInfo(src: src, property: 'width')}" />
<f:variable name="finalHeight" value="{bk2k:data.imageInfo(src: src, property: 'height')}" />
<f:if condition="itemprop">
<f:then>
<img loading="lazy" itemprop="image" src="{src}" width="{finalWidth}" height="{finalHeight}" intrinsicsize="{finalWidth}x{finalHeight}" title="{file.properties.title}" alt="{file.properties.alternative}">
</f:then>
<f:else>
<img loading="lazy" src="{src}" width="{finalWidth}" height="{finalHeight}" intrinsicsize="{finalWidth}x{finalHeight}" title="{file.properties.title}" alt="{file.properties.alternative}">
</f:else>
</f:if>
</picture>
</html>

View File

@@ -0,0 +1,42 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="card h-100 m-2">
<f:if condition="{product.image}">
<f:then>
<f:link.action action="show" controller="Products" pluginName="a2gproductsdetail" extensionName="{settings.detailPagePluginType}" pageUid="{settings.productDetailPage}" arguments="{product : product}">
<figure class="image m-0">
<f:render partial="Image" arguments="{file: product.image, settings: settings, variants: variants, maxWidth: 450}" />
</figure>
</f:link.action>
</f:then>
</f:if>
<div class="card-body">
<div class="card-title">{product.title}</div>
<p class="card-text">
<f:format.crop maxCharacters="150" respectWordBoundaries="true">
{product.description}
</f:format.crop>
</p>
</div>
<ul class="list-group list-group-flush">
<f:for each="{product.relFilterValues}" as="values">
<li class="list-group-item">
{values.relFilters.title} :
<f:if condition=" {values.relFilters.filterType} == 3">
<f:then>
{values.relFilterOption.title}
</f:then>
<f:else>
{values.value}
</f:else>
</f:if>
</li>
</f:for>
</ul>
<div class="card-body d-flex">
<f:link.action class="card-link btn btn-primary" action="show" controller="Products" pluginName="a2gproductsdetail" extensionName="{settings.detailPagePluginType}" pageUid="{settings.productDetailPage}" arguments="{product : product}">
<f:translate key="LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.product_detail_link" default="LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.product_detail_link"></f:translate>
</f:link.action>
</div>
</div>
</html>

View File

@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="card">
<div class="card-body">
<f:if condition="{ingredient.image}">
<f:link.action action="show" pluginName="ingredientsdetail" absolute="true" controller="Ingredients" extensionName="A2gProducts" pageUid="{settings.ingredientsDetailPage}" arguments="{ingredient : ingredient}">
<figure class="image card-img-top">
<f:render partial="Image" arguments="{file: ingredient.image, settings: settings, variants: variants, maxWidth: 450}" />
</figure>
</f:link.action>
</f:if>
<div class="card-title">{ingredient.title}</div>
<p class="card-text">
<f:format.crop maxCharacters="150" respectWordBoundaries="true">
{ingredient.description}
</f:format.crop>
</p>
</div>
<div class="card-footer bg-white border-white">
<f:link.action class="card-link btn btn-primary w-100" action="show" absolute="true" pluginName="ingredientsdetail" controller="Ingredients" extensionName="A2gProducts" pageUid="{settings.ingredientsDetailPage}" arguments="{ingredient : ingredient}">
<f:translate key="LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.product_detail_link" default="LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.product_detail_link"></f:translate>
</f:link.action>
</div>
</div>
</html>

View File

@@ -0,0 +1,7 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class='col-12 a2g-ajax-loadmore-btn-wrap d-flex justify-content-around'>
<button type="button" class='a2g-ajax-loadmore-btn btn btn-secondary'>
load more
</button>
</div>
</html>

View File

@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="col-12 d-flex justify-content-around">
no product found
</div>
</html>

View File

@@ -0,0 +1,22 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="swiper a2g-products-swiper-images">
<div class="swiper-wrapper swiper-horizontal">
<f:for each="{images}" as="image" iteration="it">
<div class="swiper-slide">
<img loading="lazy" src="{f:uri.image(image: image, cropVariant: 'default', width: image.data.width)}" width="100%" title="{image.title}" alt="{image.alt}">
</div>
</f:for>
</div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
<div class="swiper a2g-products-swiper-images-thumb">
<div class="swiper-wrapper swiper-horizontal">
<f:for each="{images}" as="image" iteration="it">
<div class="swiper-slide">
<img loading="lazy" src="{f:uri.image(image: image, cropVariant: 'default', width: image.data.width)}" width="100%" title="{image.title}" alt="{image.alt}">
</div>
</f:for>
</div>
</div>
</html>

View File

@@ -0,0 +1,23 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers" data-namespace-typo3-fluid="true">
<bk2k:data.imageVariants as="variants" variants="{variants}" multiplier="{columnConfig.multiplier}" gutters="{columnConfig.gutters}" corrections="{columnConfig.corrections}" />
<f:if condition="{ingredients -> f:count()} > 3">
<f:then>
<div class="swiper a2g-products-swiper-card">
<div class="swiper-wrapper swiper-horizontal">
<f:for each="{ingredients}" as="ingredient" iteration="it">
<div class="swiper-slide"><div class="mb-5"><f:render partial="ListElements/Ingredients" arguments="{ingredient: ingredient, settings: settings}" /></div></div>
</f:for>
</div>
<div class="swiper-pagination swiper-pagination-clickable swiper-pagination-bullets swiper-pagination-horizontal"></div>
</div>
</f:then>
<f:else>
<div class="row">
<f:for each="{ingredients}" as="ingredient" iteration="it">
<div class="col-lg-4 col-md-6"><f:render partial="ListElements/Ingredients" arguments="{ingredient: ingredient, settings: settings}" /></div>
</f:for>
</div>
</f:else>
</f:if>
</html>

View File

@@ -0,0 +1,22 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{products -> f:count()} > 3">
<f:then>
<div class="swiper a2g-products-swiper-card">
<div class="swiper-wrapper swiper-horizontal a2g-product-card-group-element-columns-3">
<f:for each="{products}" as="product" iteration="it">
<div class="swiper-slide card-group-element-item h-100"><f:render partial="ListElements/CardContent" arguments="{product: product, settings: settings}" /></div>
</f:for>
</div>
<div class="swiper-pagination swiper-pagination-clickable swiper-pagination-bullets swiper-pagination-horizontal"></div>
</div>
</f:then>
<f:else>
<div class="card-group-element card-group-element-align-center a2g-product-card-group-element-columns-3 h-100 d-flex">
<f:for each="{products}" as="product" iteration="it">
<div class="col-lg-4 col-md-6 card-group-element-item"><div class="mb-5"><f:render partial="ListElements/CardContent" arguments="{product: product, settings: settings}" /></div></div>
</f:for>
</div>
</f:else>
</f:if>
</html>

View File

@@ -0,0 +1,2 @@
<f:render partial="{settings.style}/Products/List/List" arguments="{_all}" />

View File

@@ -0,0 +1,6 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:render partial="{settings.style}/Products/List/Filter" arguments="{_all}" />
<div class="row a2g-ajax-content">
<f:render partial="{settings.style}/Products/List/List" arguments="{_all}" />
</div>
</html>

View File

@@ -0,0 +1,48 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:form class='a2g-ajax-form' action='ajaxList' pageType='1629140329'>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[sc]' value='{settings.showCategories}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[dp]' value='{settings.detailPage}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[style]' value='{settings.style}'/>
<input type='hidden' name='tx_a2gproducts_a2gproductlist[limit]' value='{settings.ajaxListLimit}'/>
<input class='a2g-ajax-loads' type='hidden' name='tx_a2gproducts_a2gproductlist[loads]' value='0'/>
<f:if condition="{filters -> f:count()} > 0">
<f:then>
<div class="row">
<div class="col-md-8">
<input type='input' name='tx_a2gproducts_a2gproductlist[searchField]' value='{searchField}' class="form-control form-control-lg" placeholder="{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search_input_placeholder',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search_input_placeholder')}"/>
</div>
<div class="col-md-4">
<button class="btn btn-light form-control-lg mt-2 mb-2 me-2" type="button" data-bs-toggle="collapse" data-bs-target="#collapseFilter{uniqid}" aria-expanded="false" aria-controls="collapseExample">
{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.advanced_search',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.advanced_search')}
</button>
</div>
</div>
<div class="collapse" id="collapseFilter{uniqid}">
<div class="d-flex flex-wrap">
<f:for each="{filters}" as="filter">
<f:if condition="{filter.relFilterOption -> f:count()} > 0">
<div class="m-2 card card-body">
<f:render partial="FilterElements/Checkbox" arguments="{uniqid: uniqid, filter: filter}" />
</div>
</f:if>
</f:for>
</div>
</div>
</f:then>
<f:else>
<div class="row">
<div class="col-md-12">
<input type='input' name='tx_a2gproducts_a2gproductlist[searchField]' value='{searchField}' class="form-control form-control-lg" placeholder="{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search_input_placeholder',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search_input_placeholder')}"/>
</div>
</div>
</f:else>
</f:if>
<f:form.submit value="{f:translate(key:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search',default:'LLL:EXT:a2g_products/Resources/Private/Language/locallang.xlf:product_list.search')}" class="btn btn-secondary form-control-lg mt-2" />
</f:form>
</html>

View File

@@ -0,0 +1,23 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{products -> f:count()} > 0">
<f:then>
<f:for each="{products}" as="product" iteration='it'>
<f:if condition='{it.index} < {settings.ajaxListLimit} || {settings.ajaxListLimit} == 0'>
<f:then>
<div class="col-md-6 col-lg-4">
<f:render partial="ListElements/CardContent" arguments="{_all}" />
</div>
</f:then>
</f:if>
</f:for>
<f:if condition='{products -> f:count()} > {settings.ajaxListLimit} && {settings.ajaxListLimit} > 0'>
<f:then>
<f:render partial="ListElements/LoadMoreButton" arguments="{_all}" />
</f:then>
</f:if>
</f:then>
<f:else>
<f:render partial="ListElements/NoProductFound" arguments="{_all}" />
</f:else>
</f:if>
</html>

View File

@@ -0,0 +1,81 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<table class="tx-a2g-products" >
<tr>
<td>
<f:translate key="tx_a2gproducts_domain_model_products.nr" />
</td>
<td>
{products.nr}
</td>
</tr>
<tr>
<td>
<f:translate key="tx_a2gproducts_domain_model_products.title" />
</td>
<td>
{products.title}
</td>
</tr>
<tr>
<td>
<f:translate key="tx_a2gproducts_domain_model_products.description" />
</td>
<td>
{products.description}
</td>
</tr>
<tr>
<td>
<f:translate key="tx_a2gproducts_domain_model_products.image" />
</td>
<td>
<f:if condition="{products.image}">
<f:then>
<f:image image="{products.image}" width="200"/>
</f:then>
</f:if>
</td>
</tr>
<tr>
<td>
<f:translate key="tx_a2gproducts_domain_model_products.images" />
</td>
<td>
<f:if condition="{products.images}">
<f:then>
<f:image src="{products.images.originalResource.publicUrl}" width="200"/>
</f:then>
</f:if>
</td>
</tr>
<tr>
<td>
<f:translate key="tx_a2gproducts_domain_model_products.price" />
</td>
<td>
{products.price}
</td>
</tr>
</table>
<div class="row">
<f:for each="{products.relFilterValues}" as="values">
<div class="col-md-4">
{values.relFilters.title} :
<f:if condition=" {values.relFilters.filterType} == 3">
<f:then>
{values.relFilterOption.title}
</f:then>
<f:else>
{values.value}
</f:else>
</f:if>
</div>
</f:for>
</div>
<f:debug>{products}</f:debug>
</html>

View File

@@ -0,0 +1,51 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<h1>Single View for Products</h1>
<f:flashMessages />
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": <f:comment>lol</f:comment>"{products.title}",
"image": [
"<f:uri.image image='{products.image}' absolute='true'></f:uri.image>"
],
"description": <f:comment>lol</f:comment>"{products.description}",
"brand": {
"@type": "Brand",
"name": "altogether"
},
"review": {
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "Raphael Martin"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "89"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/anvil",
"priceCurrency": "EUR",
"price": "119.99",
"priceValidUntil": "2020-11-20",
"itemCondition": "https://schema.org/UsedCondition",
"availability": "https://schema.org/InStock"
}
}
</script>
<f:render partial="Products/Properties" arguments="{product:product}" />
<f:link.action action="list">Back to list</f:link.action><br />
<f:link.action action="new">New Products</f:link.action>
</html>

View File

@@ -0,0 +1,13 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="content">
<bk2k:data.imageVariants as="variants" variants="{variants}" multiplier="{columnConfig.multiplier}" gutters="{columnConfig.gutters}" corrections="{columnConfig.corrections}" />
<div class="card-group-element card-group-element-align-center a2g-product-card-group-element-columns-3 card-group-element-columns-3 h-100 a2g-ajax-content">
<f:for each="{ingredients}" as="ingredient">
<div class="card-group-element-item">
<f:render partial="ListElements/Ingredients" arguments="{ingredient: ingredient, settings: settings, variants: variants}" />
</div>
</f:for>
</div>
</f:section>
</html>

View File

@@ -0,0 +1,87 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="content">
<h1>{ingredient.title}</h1>
<div class="row">
<f:if condition="{ingredient.image} && {ingredient.images}">
<f:then>
<div class="col-lg-4 mb-3 order-1">
<div class="d-none" style="position: absolute; left:10000px;">
<img loading="lazy" src="{f:uri.image(image: ingredient.image, cropVariant: 'default', width: '730px', absolute:'true')}" width="100%" title="{ingredient.title}" alt="{ingredient.title}">
</div>
<div class="swiper a2g-products-swiper-images">
<div class="swiper-wrapper swiper-horizontal">
<div class="swiper-slide">
<figure class="image card-img-top m-0">
<f:render partial="Image" arguments="{file: ingredient.image, settings: settings, variants: variants, maxWidth: 730}" />
</figure>
</div>
<f:for each="{ingredient.images}" as="image" iteration="it">
<div class="swiper-slide">
<figure class="image card-img-top m-0">
<f:render partial="Image" arguments="{file: image, settings: settings, variants: variants, maxWidth: 730}" />
</figure>
</div>
</f:for>
</div>
</div>
<div class="swiper a2g-products-swiper-images-thumb mt-2">
<div class="swiper-wrapper swiper-horizontal">
<div class="swiper-slide">
<figure class="image m-0">
<f:render partial="Image" arguments="{file: ingredient.image, settings: settings, variants: variants, maxWidth: 200}" />
</figure>
</div>
<f:for each="{ingredient.images}" as="image" iteration="it">
<div class="swiper-slide">
<figure class="image m-0">
<f:render partial="Image" arguments="{file: image, settings: settings, variants: variants, maxWidth: 200}" />
</figure>
</div>
</f:for>
</div>
</div>
</div>
</f:then>
<f:else>
<f:if condition="{ingredient.image}">
<f:then>
<div class="col-lg-4 mb-3 order-1">
<figure class="image m-0">
<f:render partial="Image" arguments="{file: ingredient.image, settings: settings, variants: variants, maxWidth: 730}" />
</figure>
</div>
</f:then>
<f:else>
<div class="col-lg-4 mb-3 order-1">
<f:if condition="{ingredient.images}">
<f:then>
<f:render partial="Slider/Images" arguments="{products: ingredient.images}" />
</f:then>
</f:if>
</div>
</f:else>
</f:if>
</f:else>
</f:if>
<div class="{f:if(condition:'{ingredient.image} || {ingredient.images}',then:'col-lg-8 order-2',else:'col-12')}">
<p class="card-text">
{ingredient.description}
</p>
</div>
</div>
<f:render partial="ContentElements/Masonry" arguments="{records: ingredient.gallery}" />
<div class="text-center mt-3">
<h2><f:translate key="related_products" default="related_products"></f:translate></h2>
</div>
<f:render partial="Slider/Products" arguments="{products: ingredient.relProducts, detailPage: settings.productDetailPage, detailExtension: settings.productDetailPageExtension}" />
</f:section>
</html>

View File

@@ -0,0 +1,7 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Ajax" />
<f:section name="content">
<f:render partial="{settings.style}/AjaxList" arguments="{_all}" />
</f:section>
</html>

View File

@@ -0,0 +1,6 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="content">
<f:render partial="{settings.style}/List" arguments="{_all}" />
</f:section>
</html>

View File

@@ -0,0 +1,6 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="content">
<f:render partial="{settings.style}/Show" arguments="{_all}" />
</f:section>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
Resources/Public/Icons/a2g.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
Resources/Public/Icons/tag.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,17 @@
/**
* A2gGaEcommerce
*/
var A2gGaEcommerce = function () {
'use strict';
var Constructor = function () {
// id, name, price = 0.0, quantity = 0, currency = '', categories = [], listId = 'all_products', listName = 'All Products', position= 0, brand = '', variant = '', locationId = '', affiliation = 'altogether store', discount = 0.0, coupon = '') {
// GaProduct test
var gaProduct = new GaProduct('test_id', 'test_name', 323.23, 3, 'EUR', ['category1', 'category2'], 'all_products', 'All Products', 1, 'test brand', 'test variant', '', 'altogether store');
gaProduct.selectItem();
console.log(gaProduct);
};
return Constructor;
}(GaCheckout, GaProduct, GaProducts, GaPromotion, GaPromotions, GaPurchase, GaRefund, GaRefunds)

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaCheckout
*/
var GaCheckout = function () {
'use strict';
var Constructor = function () {
};
Constructor.prototype.checkout = function (step, option, GaProductsObject, url) {
if (typeof ga === 'function' && typeof dataLayer === 'object' && typeof GaProductsObject === 'object' && GaProductsObject instanceof GaProducts) {
var products = [];
for (var i = 0; i < GaProductsObject.arr.length; i++) {
products.push({
'name': GaProductsObject.arr[i].name, // Name or ID is required.
'id': GaProductsObject.arr[i].id,
'price': GaProductsObject.arr[i].price,
'brand': GaProductsObject.arr[i].brand,
'category': GaProductsObject.arr[i].category,
'variant': GaProductsObject.arr[i].variant,
'quantity': GaProductsObject.arr[i].quantity
});
}
dataLayer.push({
'event': 'checkout',
'ecommerce': {
'checkout': {
'actionField': {'step': step, 'option': option},
'products': products
}
},
'eventCallback': function(){
document.location = url;
}
});
} else {
console.log('GaCheckout.checkout requiers ga and dataLayer');
}
};
Constructor.prototype.checkoutOption = function (step, option) {
if (typeof ga === 'function' && typeof dataLayer === 'object') {
dataLayer.push({
'event': 'checkoutOption',
'ecommerce': {
'checkout': {
'actionField': {'step': step, 'option': option}
}
}
});
} else {
// console.log('checkoutOption requiers ga and dataLayer');
}
};
return Constructor;
}();

View File

@@ -0,0 +1 @@
var GaCheckout=function(){"use strict";var t=function(){};return t.prototype.checkout=function(t,e,a,o){if("function"==typeof ga&&"object"==typeof dataLayer&&"object"==typeof a&&a instanceof GaProducts){for(var r=[],c=0;c<a.arr.length;c++)r.push({name:a.arr[c].name,id:a.arr[c].id,price:a.arr[c].price,brand:a.arr[c].brand,category:a.arr[c].category,variant:a.arr[c].variant,quantity:a.arr[c].quantity});dataLayer.push({event:"checkout",ecommerce:{checkout:{actionField:{step:t,option:e},products:r}},eventCallback:function(){document.location=o}})}else console.log("checkout requiers ga and dataLayer")},t.prototype.checkoutOption=function(t,e){"function"==typeof ga&&"object"==typeof dataLayer&&dataLayer.push({event:"checkoutOption",ecommerce:{checkout:{actionField:{step:t,option:e}}}})},t}();

View File

@@ -0,0 +1,145 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaProduct
*/
var GaProduct = function () {
'use strict';
var Constructor = function (id, name, price = 0.0, quantity = 0, currency = '', categories = [], listId = 'all_products', listName = 'All Products', position = 0, brand = '', variant = '', locationId = '', affiliation = 'altogether store', discount = 0.0, coupon = '') {
if (typeof ga === 'function' && typeof dataLayer === 'object' && typeof gtag === 'function') {
this.item_id = id;
this.item_name = name;
for (var i = 0; i < categories.length; i++) {
if (i === 0) {
this.item_category = categories[i];
}
if (i === 1) {
this.item_category2 = categories[i];
}
if (i === 2) {
this.item_category3 = categories[i];
}
if (i === 3) {
this.item_category4 = categories[i];
}
if (i === 4) {
this.item_category5 = categories[i];
}
}
if (price > 0) {
this.price = price;
}
if (currency !== '') {
this.currency = currency;
}
if (quantity > 0) {
this.quantity = quantity;
}
if (position > 0) {
this.index = position;
}
if (brand !== '') {
this.item_brand = brand;
}
if (variant !== '') {
this.item_variant = variant;
}
if (listId !== '') {
this.item_list_id = listId;
}
if (listName !== '') {
this.item_list_name = listName;
}
if (locationId !== '') {
this.location_id = locationId;
}
if (affiliation !== '') {
this.affiliation = affiliation;
}
if (discount > 0.00) {
this.discount = discount;
}
if (coupon !== '') {
this.coupon = coupon;
}
} else {
console.log('ga datalayer or gtag missing');
}
};
Constructor.prototype.selectItem = function () {
gtag('event', 'select_item', {
item_list_id: this.listId,
item_list_name: this.listName,
items: [JSON.stringify(this)]
});
};
Constructor.prototype.viewItem = function () {
gtag('event', 'view_item', {
currency: this.currency,
value: this.price,
items: [JSON.stringify(this)]
});
};
Constructor.prototype.addToCart = function (currencyCode = 'EUR') {
if (typeof ga === 'function' && typeof dataLayer === 'object') {
dataLayer.push({
'event': 'addToCart',
'ecommerce': {
'currencyCode': currencyCode.toUpperCase(),
'add': {
'products': [{
'name': this.name, // Name or ID is required.
'id': this.id,
'price': this.price,
'brand': this.brand,
'category': this.category,
'variant': this.variant,
'position': this.position
}]
}
}
});
} else {
// console.log('GaProduct.addToCart requiers ga and dataLayer');
}
};
Constructor.prototype.removeFromCart = function () {
if (typeof ga === 'function' && typeof dataLayer === 'object') {
dataLayer.push({
'event': 'removeFromCart',
'ecommerce': {
'remove': {
'products': [{
'name': this.name, // Name or ID is required.
'id': this.id,
'price': this.price,
'brand': this.brand,
'category': this.category,
'variant': this.variant,
'position': this.position
}]
}
}
});
} else {
// console.log('GaProduct.removeFromCart requiers ga and dataLayer');
}
};
return Constructor;
}();

View File

@@ -0,0 +1 @@
function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var GaProduct=function(){"use strict";function t(t,e,i,o,a,n){var r=6<arguments.length&&void 0!==arguments[6]?arguments[6]:0,d=7<arguments.length&&void 0!==arguments[7]?arguments[7]:0;this.name=t,this.id=e,this.price=i,this.brand=o,this.category=a,this.variant=n,this.position=r,this.quantity=d}return t.prototype.productClick=function(t,e){"function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&dataLayer.push({event:"productClick",ecommerce:{click:{actionField:t,products:[{name:this.name,id:this.id,price:this.price,brand:this.brand,category:this.category,variant:this.variant,position:this.position}]}},eventCallback:function(){document.location=e}})},t.prototype.detail=function(t){"function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&dataLayer.push({ecommerce:{detail:{actionField:t,products:[{name:this.name,id:this.id,price:this.price,brand:this.brand,category:this.category,variant:this.variant,position:this.position}]}}})},t.prototype.addToCart=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"EUR";"function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&dataLayer.push({event:"addToCart",ecommerce:{currencyCode:t.toUpperCase(),add:{products:[{name:this.name,id:this.id,price:this.price,brand:this.brand,category:this.category,variant:this.variant,position:this.position}]}}})},t.prototype.removeFromCart=function(){"function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&dataLayer.push({event:"removeFromCart",ecommerce:{remove:{products:[{name:this.name,id:this.id,price:this.price,brand:this.brand,category:this.category,variant:this.variant,position:this.position}]}}})},t}();

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaProducts
*/
var GaProducts = function () {
'use strict';
var Constructor = function (itemListId, itemListName, GaProductObject) {
this.item_list_id = itemListId;
this.item_list_name = itemListName;
this.arr = [];
if (typeof (GaProductObject) === 'object' && GaProductObject instanceof GaProduct) {
this.arr.push(GaProductObject);
}
};
Constructor.prototype.push = function (GaProductObject) {
if (typeof (GaProductObject) === 'object' && GaProductObject instanceof GaProduct) {
this.arr.push(GaProductObject);
} else {
console.log('GaProductObject must be a instanceof GaProduct');
}
};
Constructor.prototype.viewItemList = function () {
gtag("event", "view_item_list", {
item_list_id: this.item_list_id,
item_list_name: this.item_list_name,
items: JSON.stringify(this.arr)
});
};
Constructor.prototype.impressions = function (currencyCode = 'EUR', list = 'Search Results') {
if (typeof ga === 'function' && typeof dataLayer === 'object' && this.arr.length > 0) {
var products = [];
for (var i = 0; i < this.arr.length; i++) {
products.push({
'name': this.arr[i].name, // Name or ID is required.
'id': this.arr[i].id,
'price': this.arr[i].price,
'brand': this.arr[i].brand,
'category': this.arr[i].category,
'variant': this.arr[i].variant,
'list': list,
'position': this.arr[i].position
});
}
dataLayer.push({
'ecommerce': {
'currencyCode': currencyCode,
'impressions': products
}
});
} else {
console.log('GaProducts.productClick requiers ga and dataLayer');
}
};
Constructor.prototype.addToCart = function (currencyCode = 'EUR') {
if (typeof ga === 'function' && typeof dataLayer === 'object' && this.arr.length > 0) {
var products = [];
for (var i = 0; i < this.arr.length; i++) {
products.push({
'name': this.arr[i].name, // Name or ID is required.
'id': this.arr[i].id,
'price': this.arr[i].price,
'brand': this.arr[i].brand,
'category': this.arr[i].category,
'variant': this.arr[i].variant,
'quantity': this.arr[i].quantity
});
}
dataLayer.push({
'event': 'addToCart',
'ecommerce': {
'currencyCode': currencyCode.toUpperCase(),
'add': {
'products': products
}
}
});
} else {
console.log('GaProducts.addToCart requiers ga and dataLayer');
}
};
Constructor.prototype.removeFromCart = function () {
if (typeof ga === 'function' && typeof dataLayer === 'object' && this.arr.length > 0) {
var products = [];
for (var i = 0; i < this.arr.length; i++) {
products.push({
'name': this.arr[i].name, // Name or ID is required.
'id': this.arr[i].id,
'price': this.arr[i].price,
'brand': this.arr[i].brand,
'category': this.arr[i].category,
'variant': this.arr[i].variant,
'quantity': this.arr[i].quantity
});
}
dataLayer.push({
'event': 'removeFromCart',
'ecommerce': {
'remove': {
'products': products
}
}
});
} else {
console.log('GaProducts.removeFromCart requiers ga and dataLayer');
}
};
return Constructor;
}(GaProduct);

View File

@@ -0,0 +1 @@
function _typeof(r){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r})(r)}var GaProducts=function(){"use strict";function r(r){this.arr=[],"object"===_typeof(r)&&r instanceof GaProduct?this.arr.push(r):console.log("GaProductObject must be a instanceof GaProduct")}return r.prototype.push=function(r){"object"===_typeof(r)&&r instanceof GaProduct?this.arr.push(r):console.log("GaProductObject must be a instanceof GaProduct")},r.prototype.impressions=function(){var r=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"EUR",t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"Search Results";if("function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&0<this.arr.length){for(var a=[],e=0;e<this.arr.length;e++)a.push({name:this.arr[e].name,id:this.arr[e].id,price:this.arr[e].price,brand:this.arr[e].brand,category:this.arr[e].category,variant:this.arr[e].variant,list:t,position:this.arr[e].position});dataLayer.push({ecommerce:{currencyCode:r,impressions:a}})}else console.log("GaProducts.productClick requiers ga and dataLayer")},r.prototype.addToCart=function(){var r=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"EUR";if("function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&0<this.arr.length){for(var t=[],a=0;a<this.arr.length;a++)t.push({name:this.arr[a].name,id:this.arr[a].id,price:this.arr[a].price,brand:this.arr[a].brand,category:this.arr[a].category,variant:this.arr[a].variant,quantity:this.arr[a].quantity});dataLayer.push({event:"addToCart",ecommerce:{currencyCode:r.toUpperCase(),add:{products:t}}})}else console.log("GaProducts.addToCart requiers ga and dataLayer")},r.prototype.removeFromCart=function(){if("function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&0<this.arr.length){for(var r=[],t=0;t<this.arr.length;t++)r.push({name:this.arr[t].name,id:this.arr[t].id,price:this.arr[t].price,brand:this.arr[t].brand,category:this.arr[t].category,variant:this.arr[t].variant,quantity:this.arr[t].quantity});dataLayer.push({event:"removeFromCart",ecommerce:{remove:{products:r}}})}else console.log("GaProducts.removeFromCart requiers ga and dataLayer")},r}(GaProduct);

View File

@@ -0,0 +1,55 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaPromotion
*/
var GaPromotion = function () {
'use strict';
var Constructor = function (id, name, creative, position) {
this.id = id;
this.name = name;
this.creative = creative;
this.position = position;
};
Constructor.prototype.promotionClick = function (url) {
if (typeof ga === 'function' && typeof dataLayer === 'object') {
var promotions = [];
promotions.push({
'id': this.id, // Name or ID is required.
'name': this.name,
'creative': this.creative,
'position': this.position
});
dataLayer.push({
'event': 'promotionClick',
'ecommerce': {
'promoClick': {
'promotions': promotions
}
},
'eventCallback': function(){
document.location = url;
}
});
} else {
// console.log('GaPromotion.promotionClick requiers ga and dataLayer');
}
};
return Constructor;
}();

View File

@@ -0,0 +1 @@
function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var GaPromotion=function(){"use strict";function t(t,o,e,n){this.id=t,this.name=o,this.creative=e,this.position=n}return t.prototype.promotionClick=function(t){var o;"function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&((o=[]).push({id:this.id,name:this.name,creative:this.creative,position:this.position}),dataLayer.push({event:"promotionClick",ecommerce:{promoClick:{promotions:o}},eventCallback:function(){document.location=t}}))},t}();

View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaPromotions
*/
var GaPromotions = function () {
'use strict';
var Constructor = function (GaPromotionObject) {
this.arr = [];
if (typeof (GaPromotionObject) === 'object' && GaPromotionObject instanceof GaPromotion) {
this.arr.push(GaPromotionObject);
} else {
console.log('GaPromotionObject must be a instanceof GaPromotion');
}
};
Constructor.prototype.push = function (GaProductObject) {
if (typeof (GaProductObject) === 'object' && GaProductObject instanceof GaProduct) {
this.arr.push(GaProductObject);
} else {
console.log('GaProductObject must be a instanceof GaProduct');
}
};
Constructor.prototype.promoView = function () {
if (typeof ga === 'function' && typeof dataLayer === 'object' && this.arr.length > 0) {
var promotions = [];
for (var i = 0; i < this.arr.length; i++) {
promotions.push({
'id': this.arr[i].id, // Name or ID is required.
'name': this.arr[i].name,
'creative': this.arr[i].creative,
'position': this.arr[i].position
});
}
dataLayer.push({
'ecommerce': {
'promoView': {
'promotions': promotions
}
}
});
} else {
// console.log('GaPromotions.promoView requiers ga and dataLayer');
}
};
return Constructor;
}(GaPromotion);

View File

@@ -0,0 +1 @@
function _typeof(o){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o})(o)}var GaPromotions=function(){"use strict";function o(o){this.arr=[],"object"===_typeof(o)&&o instanceof GaPromotion?this.arr.push(o):console.log("GaPromotionObject must be a instanceof GaPromotion")}return o.prototype.push=function(o){"object"===_typeof(o)&&o instanceof GaProduct?this.arr.push(o):console.log("GaProductObject must be a instanceof GaProduct")},o.prototype.promoView=function(){if("function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&0<this.arr.length){for(var o=[],t=0;t<this.arr.length;t++)o.push({id:this.arr[t].id,name:this.arr[t].name,creative:this.arr[t].creative,position:this.arr[t].position});dataLayer.push({ecommerce:{promoView:{promotions:o}}})}},o}(GaPromotion);

View File

@@ -0,0 +1,67 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaPurchase
*/
var GaPurchase = function () {
'use strict';
var Constructor = function (id, affiliation, revenue, tax, shipping, coupon) {
this.id = id;
this.affiliation = affiliation;
this.revenue = revenue;
this.tax = tax;
this.shipping = shipping;
this.coupon = coupon;
};
Constructor.prototype.purchase = function (GaProductsObject) {
if (typeof ga === 'function' && typeof dataLayer === 'object' && typeof GaProductsObject === 'object' && GaProductsObject instanceof GaProducts) {
var products = [];
for (var i = 0; i < GaProductsObject.arr.length; i++) {
products.push({
'name': GaProductsObject.arr[i].name, // Name or ID is required.
'id': GaProductsObject.arr[i].id,
'price': GaProductsObject.arr[i].price,
'brand': GaProductsObject.arr[i].brand,
'category': GaProductsObject.arr[i].category,
'variant': GaProductsObject.arr[i].variant,
'quantity': GaProductsObject.arr[i].quantity
});
}
dataLayer.push({
'event': 'checkout',
'ecommerce': {
'purchase': {
'actionField': {
'id': this.id, // Transaction ID. Required for purchases and refunds.
'affiliation': this.affiliation,
'revenue': this.revenue, // Total transaction value (incl. tax and shipping)
'tax': this.tax,
'shipping': this.shipping,
'coupon': this.coupon
},
'products': products
}
}
});
} else {
// console.log('GaPurchase.purchase requiers ga and dataLayer');
}
};
return Constructor;
}(GaProducts);

View File

@@ -0,0 +1 @@
function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var GaPurchase=function(){"use strict";function t(t,e,i,o,r,n){this.id=t,this.affiliation=e,this.revenue=i,this.tax=o,this.shipping=r,this.coupon=n}return t.prototype.purchase=function(t){if("function"==typeof ga&&"object"===("undefined"==typeof dataLayer?"undefined":_typeof(dataLayer))&&"object"===_typeof(t)&&t instanceof GaProducts){for(var e=[],i=0;i<t.arr.length;i++)e.push({name:t.arr[i].name,id:t.arr[i].id,price:t.arr[i].price,brand:t.arr[i].brand,category:t.arr[i].category,variant:t.arr[i].variant,quantity:t.arr[i].quantity});dataLayer.push({event:"checkout",ecommerce:{purchase:{actionField:{id:this.id,affiliation:this.affiliation,revenue:this.revenue,tax:this.tax,shipping:this.shipping,coupon:this.coupon},products:e}}})}},t}(GaProducts);

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaRefund
*/
var GaRefund = function () {
'use strict';
var Constructor = function (id) {
this.id = id;
};
Constructor.prototype.refund = function () {
if (typeof ga === 'function' && typeof dataLayer === 'object') {
dataLayer.push({
'event': 'checkout',
'ecommerce': {
'refund': {
'actionField': {
'id': this.id
}
}
}
});
} else {
// console.log('GaRefund.refund requiers ga and dataLayer');
}
};
return Constructor;
}();

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaRefund
*/
var GaRefund = function () {
'use strict';
var Constructor = function (id) {
this.id = id;
};
Constructor.prototype.refund = function () {
if (typeof ga === 'function' && typeof dataLayer === 'object') {
dataLayer.push({
'event': 'checkout',
'ecommerce': {
'refund': {
'actionField': {
'id': this.id
}
}
}
});
} else {
// console.log('GaRefund.refund requiers ga and dataLayer');
}
};
return Constructor;
}();

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) 2021 Raphael Martin <r.martin@felder-group.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* GaRefunds
*/
var GaRefunds = function () {
'use strict';
var Constructor = function (gaRefundObject) {
if (typeof (gaRefundObject) === 'object' && gaRefundObject instanceof GaRefund) {
this.gaRefund = gaRefundObject;
} else {
console.log('GaProductObject must be a instanceof GaProduct');
}
};
Constructor.prototype.refund = function (GaProductsObject) {
if (typeof ga === 'function' && typeof dataLayer === 'object' && typeof GaProductsObject === 'object' && GaProductsObject instanceof GaProducts) {
var products = [];
for (var i = 0; i < GaProductsObject.arr.length; i++) {
products.push({
'id': GaProductsObject.arr[i].id,
'quantity': GaProductsObject.arr[i].quantity
});
}
dataLayer.push({
'event': 'checkout',
'ecommerce': {
'refund': {
'actionField': {
'id': this.gaRefund.id
},
'products': products
}
}
});
} else {
// console.log('GaRefunds.refund requiers ga and dataLayer');
}
};
return Constructor;
}(GaProducts, GaRefund);

View File

@@ -0,0 +1 @@
var GaRefunds=function(){"use strict";var t=function(t){"object"==typeof t&&t instanceof GaRefund?this.gaRefund=t:console.log("GaProductObject must be a instanceof GaProduct")};return t.prototype.refund=function(t){if("function"==typeof ga&&"object"==typeof dataLayer&&"object"==typeof t&&t instanceof GaProducts){for(var e=[],a=0;a<t.arr.length;a++)e.push({id:t.arr[a].id,quantity:t.arr[a].quantity});dataLayer.push({event:"checkout",ecommerce:{refund:{actionField:{id:this.gaRefund.id},products:e}}})}},t}(GaProducts,GaRefund);

View File

@@ -0,0 +1,49 @@
//=include google-analytics/GaProduct.js
//=include google-analytics/GaProducts.js
//=include google-analytics/GaPromotion.js
//=include google-analytics/GaPromotions.js
//=include google-analytics/GaCheckout.js
//=include google-analytics/GaPurchase.js
//=include google-analytics/GaRefund.js
//=include google-analytics/GaRefunds.js
// GaProduct test
var gaProduct = new GaProduct('test', 3234, 323.23, 'brand', 'cat', 'var');
gaProduct.productClick('url');
gaProduct.detail({'list': 'Apparel Gallery'});
gaProduct.addToCart();
gaProduct.removeFromCart();
// GaProducts test
var gaProducts = new GaProducts(gaProduct);
gaProducts.push(new GaProduct('tes2t', 32334, 3233.23, 'bradd', 'caddt', 'vardd'));
gaProducts.impressions();
gaProducts.addToCart();
gaProducts.removeFromCart();
// GaPromotion test
var gaPromotion = new GaPromotion('id', 'name', 'creative', 'postion');
gaPromotion.promotionClick('url');
// GaPromotions test
var gaPromotions = new GaPromotions(gaPromotion);
gaPromotions.promoView();
// GaCheckout test
var gaCheckout = new GaCheckout();
gaCheckout.checkout('step', 'option', gaProducts, 'url');
gaCheckout.checkoutOption('step', 'option');
// GaPurchase test
var gaPurchase = new GaPurchase('id', 'affiliation', 'revenue', 'tax', 'shipping', 'coupon');
gaPurchase.purchase(gaProducts);
// GaRefund test
var gaRefund = new GaRefund('id');
gaRefund.refund();
// GaRefunds test
var gaRefunds = new GaRefunds(gaRefund);
gaRefunds.refund(gaProducts);

View File

@@ -0,0 +1,57 @@
//=include google-analytics/GaProduct.js
//=include google-analytics/GaProducts.js
//=include google-analytics/GaPromotion.js
//=include google-analytics/GaPromotions.js
//=include google-analytics/GaCheckout.js
//=include google-analytics/GaPurchase.js
//=include google-analytics/GaRefund.js
//=include google-analytics/GaRefunds.js
import GaProduct from 'google-analytics/GaProduct.js';
import GaProducts from 'google-analytics/GaProducts.js';
import GaPromotion from 'google-analytics/GaPromotion.js';
import GaPromotions from 'google-analytics/GaPromotions.js';
import GaCheckout from 'google-analytics/GaCheckout.js';
import GaPurchase from 'google-analytics/GaPurchase.js';
import GaRefund from 'google-analytics/GaRefund.js';
import GaRefunds from 'google-analytics/GaRefunds.js';
// GaProduct test
var gaProduct = new GaProduct('test', 3234, 323.23, 'brand', 'cat', 'var');
gaProduct.productClick('url');
gaProduct.detail({'list': 'Apparel Gallery'});
gaProduct.addToCart();
gaProduct.removeFromCart();
// GaProducts test
var gaProducts = new GaProducts(gaProduct);
gaProducts.push(new GaProduct('tes2t', 32334, 3233.23, 'bradd', 'caddt', 'vardd'));
gaProducts.impressions();
gaProducts.addToCart();
gaProducts.removeFromCart();
// GaPromotion test
var gaPromotion = new GaPromotion('id', 'name', 'creative', 'postion');
gaPromotion.promotionClick('url');
// GaPromotions test
var gaPromotions = new GaPromotions(gaPromotion);
gaPromotions.promoView();
// GaCheckout test
var gaCheckout = new GaCheckout();
gaCheckout.checkout('step', 'option', gaProducts, 'url');
gaCheckout.checkoutOption('step', 'option');
// GaPurchase test
var gaPurchase = new GaPurchase('id', 'affiliation', 'revenue', 'tax', 'shipping', 'coupon');
gaPurchase.purchase(gaProducts);
// GaRefund test
var gaRefund = new GaRefund('id');
gaRefund.refund();
// GaRefunds test
var gaRefunds = new GaRefunds(gaRefund);
gaRefunds.refund(gaProducts);

View File

@@ -0,0 +1,183 @@
if (window.Element && !Element.prototype.closest) {
Element.prototype.closest =
function (s) {
var matches = (this.document || this.ownerDocument).querySelectorAll(s), i, el = this;
do {
i = matches.length;
while (--i >= 0 && matches.item(i) !== el) {
}
;
} while ((i < 0) && (el = el.parentElement));
return el;
};
}
var a2gProductsList = {
wrapClass: 'altogether-products',
filterInputClass: 'a2g-filter-input',
ajaxFormClass: 'a2g-ajax-form',
ajaxContentClass: 'a2g-ajax-content',
ajaxLoadMoreInputClass: 'a2g-ajax-loads',
ajaxLoadMoreBtnClass: 'a2g-ajax-loadmore-btn',
ajaxLoadMoreBtnWrapClass: 'a2g-ajax-loadmore-btn-wrap',
ajaxSpinnerClass: 'a2g-ajax-spinner',
ajaxLoadingSpinner: '<div class="a2g-ajax-spinner w-100 d-flex"><div class="spinner-border m-auto" style="width: 4rem; height: 4rem;" role="status"><span class="sr-only"></span></div></div>',
checkIfFilterIsFilledOnInit: function () {
},
initFormSubmit: function (_this, ajaxForms, i) {
ajaxForms[i].querySelector('.' + _this.ajaxFormClass).addEventListener("submit", function (e) {
e.preventDefault();
_this.formSubmitAction(_this, this);
return false;
});
},
formSubmitAction: function(_this, activeForm){
var activeContent = activeForm.closest('.' + _this.wrapClass).querySelector('.' + _this.ajaxContentClass);
activeContent.innerHTML = _this.ajaxLoadingSpinner;
activeForm.querySelector('.' + _this.ajaxLoadMoreInputClass).value = 0;
jQuery.ajax({
async: 'true',
url: $(activeForm).attr('action'),
type: 'POST',
data: $(activeForm).serializeArray(),
dataType: 'html',
success: function (result) {
activeForm.closest('.' + _this.wrapClass).querySelector('.' + _this.ajaxContentClass).innerHTML = result;
_this.initLoadMore(_this, activeContent.querySelector('.' + _this.ajaxLoadMoreBtnClass));
if (typeof (a2gShop) === 'object') {
a2gShop.cart.setCartActions(a2gShop.cart, activeContent.getElementsByClassName(a2gShop.cart.productWrapClass));
}
},
error: function (error) {
// console.log(error);
},
done: function () {
}
});
},
initLoadMore: function (_this, btn) {
if (btn !== null) {
btn.addEventListener("click", function () {
var activeForm = this.closest('.' + _this.wrapClass).querySelector('.' + _this.ajaxFormClass),
activeContent = this.closest('.' + _this.wrapClass).querySelector('.' + _this.ajaxContentClass);
activeContent.innerHTML += _this.ajaxLoadingSpinner;
activeContent.removeChild(activeContent.querySelector('.' + _this.ajaxLoadMoreBtnWrapClass));
activeForm.querySelector('.' + _this.ajaxLoadMoreInputClass).value = parseInt(activeForm.querySelector('.' + _this.ajaxLoadMoreInputClass).value) + 1;
jQuery.ajax({
async: 'true',
url: $(activeForm).attr('action'),
type: 'POST',
data: $(activeForm).serializeArray(),
dataType: 'html',
success: function (result) {
activeContent.removeChild(activeContent.querySelector('.' + _this.ajaxSpinnerClass));
activeContent.innerHTML += result;
_this.initLoadMore(_this, activeContent.querySelector('.' + _this.ajaxLoadMoreBtnClass));
if (typeof (a2gShop) === 'object') {
a2gShop.cart.setCartActions(a2gShop.cart, activeContent.getElementsByClassName(a2gShop.cart.productWrapClass));
}
},
error: function (error) {
// console.log(error);
},
done: function () {
}
});
});
}
},
init: function () {
var _this = this, ajaxForms = document.getElementsByClassName(_this.wrapClass), inputs = [];
document.addEventListener('DOMContentLoaded', function () {
for (var i = 0; i < ajaxForms.length; i++) {
inputs[i] = ajaxForms[i].getElementsByClassName(_this.filterInputClass);
for (var j = 0; j < inputs[i]; j++){
inputs[i].checked = false;
}
if (ajaxForms[i].querySelector('.' + _this.ajaxFormClass) !== null) {
_this.initFormSubmit(_this, ajaxForms, i);
_this.initLoadMore(_this, ajaxForms[i].querySelector('.' + _this.ajaxLoadMoreBtnClass));
}
}
});
}
};
a2gProductsList.init();
var a2gUri = {
encode: function(uri){
return encodeURIComponent(uri);
},
mailto: function(mailto, subject, body){
var _this = a2gUri;
if(typeof(mailto) === 'string' && typeof(subject) === 'string' && typeof(body) === 'string'){
return 'mailto:'+mailto+'?subject='+_this.encode(subject)+'&body='+_this.encode(body);
} else if(typeof(mailto) === 'string' && typeof(subject) === 'string'){
return 'mailto:'+_this.encode(mailto)+'?subject='+_this.encode(subject);
} else if(typeof(mailto) === 'string'){
return 'mailto:'+mailto;
}
}
};
var a2gProductsDetail = {
class: {
wrap: 'a2g-product-detail',
variant: {
tab: 'a2g-product-variant-tab'
},
request: {
mail: 'a2g-product-request-mail'
}
},
setRequestBtnLink: function(subject, body) {
var _this = a2gProductsDetail;
var btns = document.getElementsByClassName(_this.class.request.mail);
for( var i = 0; i < btns.length; i++){
btns[i].setAttribute('href', a2gUri.mailto(btns[i].dataset.mailto, subject, body));
}
},
getVariantTabTriggerElement: function() {
var _this = a2gProductsDetail, triggerEle = document.querySelector('.'+_this.class.variant.tab+'[data-href="' + window.location.href + '"]');
if (triggerEle === null) {
triggerEle = document.querySelector('.'+_this.class.variant.tab+'[data-href="' + window.location.pathname + '"]');
}
return triggerEle;
},
fromHistoryBack: false,
init: function(){
var _this = a2gProductsDetail;
if (document.getElementsByClassName(_this.class.wrap)[0] !== null) {
var tabEl = document.getElementsByClassName(_this.class.variant.tab);
for (var i = 0; i < tabEl.length; i++) {
tabEl[i].addEventListener('shown.bs.tab', function (event) {
if (!_this.fromHistoryBack) {
history.pushState({
id: 'homepage-article'
}, 'altogether product detail', this.dataset.href);
}
_this.fromHistoryBack = false;
_this.setRequestBtnLink(this.dataset.subject, this.dataset.href);
});
}
window.addEventListener('popstate', function (event) {
var triggerEle = a2gProductsDetail.getVariantTabTriggerElement();
if (triggerEle !== null) {
_this.fromHistoryBack = true;
triggerEle.click();
}
});
var triggerEle = a2gProductsDetail.getVariantTabTriggerElement();
if (triggerEle !== null) {
if (!triggerEle.classList.contains('active')) {
triggerEle.click();
}
}
}
}
}
a2gProductsDetail.init();

View File

@@ -0,0 +1,86 @@
var a2gProductsSwiper = {
a2gCardSwiper: null,
initCardSwiper: function (_this) {
_this.a2gCardSwiper = new Swiper(".a2g-products-swiper-card", {
slidesPerView: 1,
spaceBetween: 10,
autoHeight: false,
loop: true,
init: true,
freeMode: false,
observer: true,
resizeObserver: true,
setWrapperSize: true,
preloadImages: true,
autoplay: {
delay: 7000,
disableOnInteraction: true
},
pagination: {
el: ".swiper-pagination",
clickable: true
},
breakpoints: {
640: {
slidesPerView: 2,
spaceBetween: 15
},
1024: {
slidesPerView: 3,
spaceBetween: 30
}
}
});
},
a2gImageSwiper: null,
a2gImageThumbSwiper: null,
initImageSwiper: function (_this) {
var sliders = document.getElementsByClassName("a2g-products-swiper-images-wrap");
_this.a2gImageThumbSwiper = [];
_this.a2gImageSwiper = [];
for (var i = 0; i < sliders.length; i++) {
_this.a2gImageThumbSwiper[i] = new Swiper('#' + sliders[i].querySelector(".a2g-products-swiper-images-thumb").id, {
loop: true,
spaceBetween: 10,
slidesPerView: 4,
freeMode: false,
autoHeight: false,
watchSlidesProgress: true,
setWrapperSize: true,
preloadImages: true,
observer: true,
resizeObserver: true
});
_this.a2gImageSwiper[i] = new Swiper('#' + sliders[i].querySelector(".a2g-products-swiper-images").id, {
loop: true,
spaceBetween: 10,
autoHeight: true,
freeMode: false,
observer: true,
resizeObserver: true,
setWrapperSize: true,
preloadImages: true,
effect: 'slide',
thumbs: {
swiper: _this.a2gImageThumbSwiper[i]
}
});
}
},
init: function () {
var _this = this;
_this.initCardSwiper(_this);
_this.initImageSwiper(_this);
document.addEventListener('DOMContentLoaded', function () {
_this.a2gCardSwiper.init();
for (var i = 0; i < _this.a2gImageThumbSwiper.length; i++) {
_this.a2gImageSwiper[i].init();
_this.a2gImageThumbSwiper[i].init();
}
});
}
};
a2gProductsSwiper.init();

11
Resources/Public/JavaScript/rSlider.min.js vendored Executable file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,134 @@
/*
Error: $color: "var(--bs-primary-rgb)" is not a color for `rgba'
on line 41 of /home/raphy/NetBeansProjects/altogether_DEV/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/_functions.scss
from line 11 of /home/raphy/NetBeansProjects/altogether_DEV/public/typo3conf/ext/a2g_products/Resources/Public/Scss/a2gProductsList.scss
Backtrace:
/home/raphy/NetBeansProjects/altogether_DEV/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/_functions.scss:41
/home/raphy/NetBeansProjects/altogether_DEV/public/typo3conf/ext/a2g_products/Resources/Public/Scss/a2gProductsList.scss:11
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:315:in `reformat_argument_error'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:162:in `rescue in _perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:131:in `_perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/node.rb:50:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:416:in `visit_return'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `block in visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `block in with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:10:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:265:in `block (3 levels) in perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:265:in `each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:265:in `block (2 levels) in perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:264:in `catch'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:264:in `block in perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:86:in `perform_arguments'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:261:in `perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:144:in `block in _perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:108:in `block in with_function'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:108:in `with_function'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:143:in `_perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/node.rb:50:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/functions.rb:617:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/functions.rb:2396:in `call'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:155:in `block in _perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:108:in `block in with_function'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:108:in `with_function'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:153:in `_perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/node.rb:50:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/map_literal.rb:53:in `block in _perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/map_literal.rb:52:in `map'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/map_literal.rb:52:in `_perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/node.rb:50:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:186:in `perform_arg'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:133:in `block in _perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:133:in `each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:133:in `each_with_index'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:133:in `each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:133:in `map'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:133:in `_perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/node.rb:50:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:482:in `visit_variable'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `block in visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `block in with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:244:in `block (3 levels) in visit_each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:244:in `map'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:244:in `block (2 levels) in visit_each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:236:in `map'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:236:in `block in visit_each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:183:in `with_environment'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:235:in `visit_each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `block in visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `block in with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:10:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:265:in `block (3 levels) in perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:265:in `each'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:265:in `block (2 levels) in perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:264:in `catch'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:264:in `block in perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:86:in `perform_arguments'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:261:in `perform_sass_fn'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:144:in `block in _perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:108:in `block in with_function'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:108:in `with_function'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/funcall.rb:143:in `_perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/script/tree/node.rb:50:in `perform'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:482:in `visit_variable'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `block in visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `block in with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:329:in `block (2 levels) in visit_import'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:329:in `map'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:329:in `block in visit_import'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:88:in `block in with_import'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:88:in `with_import'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:326:in `visit_import'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `block in visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `block in with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:135:in `with_frame'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/stack.rb:79:in `with_base'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:162:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:52:in `block in visit_children'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:52:in `map'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:52:in `visit_children'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:171:in `block in visit_children'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:183:in `with_environment'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:170:in `visit_children'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `block in visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:190:in `visit_root'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/base.rb:36:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:161:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/visitors/perform.rb:10:in `visit'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/root_node.rb:36:in `css_tree'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/tree/root_node.rb:29:in `render_with_sourcemap'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/engine.rb:389:in `_render_with_sourcemap'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/engine.rb:307:in `render_with_sourcemap'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/exec/sass_scss.rb:391:in `run'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/exec/sass_scss.rb:63:in `process_result'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/exec/base.rb:52:in `parse'
/usr/share/koala/rubygems/gems/sass-3.5.2/lib/sass/exec/base.rb:19:in `parse!'
/usr/share/koala/rubygems/gems/sass-3.5.2/bin/sass:13:in `<top (required)>'
/usr/share/koala/bin/sass:22:in `load'
/usr/share/koala/bin/sass:22:in `<main>'
*/
body:before {
white-space: pre;
font-family: monospace;
content: "Error: $color: \"var(--bs-primary-rgb)\" is not a color for `rgba'\A on line 41 of /home/raphy/NetBeansProjects/altogether_DEV/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/_functions.scss\A from line 11 of /home/raphy/NetBeansProjects/altogether_DEV/public/typo3conf/ext/a2g_products/Resources/Public/Scss/a2gProductsList.scss"; }

View File

@@ -0,0 +1,51 @@
/*
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
*/
/*
Created on : Aug 11, 2021, 11:24:31 AM
Author : Raphael Martin
*/
@import "../../../../bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/_functions.scss";
@import "../../../../bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/_variables.scss";
@import "../../../../bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/mixins";
.frame-background-secondary{
.altogether-products{
.btn-secondary{
@include button-variant($primary, $primary);
color: $dark;
}
}
}
.frame-background-primary{
.altogether-products{
.btn-primary{
@include button-variant($secondary, $secondary);
color: $light;
}
}
}
.a2g-product-card-group-element-columns-2 {
@include media-breakpoint-up('md') {
--cardgroup-columns: 2;
}
}
.a2g-product-card-group-element-columns-3 {
@include media-breakpoint-up('md') {
--cardgroup-columns: 2;
}
@include media-breakpoint-up('lg') {
--cardgroup-columns: 3;
}
}
.a2g-product-card-group-element-columns-3-sm {
@include media-breakpoint-up('sm') {
--cardgroup-columns: 2;
}
@include media-breakpoint-up('lg') {
--cardgroup-columns: 3;
}
}

View File

@@ -0,0 +1 @@
.rs-container *{box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rs-container{font-family:Arial,Helvetica,sans-serif;height:45px;position:relative}.rs-container .rs-bg,.rs-container .rs-selected{background-color:#eee;border:1px solid #ededed;height:10px;left:0;position:absolute;top:5px;width:100%;border-radius:3px}.rs-container .rs-selected{background-color:#00b3bc;border:1px solid #00969b;transition:all .2s linear;width:0}.rs-container.disabled .rs-selected{background-color:#ccc;border-color:#bbb}.rs-container .rs-pointer{background-color:#fff;border:1px solid #bbb;border-radius:4px;cursor:pointer;height:20px;left:-10px;position:absolute;top:0;transition:all .2s linear;width:30px;box-shadow:inset 0 0 1px #FFF,inset 0 1px 6px #ebebeb,1px 1px 4px rgba(0,0,0,.1)}.rs-container.disabled .rs-pointer{border-color:#ccc;cursor:default}.rs-container .rs-pointer::after,.rs-container .rs-pointer::before{content:'';position:absolute;width:1px;height:9px;background-color:#ddd;left:12px;top:5px}.rs-container .rs-pointer::after{left:auto;right:12px}.rs-container.sliding .rs-pointer,.rs-container.sliding .rs-selected{transition:none}.rs-container .rs-scale{left:0;position:absolute;top:5px;white-space:nowrap}.rs-container .rs-scale span{float:left;position:relative}.rs-container .rs-scale span::before{background-color:#ededed;content:"";height:8px;left:0;position:absolute;top:10px;width:1px}.rs-container.rs-noscale span::before{display:none}.rs-container.rs-noscale span:first-child::before,.rs-container.rs-noscale span:last-child::before{display:block}.rs-container .rs-scale span:last-child{margin-left:-1px;width:0}.rs-container .rs-scale span ins{color:#333;display:inline-block;font-size:12px;margin-top:20px;text-decoration:none}.rs-container.disabled .rs-scale span ins{color:#999}.rs-tooltip{color:#333;width:auto;min-width:60px;height:30px;background:#fff;border:1px solid #00969b;border-radius:3px;position:absolute;transform:translate(-50%,-35px);left:13px;text-align:center;font-size:13px;padding:6px 10px 0}.rs-container.disabled .rs-tooltip{border-color:#ccc;color:#999}