diff --git a/.travis.yml b/.travis.yml
index 2c73fc07..c2cc23f5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -41,7 +41,8 @@ services:
script:
- bin/behat -fprogress --tags="~javascript"
- - bin/phpunit -c app
+ - bin/phpunit
+ - php app/console visithor:go --format=pretty --env=test
notifications:
email: false
diff --git a/app/AppKernel.php b/app/AppKernel.php
index 358aea65..38bde7c5 100644
--- a/app/AppKernel.php
+++ b/app/AppKernel.php
@@ -169,6 +169,9 @@ public function registerBundles()
$bundles[] = new Elcodi\Bundle\FixturesBoosterBundle\ElcodiFixturesBoosterBundle();
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
+
+ $bundles[] = new Visithor\Bundle\VisithorBundle();
+ $bundles[] = new Elcodi\Common\VisithorBridgeBundle\VisithorBridgeBundle();
}
return $bundles;
diff --git a/composer.json b/composer.json
index a121366b..4efaf1b9 100644
--- a/composer.json
+++ b/composer.json
@@ -122,7 +122,8 @@
"phpunit/phpunit": "4.5.0",
"mmoreram/php-formatter": "1.0.4",
- "fabpot/php-cs-fixer": "1.4.2"
+ "fabpot/php-cs-fixer": "1.4.2",
+ "visithor/visithor-bundle": "~0.1, >=0.1.7"
},
"scripts": {
"post-install-cmd": [
diff --git a/features/store/category.feature b/features/store/category.feature
index e990a44b..29e9c508 100644
--- a/features/store/category.feature
+++ b/features/store/category.feature
@@ -8,7 +8,6 @@ Feature: Store category
Given I am on "category/women-shirts/1"
Then I should see more than 0 products
- @haha
Scenario: Category redirection
Given I am on "category/women-shirts-false/1"
Then I should be on "category/women-shirts/1"
\ No newline at end of file
diff --git a/features/workflow/product.feature b/features/workflow/product.feature
index 9035c214..bd7d405c 100644
--- a/features/workflow/product.feature
+++ b/features/workflow/product.feature
@@ -18,7 +18,7 @@ Feature: Product engine
And I check "elcodi_admin_product_form_type_product_enabled"
And I press "submit-save"
And I am on "/admin/product/19/variant/new"
- And I wait "1" seconds
+ And I wait "3" seconds
And I select "1" from "select-Size"
And I select "4" from "select-Color"
And I fill in the following:
diff --git a/app/phpunit.xml.dist b/phpunit.xml.dist
similarity index 70%
rename from app/phpunit.xml.dist
rename to phpunit.xml.dist
index 23378c33..d30652b2 100644
--- a/app/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -11,20 +11,20 @@
processIsolation = "false"
stopOnFailure = "false"
syntaxCheck = "false"
- bootstrap = "bootstrap.php.cache" >
+ bootstrap = "app/bootstrap.php.cache" >
- ../src/Elcodi/*/*Bundle/Tests
+ src/Elcodi/*/*Bundle/Tests
- ../src
+ src
- ../src/Elcodi/*/*Bundle/Resources
- ../src/Elcodi/*/*Bundle/Tests
+ src/Elcodi/*/*Bundle/Resources
+ src/Elcodi/*/*Bundle/Tests
diff --git a/src/Elcodi/Admin/CurrencyBundle/DataFixtures/Currency/CurrencyEuroData.php b/src/Elcodi/Admin/CurrencyBundle/DataFixtures/Currency/CurrencyEuroData.php
index 39347635..0c17c1d1 100644
--- a/src/Elcodi/Admin/CurrencyBundle/DataFixtures/Currency/CurrencyEuroData.php
+++ b/src/Elcodi/Admin/CurrencyBundle/DataFixtures/Currency/CurrencyEuroData.php
@@ -21,7 +21,6 @@
use Elcodi\Bundle\CoreBundle\DataFixtures\ORM\Abstracts\AbstractFixture;
use Elcodi\Component\Core\Services\ObjectDirector;
-use Elcodi\Component\Currency\Factory\CurrencyFactory;
/**
* Class CurrencyEuroData
diff --git a/src/Elcodi/Admin/ProductBundle/Controller/ManufacturerController.php b/src/Elcodi/Admin/ProductBundle/Controller/ManufacturerController.php
index 587f0683..52e69994 100644
--- a/src/Elcodi/Admin/ProductBundle/Controller/ManufacturerController.php
+++ b/src/Elcodi/Admin/ProductBundle/Controller/ManufacturerController.php
@@ -17,7 +17,6 @@
namespace Elcodi\Admin\ProductBundle\Controller;
-use Elcodi\Component\Media\Entity\Interfaces\ImageInterface;
use Mmoreram\ControllerExtraBundle\Annotation\Entity as EntityAnnotation;
use Mmoreram\ControllerExtraBundle\Annotation\Form as FormAnnotation;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
@@ -29,6 +28,7 @@
use Elcodi\Admin\CoreBundle\Controller\Abstracts\AbstractAdminController;
use Elcodi\Component\Core\Entity\Interfaces\EnabledInterface;
+use Elcodi\Component\Media\Entity\Interfaces\ImageInterface;
use Elcodi\Component\Product\Entity\Interfaces\ManufacturerInterface;
/**
diff --git a/src/Elcodi/Admin/ProductBundle/Controller/ProductController.php b/src/Elcodi/Admin/ProductBundle/Controller/ProductController.php
index f3135548..296691be 100644
--- a/src/Elcodi/Admin/ProductBundle/Controller/ProductController.php
+++ b/src/Elcodi/Admin/ProductBundle/Controller/ProductController.php
@@ -17,7 +17,6 @@
namespace Elcodi\Admin\ProductBundle\Controller;
-use Elcodi\Component\Media\Entity\Interfaces\ImageInterface;
use Mmoreram\ControllerExtraBundle\Annotation\Entity as EntityAnnotation;
use Mmoreram\ControllerExtraBundle\Annotation\Form as FormAnnotation;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
@@ -29,6 +28,7 @@
use Elcodi\Admin\CoreBundle\Controller\Abstracts\AbstractAdminController;
use Elcodi\Component\Core\Entity\Interfaces\EnabledInterface;
+use Elcodi\Component\Media\Entity\Interfaces\ImageInterface;
use Elcodi\Component\Product\Entity\Interfaces\ProductInterface;
/**
diff --git a/src/Elcodi/Admin/ProductBundle/Controller/VariantController.php b/src/Elcodi/Admin/ProductBundle/Controller/VariantController.php
index e1930257..0edd82ac 100644
--- a/src/Elcodi/Admin/ProductBundle/Controller/VariantController.php
+++ b/src/Elcodi/Admin/ProductBundle/Controller/VariantController.php
@@ -17,7 +17,6 @@
namespace Elcodi\Admin\ProductBundle\Controller;
-use Elcodi\Component\Media\Entity\Interfaces\ImageInterface;
use Mmoreram\ControllerExtraBundle\Annotation\Entity as EntityAnnotation;
use Mmoreram\ControllerExtraBundle\Annotation\Form as FormAnnotation;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
@@ -31,6 +30,7 @@
use Elcodi\Component\Attribute\Entity\Interfaces\AttributeInterface;
use Elcodi\Component\Attribute\Entity\Interfaces\ValueInterface;
use Elcodi\Component\Core\Entity\Interfaces\EnabledInterface;
+use Elcodi\Component\Media\Entity\Interfaces\ImageInterface;
use Elcodi\Component\Product\Entity\Interfaces\ProductInterface;
use Elcodi\Component\Product\Entity\Interfaces\VariantInterface;
diff --git a/src/Elcodi/Admin/UserBundle/Controller/Stats/CustomerStatsController.php b/src/Elcodi/Admin/UserBundle/Controller/Stats/CustomerStatsController.php
deleted file mode 100644
index 4dce77f9..00000000
--- a/src/Elcodi/Admin/UserBundle/Controller/Stats/CustomerStatsController.php
+++ /dev/null
@@ -1,90 +0,0 @@
-
- * @author Aldo Chiecchia
- * @author Elcodi Team
- */
-
-namespace Elcodi\Admin\UserBundle\Controller\Stats;
-
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
-
-use Elcodi\Admin\CoreBundle\Controller\Abstracts\AbstractStatsController;
-
-/**
- * Class CustomerStatsController
- *
- * @Route(
- * path = "/customers/stats"
- * )
- */
-class CustomerStatsController extends AbstractStatsController
-{
- /**
- * Get count of all elements
- *
- * @return mixed
- *
- * @Route(
- * path = "/total",
- * name = "admin_customer_stats_total",
- * methods = {"GET"}
- * )
- * @Template("AdminCoreBundle:Stats:total.html.twig")
- */
- public function totalStatsAction()
- {
- return [
- 'total' => $this->getTotalStats('elcodi.entity.customer.class'),
- ];
- }
-
- /**
- * Get last month elements count
- *
- * @return mixed
- *
- * @Route(
- * path = "/monthly",
- * name = "admin_customer_stats_monthly",
- * methods = {"GET"}
- * )
- * @Template("AdminCoreBundle:Stats:monthly.html.twig")
- */
- public function monthlyStatsAction()
- {
- return [
- 'total' => $this->getMonthlyStats('elcodi.entity.customer.class'),
- ];
- }
-
- /**
- * Get today elements count
- *
- * @return mixed
- *
- * @Route(
- * path = "/daily",
- * name = "admin_customer_stats_daily",
- * methods = {"GET"}
- * )
- * @Template("AdminCoreBundle:Stats:daily.html.twig")
- */
- public function dailyStatsAction()
- {
- return [
- 'total' => $this->getDailyStats('elcodi.entity.customer.class'),
- ];
- }
-}
diff --git a/src/Elcodi/Admin/UserBundle/Resources/views/Customer/edit.html.twig b/src/Elcodi/Admin/UserBundle/Resources/views/Customer/edit.html.twig
index 05108c4f..50e02723 100644
--- a/src/Elcodi/Admin/UserBundle/Resources/views/Customer/edit.html.twig
+++ b/src/Elcodi/Admin/UserBundle/Resources/views/Customer/edit.html.twig
@@ -31,10 +31,12 @@
{% block header_actions %}
-
-
- {{ 'admin.order.from_user'|trans({ '%name%': customer.firstname }) }}
-
+ {% if customer.id %}
+
+
+ {{ 'admin.order.from_user'|trans({ '%name%': customer.firstname }) }}
+
+ {% endif %}
{% endblock header_actions %}
diff --git a/src/Elcodi/Common/VisithorBridgeBundle/DependencyInjection/VisithorBridgeExtension.php b/src/Elcodi/Common/VisithorBridgeBundle/DependencyInjection/VisithorBridgeExtension.php
new file mode 100644
index 00000000..370f2d70
--- /dev/null
+++ b/src/Elcodi/Common/VisithorBridgeBundle/DependencyInjection/VisithorBridgeExtension.php
@@ -0,0 +1,81 @@
+
+ * @author Aldo Chiecchia
+ * @author Elcodi Team
+ */
+
+namespace Elcodi\Common\VisithorBridgeBundle\DependencyInjection;
+
+use Elcodi\Bundle\CoreBundle\DependencyInjection\Abstracts\AbstractExtension;
+
+/**
+ * Class VisithorBridgeExtension
+ */
+class VisithorBridgeExtension extends AbstractExtension
+{
+ /**
+ * @var string
+ *
+ * Extension name
+ */
+ const EXTENSION_NAME = 'visithor_bridge';
+
+ /**
+ * Get the Config file location
+ *
+ * @return string Config file location
+ */
+ public function getConfigFilesLocation()
+ {
+ return __DIR__ . '/../Resources/config';
+ }
+
+ /**
+ * Config files to load
+ *
+ * Each array position can be a simple file name if must be loaded always,
+ * or an array, with the filename in the first position, and a boolean in
+ * the second one.
+ *
+ * As a parameter, this method receives all loaded configuration, to allow
+ * setting this boolean value from a configuration value.
+ *
+ * return array(
+ * 'file1.yml',
+ * 'file2.yml',
+ * ['file3.yml', $config['my_boolean'],
+ * ...
+ * );
+ *
+ * @param array $config Config definitions
+ *
+ * @return array Config files
+ */
+ protected function getConfigFiles(array $config)
+ {
+ return [
+ 'visithor',
+ ];
+ }
+
+ /**
+ * Returns the extension alias, same value as extension name
+ *
+ * @return string The alias
+ */
+ public function getAlias()
+ {
+ return self::EXTENSION_NAME;
+ }
+}
diff --git a/src/Elcodi/Common/VisithorBridgeBundle/Environment/EnvironmentBuilder.php b/src/Elcodi/Common/VisithorBridgeBundle/Environment/EnvironmentBuilder.php
new file mode 100644
index 00000000..83681b75
--- /dev/null
+++ b/src/Elcodi/Common/VisithorBridgeBundle/Environment/EnvironmentBuilder.php
@@ -0,0 +1,105 @@
+
+ * @author Aldo Chiecchia
+ * @author Elcodi Team
+ */
+
+namespace Elcodi\Common\VisithorBridgeBundle\Environment;
+
+use Symfony\Component\HttpKernel\KernelInterface;
+use Visithor\Bundle\Environment\SymfonyEnvironmentBuilder;
+
+use Elcodi\Component\User\Repository\AdminUserRepository;
+use Elcodi\Component\User\Repository\CustomerRepository;
+
+/**
+ * Class EnvironmentBuilder
+ */
+class EnvironmentBuilder extends SymfonyEnvironmentBuilder
+{
+ /**
+ * @var CustomerRepository
+ *
+ * Customer Repository
+ */
+ protected $customerRepository;
+
+ /**
+ * @var AdminUserRepository
+ *
+ * Admin User Repository
+ */
+ protected $adminUserRepository;
+
+ /**
+ * Construct
+ *
+ * @param CustomerRepository $customerRepository Customer Repository
+ * @param AdminUserRepository $adminUserRepository Admin User Repository
+ */
+ public function __construct(
+ CustomerRepository $customerRepository,
+ AdminUserRepository $adminUserRepository
+ ) {
+ $this->customerRepository = $customerRepository;
+ $this->adminUserRepository = $adminUserRepository;
+ }
+
+ /**
+ * Set up environment
+ *
+ * @param KernelInterface $kernel Kernel
+ *
+ * @return $this Self object
+ */
+ public function setUp(KernelInterface $kernel)
+ {
+ parent::setUp($kernel);
+
+ $this
+ ->executeCommand('doctrine:fixtures:load', [
+ '--fixtures' => $kernel
+ ->getRootDir() . '/../src/Elcodi/Fixtures',
+ ])
+ ->executeCommand('elcodi:templates:load')
+ ->executeCommand('elcodi:templates:enable', [
+ 'template' => 'StoreTemplateBundle',
+ ])
+ ->executeCommand('elcodi:plugins:load')
+ ->executeCommand('assets:install')
+ ->executeCommand('assetic:dump');
+ }
+
+ /**
+ * Get authenticated user
+ *
+ * @param string $role Role
+ *
+ * @return mixed User for authentication
+ */
+ public function getAuthenticationUser($role)
+ {
+ return 'ROLE_ADMIN' === $role
+ ? $this
+ ->adminUserRepository
+ ->findOneBy([
+ 'email' => 'admin@admin.com',
+ ])
+ : $this
+ ->customerRepository
+ ->find([
+ 'email' => 'customer@customer.com',
+ ]);
+ }
+}
diff --git a/src/Elcodi/Common/VisithorBridgeBundle/Resources/config/visithor.yml b/src/Elcodi/Common/VisithorBridgeBundle/Resources/config/visithor.yml
new file mode 100644
index 00000000..ed22b2d0
--- /dev/null
+++ b/src/Elcodi/Common/VisithorBridgeBundle/Resources/config/visithor.yml
@@ -0,0 +1,10 @@
+services:
+
+ #
+ # Visithor Bridge
+ #
+ visitor.environment_builder:
+ class: Elcodi\Common\VisithorBridgeBundle\Environment\EnvironmentBuilder
+ arguments:
+ - @elcodi.repository.customer
+ - @elcodi.repository.admin_user
diff --git a/src/Elcodi/Common/VisithorBridgeBundle/VisithorBridgeBundle.php b/src/Elcodi/Common/VisithorBridgeBundle/VisithorBridgeBundle.php
new file mode 100644
index 00000000..7a2aad60
--- /dev/null
+++ b/src/Elcodi/Common/VisithorBridgeBundle/VisithorBridgeBundle.php
@@ -0,0 +1,39 @@
+
+ * @author Aldo Chiecchia
+ * @author Elcodi Team
+ */
+
+namespace Elcodi\Common\VisithorBridgeBundle;
+
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+use Elcodi\Common\VisithorBridgeBundle\DependencyInjection\VisithorBridgeExtension;
+
+/**
+ * Class VisithorBridgeBundle
+ */
+class VisithorBridgeBundle extends Bundle
+{
+ /**
+ * Returns the bundle's container extension.
+ *
+ * @return ExtensionInterface The container extension
+ */
+ public function getContainerExtension()
+ {
+ return new VisithorBridgeExtension();
+ }
+}
diff --git a/src/Elcodi/Fixtures/DataFixtures/ORM/Shipping/Carriers.php b/src/Elcodi/Fixtures/DataFixtures/ORM/Shipping/Carriers.php
index ee19de5a..93bf4411 100644
--- a/src/Elcodi/Fixtures/DataFixtures/ORM/Shipping/Carriers.php
+++ b/src/Elcodi/Fixtures/DataFixtures/ORM/Shipping/Carriers.php
@@ -22,7 +22,11 @@
use Elcodi\Bundle\CoreBundle\DataFixtures\ORM\Abstracts\AbstractFixture;
use Elcodi\Component\Core\Services\ObjectDirector;
+use Elcodi\Component\Currency\Entity\Interfaces\CurrencyInterface;
+use Elcodi\Component\Currency\Entity\Money;
use Elcodi\Component\EntityTranslator\Services\Interfaces\EntityTranslatorInterface;
+use Elcodi\Component\Shipping\ElcodiShippingRangeTypes;
+use Elcodi\Component\Zone\Entity\Interfaces\ZoneInterface;
/**
* Class Carriers
@@ -37,7 +41,7 @@ class Carriers extends AbstractFixture implements DependentFixtureInterface
public function load(ObjectManager $manager)
{
/**
- * @var ObjectDirector $carrierDirector
+ * @var ObjectDirector $carrierDirector
* @var EntityTranslatorInterface $entityTranslator
*/
$carrierDirector = $this->getDirector('carrier');
@@ -55,22 +59,70 @@ public function load(ObjectManager $manager)
$entityTranslator->save($carrier, [
'en' => [
- 'name' => 'Basic',
+ 'name' => 'Basic',
'description' => 'Our basic delivery system',
],
'es' => [
- 'name' => 'Básico',
+ 'name' => 'Básico',
'description' => 'Nuestro sistema de entrega básico',
],
'fr' => [
- 'name' => 'Minimale',
+ 'name' => 'Minimale',
'description' => 'Notre système de livraison basique',
],
'ca' => [
- 'name' => 'Bàsic',
+ 'name' => 'Bàsic',
'description' => 'El nostre sistema d\'entrega bàsic',
],
]);
+
+ /**
+ * @var CurrencyInterface $currencyEuro
+ * @var ZoneInterface $zoneSpain
+ */
+ $zoneSpain = $this->getReference('zone-spain');
+ $currencyEuro = $this->getReference('currency-EUR');
+ $shippingRangeDirector = $this->getDirector('shipping_range');
+
+ $shippingPriceRange1 = $shippingRangeDirector
+ ->create()
+ ->setType(ElcodiShippingRangeTypes::TYPE_PRICE)
+ ->setCarrier($carrier)
+ ->setName('From 0€ to 10€')
+ ->setFromZone($zoneSpain)
+ ->setToZone($zoneSpain)
+ ->setFromPrice(Money::create(0, $currencyEuro))
+ ->setToPrice(Money::create(1000, $currencyEuro))
+ ->setPrice(Money::create(900, $currencyEuro))
+ ->setEnabled(true);
+
+ $shippingPriceRange2 = $shippingRangeDirector
+ ->create()
+ ->setType(ElcodiShippingRangeTypes::TYPE_PRICE)
+ ->setCarrier($carrier)
+ ->setName('From 10€ to 20€')
+ ->setFromZone($zoneSpain)
+ ->setToZone($zoneSpain)
+ ->setFromPrice(Money::create(1000, $currencyEuro))
+ ->setToPrice(Money::create(2000, $currencyEuro))
+ ->setPrice(Money::create(500, $currencyEuro))
+ ->setEnabled(true);
+
+ $shippingPriceRange3 = $shippingRangeDirector
+ ->create()
+ ->setType(ElcodiShippingRangeTypes::TYPE_PRICE)
+ ->setCarrier($carrier)
+ ->setName('Free for up to 20€')
+ ->setFromZone($zoneSpain)
+ ->setToZone($zoneSpain)
+ ->setFromPrice(Money::create(2000, $currencyEuro))
+ ->setToPrice(Money::create(999999999, $currencyEuro))
+ ->setPrice(Money::create(115, $currencyEuro))
+ ->setEnabled(true);
+
+ $shippingRangeDirector->save($shippingPriceRange1);
+ $shippingRangeDirector->save($shippingPriceRange2);
+ $shippingRangeDirector->save($shippingPriceRange3);
}
/**
@@ -83,6 +135,8 @@ public function getDependencies()
{
return [
'Elcodi\Fixtures\DataFixtures\ORM\Tax\TaxData',
+ 'Elcodi\Fixtures\DataFixtures\ORM\Currency\CurrencyData',
+ 'Elcodi\Fixtures\DataFixtures\ORM\Zone\ZoneData',
];
}
}
diff --git a/src/Elcodi/Fixtures/DataFixtures/ORM/Zone/ZoneData.php b/src/Elcodi/Fixtures/DataFixtures/ORM/Zone/ZoneData.php
index f73aa113..ac1732e7 100644
--- a/src/Elcodi/Fixtures/DataFixtures/ORM/Zone/ZoneData.php
+++ b/src/Elcodi/Fixtures/DataFixtures/ORM/Zone/ZoneData.php
@@ -52,6 +52,7 @@ public function load(ObjectManager $manager)
->setLocations($locations);
$zoneCollection->add($zone);
+ $this->setReference('zone-' . $zoneCode, $zone);
$zoneDirector->save($zone);
}
diff --git a/visithor.yml.dist b/visithor.yml.dist
new file mode 100644
index 00000000..429933f5
--- /dev/null
+++ b/visithor.yml.dist
@@ -0,0 +1,197 @@
+defaults:
+ verb: GET
+
+profiles:
+ admin:
+ firewall: admin_area
+ role: ROLE_ADMIN
+
+urls:
+ - [[admin_shipping_range_edit_component, {carrierId: 1, id: 1}], 200, {profile: admin}]
+ #
+ # Store
+ #
+ - [store_homepage, 200]
+ - [store_categories_nav, 200]
+ - [[store_category_products_list, {'slug': 'women-shirts', 'id': 1}], 200]
+ - [[store_category_products_list, {'slug': 'another-name', 'id': 1}], 301]
+ - [[store_product_view, {'slug': 'ibiza-lips-en', 'id': 1}], 200]
+ - [[store_product_view, {'slug': 'another-name', 'id': 1}], 301]
+ - [store_password_recover_sent, 200]
+ - [store_login, 200]
+ - [store_user_nav, 200]
+ - [store_user, 302]
+ - [store_cart_view, 200]
+ - [store_cart_nav, 200]
+ - [store_order_list, 302]
+ - [store_currency_nav, 200]
+ - [store_blog_view, 200]
+ - [[store_blog_post_view, {'slug': 'hola-mundo', 'id': 1}], 200]
+ - [store_address_list, 302]
+ - [store_language_nav, 200]
+
+ #
+ # Admin User
+ #
+ - [admin_admin_user_list, 200, {profile: admin}]
+ - [admin_admin_user_list_component, 200, {profile: admin}]
+ - [[admin_admin_user_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_admin_user_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_admin_user_new, 200, {profile: admin}]
+ - [admin_admin_user_new_component, 200, {profile: admin}]
+
+ #
+ # Customer
+ #
+ - [admin_customer_list, 200, {profile: admin}]
+ - [admin_customer_list_component, 200, {profile: admin}]
+ - [[admin_customer_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_customer_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_customer_new, 200, {profile: admin}]
+ - [admin_customer_new_component, 200, {profile: admin}]
+ - [[admin_customer_order_list_component, {customerId: 1}], 200, {profile: admin}]
+ - [[admin_customer_order_list_component, {customerId: 1}], 200, {profile: admin}]
+
+ #
+ # Security
+ #
+ - [admin_password_recover_sent, 200, {profile: admin}]
+ - [admin_profile_view, 200, {profile: admin}]
+
+ #
+ # Orders
+ #
+ - [admin_order_list, 200, {profile: admin}]
+ - [admin_order_list_component, 200, {profile: admin}]
+
+ #
+ # Products
+ #
+ - [[admin_product_view, {id:1}], 200, {profile: admin}]
+ - [admin_product_list, 200, {profile: admin}]
+ - [admin_product_list_component, 200, {profile: admin}]
+ - [[admin_product_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_product_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_product_new, 200, {profile: admin}]
+ - [admin_product_new_component, 200, {profile: admin}]
+
+ #
+ # Product Variants
+ #
+ - [[admin_product_variant_list_component, {productId: 1}], 200, {profile: admin}]
+ - [[admin_product_variant_edit, {productId: 1, id:1}], 200, {profile: admin}]
+ - [[admin_product_variant_edit_component, {productId: 1, id:1}], 200, {profile: admin}]
+ - [[admin_product_variant_new, {productId: 1}], 200, {profile: admin}]
+ - [[admin_product_variant_new_component, {productId: 1}], 200, {profile: admin}]
+
+ #
+ # Attributes
+ #
+ - [admin_attribute_list, 200, {profile: admin}]
+ - [admin_attribute_new, 200, {profile: admin}]
+ - [admin_attribute_list_component, 200, {profile: admin}]
+ - [admin_attribute_new_component, 200, {profile: admin}]
+ - [[admin_attribute_edit, {id: 1}], 200, {profile: admin}]
+
+ #
+ # Categories
+ #
+ - [admin_category_list, 200, {profile: admin}]
+ - [admin_category_list_component, 200, {profile: admin}]
+ - [[admin_category_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_category_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_category_new, 200, {profile: admin}]
+ - [admin_category_new_component, 200, {profile: admin}]
+
+ #
+ # Manufacturers
+ #
+ - [admin_manufacturer_list, 200, {profile: admin}]
+ - [admin_manufacturer_list_component, 200, {profile: admin}]
+ - [[admin_manufacturer_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_manufacturer_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_manufacturer_new, 200, {profile: admin}]
+ - [admin_manufacturer_new_component, 200, {profile: admin}]
+
+ #
+ # Carriers
+ #
+ - [admin_carrier_list, 200, {profile: admin}]
+ - [admin_carrier_list_component, 200, {profile: admin}]
+ - [[admin_carrier_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_carrier_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_carrier_new, 200, {profile: admin}]
+ - [admin_carrier_new_component, 200, {profile: admin}]
+
+ #
+ # Currencies
+ #
+ - [admin_currency_list_component, 200, {profile: admin}]
+ - [admin_currency_nav, 200, {profile: admin}]
+ - [admin_currency_list, 200, {profile: admin}]
+
+ #
+ # Shipping Ranges
+ #
+ - [[admin_shipping_range_list_component, {carrierId: 1}], 200, {profile: admin}]
+ - [[admin_shipping_range_edit_component, {carrierId: 1, id: 2}], 200, {profile: admin}]
+ - [[admin_shipping_range_new_component, {carrierId: 1}], 200, {profile: admin}]
+ - [[admin_shipping_range_edit, {carrierId: 1, id: 2}], 200, {profile: admin}]
+ - [[admin_shipping_range_new, {carrierId: 1}], 200, {profile: admin}]
+
+ #
+ # Images
+ #
+ - [admin_image_list_component, 200, {profile: admin}]
+ - [admin_image_list, 200, {profile: admin}]
+
+ #
+ # Blog, Emails & Pages
+ #
+ - [admin_blog_post_list, 200, {profile: admin}]
+ - [admin_blog_post_list_component, 200, {profile: admin}]
+ - [[admin_blog_post_edit, {id: 1}], 200, {profile: admin}]
+ - [[admin_blog_post_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_blog_post_new, 200, {profile: admin}]
+ - [admin_blog_post_new_component, 200, {profile: admin}]
+ - [admin_email_list_component, 200, {profile: admin}]
+ - [admin_page_list_component, 200, {profile: admin}]
+ - [[admin_page_edit_component, {id: 1}], 200, {profile: admin}]
+ - [admin_page_new_component, 200, {profile: admin}]
+ - [[admin_email_edit, {id: 4}], 200, {profile: admin}]
+ - [admin_email_list, 200, {profile: admin}]
+ - [admin_page_list, 200, {profile: admin}]
+ - [[admin_page_edit, {id: 1}], 200, {profile: admin}]
+ - [admin_page_new, 200, {profile: admin}]
+
+ #
+ # Metrics & Reports
+ #
+ - [admin_metric_panel_today, 200, {profile: admin}]
+ - [admin_metric_panel_yesterday, 200, {profile: admin}]
+ - [admin_metric_panel_last_week, 200, {profile: admin}]
+ - [admin_metric_panel_last_month, 200, {profile: admin}]
+ - [admin_metric_panel_last_quarter, 200, {profile: admin}]
+
+ - [admin_reports_today, 200, {profile: admin}]
+ - [admin_reports_yesterday, 200, {profile: admin}]
+ - [admin_reports_last_week, 200, {profile: admin}]
+ - [admin_reports_last_month, 200, {profile: admin}]
+ - [admin_reports_last_quarter, 200, {profile: admin}]
+
+ #
+ # Languages
+ #
+ - [admin_language_list_component, 200, {profile: admin}]
+ - [admin_language_list, 200, {profile: admin}]
+
+ #
+ # Miscelania
+ #
+ - [admin_configuration_list, 200, {profile: admin}]
+ - [admin_homepage, 302, {profile: admin}]
+ - [admin_payment_configuration_list, 200, {profile: admin}]
+ - [admin_template_list, 200, {profile: admin}]
+ - [admin_plugin_list, 200, {profile: admin}]
+ - [admin_store_setup_wizard, 200, {profile: admin}]
+