inital commit
11
Resources/Private/.htaccess
Executable 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>
|
36
Resources/Private/Language/de.locallang.xlf
Executable 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>
|
@@ -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 <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
<target>Produkt Titel / Name <br/>
|
||||
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( <a href="https://ogp.me/">open graph</a> )</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="description.description" resname="description.description">
|
||||
<source>description <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
<target>Produkt Beschreibung <br/>
|
||||
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( <a href="https://ogp.me/">open graph</a> )</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="image.description" resname="image.description">
|
||||
<source>product list image <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
<target>Produkt Listen Bild <br/>
|
||||
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( <a href="https://ogp.me/">open graph</a> )</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>
|
308
Resources/Private/Language/de.locallang_db.xlf
Executable 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>
|
29
Resources/Private/Language/locallang.xlf
Executable 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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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 <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="description.description" resname="description.description">
|
||||
<source>description <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="image.description" resname="image.description">
|
||||
<source>product list image <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</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>
|
221
Resources/Private/Language/locallang_db.xlf
Executable 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>
|
5
Resources/Private/Layouts/Ajax.html
Executable 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>
|
5
Resources/Private/Layouts/Default.html
Executable 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>
|
54
Resources/Private/Partials/ContentElements/Masonry.html
Executable 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>
|
2
Resources/Private/Partials/Default/AjaxList.html
Executable file
@@ -0,0 +1,2 @@
|
||||
|
||||
<f:render partial="{settings.style}/Products/List/List" arguments="{_all}" />
|
12
Resources/Private/Partials/Default/List.html
Executable 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>
|
34
Resources/Private/Partials/Default/Products/List/Filter.html
Executable 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>
|
24
Resources/Private/Partials/Default/Products/List/List.html
Executable 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>
|
58
Resources/Private/Partials/Default/Products/Properties.html
Executable 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>
|
42
Resources/Private/Partials/Default/Show.html
Executable 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>
|
20
Resources/Private/Partials/FilterElements/Checkbox.html
Executable 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>
|
46
Resources/Private/Partials/FilterElements/FilterGroups.html
Executable 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>
|
16
Resources/Private/Partials/FilterElements/RangeSlider.html
Executable 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>
|
16
Resources/Private/Partials/FilterElements/Selectbox.html
Executable 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>
|
80
Resources/Private/Partials/Image.html
Executable 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>
|
42
Resources/Private/Partials/ListElements/CardContent.html
Executable 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>
|
24
Resources/Private/Partials/ListElements/Ingredients.html
Executable 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>
|
7
Resources/Private/Partials/ListElements/LoadMoreButton.html
Executable 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>
|
5
Resources/Private/Partials/ListElements/NoProductFound.html
Executable 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>
|
22
Resources/Private/Partials/Slider/Images.html
Executable 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>
|
23
Resources/Private/Partials/Slider/Ingredients.html
Executable 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>
|
22
Resources/Private/Partials/Slider/Products.html
Executable 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>
|
2
Resources/Private/Partials/StyleOne/AjaxList.html
Executable file
@@ -0,0 +1,2 @@
|
||||
|
||||
<f:render partial="{settings.style}/Products/List/List" arguments="{_all}" />
|
6
Resources/Private/Partials/StyleOne/List.html
Executable 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>
|
48
Resources/Private/Partials/StyleOne/Products/List/Filter.html
Executable 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>
|
23
Resources/Private/Partials/StyleOne/Products/List/List.html
Executable 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>
|
81
Resources/Private/Partials/StyleOne/Products/Properties.html
Executable 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>
|
51
Resources/Private/Partials/StyleOne/Show.html
Executable 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>
|
13
Resources/Private/Templates/Ingredients/List.html
Executable 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>
|
87
Resources/Private/Templates/Ingredients/Show.html
Executable 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>
|
7
Resources/Private/Templates/Products/AjaxList.html
Executable 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>
|
6
Resources/Private/Templates/Products/List.html
Executable 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>
|
6
Resources/Private/Templates/Products/Show.html
Executable 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>
|
BIN
Resources/Public/Icons/Extension.png
Executable file
After Width: | Height: | Size: 46 KiB |
BIN
Resources/Public/Icons/a2g.gif
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
Resources/Public/Icons/brand-image.png
Executable file
After Width: | Height: | Size: 3.8 KiB |
BIN
Resources/Public/Icons/categories.png
Executable file
After Width: | Height: | Size: 2.9 KiB |
BIN
Resources/Public/Icons/filter-option.png
Executable file
After Width: | Height: | Size: 2.3 KiB |
BIN
Resources/Public/Icons/filters.png
Executable file
After Width: | Height: | Size: 2.1 KiB |
BIN
Resources/Public/Icons/fingerprint-outline-variant.png
Executable file
After Width: | Height: | Size: 2.3 KiB |
BIN
Resources/Public/Icons/natural-ingredients.png
Executable file
After Width: | Height: | Size: 21 KiB |
BIN
Resources/Public/Icons/online-shopping.png
Executable file
After Width: | Height: | Size: 19 KiB |
BIN
Resources/Public/Icons/package.png
Executable file
After Width: | Height: | Size: 2.2 KiB |
BIN
Resources/Public/Icons/tag.png
Executable file
After Width: | Height: | Size: 1.8 KiB |
17
Resources/Public/JavaScript/GoogleAnalytics/A2gGaEcommerce.js
Executable 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)
|
73
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaCheckout.js
Executable 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;
|
||||
}();
|
||||
|
||||
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaCheckout.min.js
vendored
Executable 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}();
|
145
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaProduct.js
Executable 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;
|
||||
}();
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaProduct.min.js
vendored
Executable 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}();
|
125
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaProducts.js
Executable 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);
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaProducts.min.js
vendored
Executable 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);
|
55
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaPromotion.js
Executable 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;
|
||||
}();
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaPromotion.min.js
vendored
Executable 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}();
|
62
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaPromotions.js
Executable 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);
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaPromotions.min.js
vendored
Executable 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);
|
67
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaPurchase.js
Executable 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);
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaPurchase.min.js
vendored
Executable 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);
|
44
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaRefund.js
Executable 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;
|
||||
}();
|
44
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaRefund.min.js
vendored
Executable 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;
|
||||
}();
|
57
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaRefunds.js
Executable 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);
|
1
Resources/Public/JavaScript/GoogleAnalytics/google-analytics/GaRefunds.min.js
vendored
Executable 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);
|
49
Resources/Public/JavaScript/GoogleAnalytics/googleanalytics.test.js
Executable 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);
|
57
Resources/Public/JavaScript/GoogleAnalytics/googleanalytics.test.min.js
vendored
Executable 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);
|
183
Resources/Public/JavaScript/a2gProductsList.js
Executable 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();
|
86
Resources/Public/JavaScript/a2gProductsSwiper.init.js
Executable 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
134
Resources/Public/Scss/a2gProductsList.css
Executable 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"; }
|
51
Resources/Public/Scss/a2gProductsList.scss
Executable 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;
|
||||
}
|
||||
}
|
1
Resources/Public/Scss/rSlider.min.scss
Executable 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}
|