From f46784b751c7c85dd4c11d992e15499c7bfef9a9 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Tue, 14 Nov 2017 01:52:26 +0800 Subject: [PATCH 01/31] Make origin toolbar legacy --- libraries/classmap.php | 24 +++++++++---------- .../{Button => Legacy}/ConfirmButton.php | 6 ++--- .../{Button => Legacy}/CustomButton.php | 6 ++--- .../Toolbar/{Button => Legacy}/HelpButton.php | 6 ++--- .../Toolbar/{Button => Legacy}/LinkButton.php | 6 ++--- .../{Button => Legacy}/PopupButton.php | 6 ++--- .../{Button => Legacy}/SeparatorButton.php | 8 +++---- .../{Button => Legacy}/SliderButton.php | 6 ++--- .../{Button => Legacy}/StandardButton.php | 6 ++--- ...lbarButton.php => LegacyToolbarButton.php} | 2 +- .../cms/toolbar/JToolbarButtonTest.php | 2 +- 11 files changed, 39 insertions(+), 39 deletions(-) rename libraries/src/Toolbar/{Button => Legacy}/ConfirmButton.php (96%) rename libraries/src/Toolbar/{Button => Legacy}/CustomButton.php (89%) rename libraries/src/Toolbar/{Button => Legacy}/HelpButton.php (95%) rename libraries/src/Toolbar/{Button => Legacy}/LinkButton.php (93%) rename libraries/src/Toolbar/{Button => Legacy}/PopupButton.php (96%) rename libraries/src/Toolbar/{Button => Legacy}/SeparatorButton.php (88%) rename libraries/src/Toolbar/{Button => Legacy}/SliderButton.php (95%) rename libraries/src/Toolbar/{Button => Legacy}/StandardButton.php (96%) rename libraries/src/Toolbar/{ToolbarButton.php => LegacyToolbarButton.php} (98%) diff --git a/libraries/classmap.php b/libraries/classmap.php index 492e362e9f2bc..b62c095e4d68e 100644 --- a/libraries/classmap.php +++ b/libraries/classmap.php @@ -153,18 +153,18 @@ JLoader::registerAlias('JUcmType', '\\Joomla\\CMS\\UCM\\UCMType', '5.0'); JLoader::registerAlias('JToolbar', '\\Joomla\\CMS\\Toolbar\\Toolbar', '5.0'); -JLoader::registerAlias('JToolbarButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); -JLoader::registerAlias('JToolbarButtonConfirm', '\\Joomla\\CMS\\Toolbar\\Button\\ConfirmButton', '5.0'); -JLoader::registerAlias('JToolbarButtonCustom', '\\Joomla\\CMS\\Toolbar\\Button\\CustomButton', '5.0'); -JLoader::registerAlias('JToolbarButtonHelp', '\\Joomla\\CMS\\Toolbar\\Button\\HelpButton', '5.0'); -JLoader::registerAlias('JToolbarButtonLink', '\\Joomla\\CMS\\Toolbar\\Button\\LinkButton', '5.0'); -JLoader::registerAlias('JToolbarButtonPopup', '\\Joomla\\CMS\\Toolbar\\Button\\PopupButton', '5.0'); -JLoader::registerAlias('JToolbarButtonSeparator', '\\Joomla\\CMS\\Toolbar\\Button\\SeparatorButton', '5.0'); -JLoader::registerAlias('JToolbarButtonSlider', '\\Joomla\\CMS\\Toolbar\\Button\\SliderButton', '5.0'); -JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Button\\StandardButton', '5.0'); -JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Button\\StandardButton', '5.0'); -JLoader::registerAlias('JToolbarHelper', '\\Joomla\\CMS\\Toolbar\\ToolbarHelper', '5.0'); -JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); +JLoader::registerAlias('JToolBar', '\\Joomla\\CMS\\Toolbar\\Toolbar', '5.0'); +JLoader::registerAlias('JToolbarButton', '\\Joomla\\CMS\\Toolbar\\LegacyToolbarButton', '5.0'); +JLoader::registerAlias('JToolbarButtonConfirm', '\\Joomla\\CMS\\Toolbar\\Legacy\\ConfirmButton', '5.0'); +JLoader::registerAlias('JToolbarButtonCustom', '\\Joomla\\CMS\\Toolbar\\Legacy\\CustomButton', '5.0'); +JLoader::registerAlias('JToolbarButtonHelp', '\\Joomla\\CMS\\Toolbar\\Legacy\\HelpButton', '5.0'); +JLoader::registerAlias('JToolbarButtonLink', '\\Joomla\\CMS\\Toolbar\\Legacy\\LinkButton', '5.0'); +JLoader::registerAlias('JToolbarButtonPopup', '\\Joomla\\CMS\\Toolbar\\Legacy\\PopupButton', '5.0'); +JLoader::registerAlias('JToolbarButtonSeparator', '\\Joomla\\CMS\\Toolbar\\Legacy\\SeparatorButton', '5.0'); +JLoader::registerAlias('JToolbarButtonSlider', '\\Joomla\\CMS\\Toolbar\\Legacy\\SliderButton', '5.0'); +JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Legacy\\StandardButton', '5.0'); +JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Legacy\\StandardButton', '5.0'); +JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\LegacyToolbarButton', '5.0'); JLoader::registerAlias('JVersion', '\\Joomla\\CMS\\Version', '5.0'); diff --git a/libraries/src/Toolbar/Button/ConfirmButton.php b/libraries/src/Toolbar/Legacy/ConfirmButton.php similarity index 96% rename from libraries/src/Toolbar/Button/ConfirmButton.php rename to libraries/src/Toolbar/Legacy/ConfirmButton.php index 85de0fd3ec3db..50e0f43231eac 100644 --- a/libraries/src/Toolbar/Button/ConfirmButton.php +++ b/libraries/src/Toolbar/Legacy/ConfirmButton.php @@ -6,19 +6,19 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a standard button with a confirm dialog * * @since 3.0 */ -class ConfirmButton extends ToolbarButton +class ConfirmButton extends LegacyToolbarButton { /** * Button type diff --git a/libraries/src/Toolbar/Button/CustomButton.php b/libraries/src/Toolbar/Legacy/CustomButton.php similarity index 89% rename from libraries/src/Toolbar/Button/CustomButton.php rename to libraries/src/Toolbar/Legacy/CustomButton.php index 0ff5f0cb8dc90..b0696ea768175 100644 --- a/libraries/src/Toolbar/Button/CustomButton.php +++ b/libraries/src/Toolbar/Legacy/CustomButton.php @@ -6,18 +6,18 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a custom button * * @since 3.0 */ -class CustomButton extends ToolbarButton +class CustomButton extends LegacyToolbarButton { /** * Button type diff --git a/libraries/src/Toolbar/Button/HelpButton.php b/libraries/src/Toolbar/Legacy/HelpButton.php similarity index 95% rename from libraries/src/Toolbar/Button/HelpButton.php rename to libraries/src/Toolbar/Legacy/HelpButton.php index e82075e1d47f3..ca93a72789e67 100644 --- a/libraries/src/Toolbar/Button/HelpButton.php +++ b/libraries/src/Toolbar/Legacy/HelpButton.php @@ -6,20 +6,20 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Help\Help; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a help popup window button * * @since 3.0 */ -class HelpButton extends ToolbarButton +class HelpButton extends LegacyToolbarButton { /** * @var string Button type diff --git a/libraries/src/Toolbar/Button/LinkButton.php b/libraries/src/Toolbar/Legacy/LinkButton.php similarity index 93% rename from libraries/src/Toolbar/Button/LinkButton.php rename to libraries/src/Toolbar/Legacy/LinkButton.php index 1038f839f7052..92e8d1ca5d7f9 100644 --- a/libraries/src/Toolbar/Button/LinkButton.php +++ b/libraries/src/Toolbar/Legacy/LinkButton.php @@ -6,19 +6,19 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a link button * * @since 3.0 */ -class LinkButton extends ToolbarButton +class LinkButton extends LegacyToolbarButton { /** * Button type diff --git a/libraries/src/Toolbar/Button/PopupButton.php b/libraries/src/Toolbar/Legacy/PopupButton.php similarity index 96% rename from libraries/src/Toolbar/Button/PopupButton.php rename to libraries/src/Toolbar/Legacy/PopupButton.php index 8b39af13a78c6..76011e426b21e 100644 --- a/libraries/src/Toolbar/Button/PopupButton.php +++ b/libraries/src/Toolbar/Legacy/PopupButton.php @@ -6,19 +6,19 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a modal window button * * @since 3.0 */ -class PopupButton extends ToolbarButton +class PopupButton extends LegacyToolbarButton { /** * Button type diff --git a/libraries/src/Toolbar/Button/SeparatorButton.php b/libraries/src/Toolbar/Legacy/SeparatorButton.php similarity index 88% rename from libraries/src/Toolbar/Button/SeparatorButton.php rename to libraries/src/Toolbar/Legacy/SeparatorButton.php index ce0e7a5fc4859..8447e0cc0d9be 100644 --- a/libraries/src/Toolbar/Button/SeparatorButton.php +++ b/libraries/src/Toolbar/Legacy/SeparatorButton.php @@ -6,19 +6,19 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a button separator * * @since 3.0 */ -class SeparatorButton extends ToolbarButton +class SeparatorButton extends LegacyToolbarButton { /** * Button type @@ -34,7 +34,7 @@ class SeparatorButton extends ToolbarButton * * @return string The HTML for the separator * - * @see ToolbarButton::render() + * @see LegacyToolbarButton::render() * @since 3.0 */ public function render(&$definition) diff --git a/libraries/src/Toolbar/Button/SliderButton.php b/libraries/src/Toolbar/Legacy/SliderButton.php similarity index 95% rename from libraries/src/Toolbar/Button/SliderButton.php rename to libraries/src/Toolbar/Legacy/SliderButton.php index 47d5a73d4ff00..a3b8fbfbd1813 100644 --- a/libraries/src/Toolbar/Button/SliderButton.php +++ b/libraries/src/Toolbar/Legacy/SliderButton.php @@ -6,19 +6,19 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a button to render an HTML element in a slider container * * @since 3.0 */ -class SliderButton extends ToolbarButton +class SliderButton extends LegacyToolbarButton { /** * Button type diff --git a/libraries/src/Toolbar/Button/StandardButton.php b/libraries/src/Toolbar/Legacy/StandardButton.php similarity index 96% rename from libraries/src/Toolbar/Button/StandardButton.php rename to libraries/src/Toolbar/Legacy/StandardButton.php index 6c7c1842a76c6..0e93cd3418872 100644 --- a/libraries/src/Toolbar/Button/StandardButton.php +++ b/libraries/src/Toolbar/Legacy/StandardButton.php @@ -6,19 +6,19 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Toolbar\LegacyToolbarButton; /** * Renders a standard button * * @since 3.0 */ -class StandardButton extends ToolbarButton +class StandardButton extends LegacyToolbarButton { /** * Button type diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/LegacyToolbarButton.php similarity index 98% rename from libraries/src/Toolbar/ToolbarButton.php rename to libraries/src/Toolbar/LegacyToolbarButton.php index 45e6c3e98de87..d34cbb8c6cc21 100644 --- a/libraries/src/Toolbar/ToolbarButton.php +++ b/libraries/src/Toolbar/LegacyToolbarButton.php @@ -19,7 +19,7 @@ * * @since 3.0 */ -abstract class ToolbarButton +abstract class LegacyToolbarButton { /** * element name diff --git a/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php b/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php index 22153684ad18a..fc164d8f03458 100644 --- a/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php +++ b/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php @@ -91,7 +91,7 @@ public function test__construct() { $this->assertThat( new JToolbarButtonStandard($this->toolbar), - $this->isInstanceOf('Joomla\\CMS\\Toolbar\\ToolbarButton') + $this->isInstanceOf('Joomla\\CMS\\Toolbar\\LegacyToolbarButton') ); } From 820e0388b484808defa5fbf0a795078e118589dd Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Tue, 14 Nov 2017 02:14:16 +0800 Subject: [PATCH 02/31] Make origin toolbar legacy --- libraries/classmap.php | 2 +- .../Toolbar/ContainerAwareToolbarFactory.php | 6 ++-- libraries/src/Toolbar/Toolbar.php | 2 +- .../src/Toolbar/ToolbarFactoryInterface.php | 4 +-- .../vendor/composer/autoload_classmap.php | 22 ++++++-------- libraries/vendor/composer/autoload_files.php | 2 +- libraries/vendor/composer/autoload_psr4.php | 1 - libraries/vendor/composer/autoload_static.php | 29 +++++++------------ 8 files changed, 27 insertions(+), 41 deletions(-) diff --git a/libraries/classmap.php b/libraries/classmap.php index b62c095e4d68e..b93752c1610a4 100644 --- a/libraries/classmap.php +++ b/libraries/classmap.php @@ -163,7 +163,7 @@ JLoader::registerAlias('JToolbarButtonSeparator', '\\Joomla\\CMS\\Toolbar\\Legacy\\SeparatorButton', '5.0'); JLoader::registerAlias('JToolbarButtonSlider', '\\Joomla\\CMS\\Toolbar\\Legacy\\SliderButton', '5.0'); JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Legacy\\StandardButton', '5.0'); -JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Legacy\\StandardButton', '5.0'); +JLoader::registerAlias('JToolbarHelper', '\\Joomla\\CMS\\Toolbar\\ToolbarHelper', '5.0'); JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\LegacyToolbarButton', '5.0'); JLoader::registerAlias('JVersion', '\\Joomla\\CMS\\Version', '5.0'); diff --git a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php index 247ab1590b7a3..391f102889718 100644 --- a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php +++ b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php @@ -28,12 +28,12 @@ class ContainerAwareToolbarFactory implements ToolbarFactoryInterface, Container * @param Toolbar $toolbar The Toolbar instance to attach to the button * @param string $type Button Type * - * @return ToolbarButton + * @return LegacyToolbarButton * * @since 3.8.0 * @throws \InvalidArgumentException */ - public function createButton(Toolbar $toolbar, string $type): ToolbarButton + public function createButton(Toolbar $toolbar, string $type): LegacyToolbarButton { $buttonClass = $this->loadButtonClass($type); @@ -97,7 +97,7 @@ public function createToolbar(string $name = 'toolbar'): Toolbar private function loadButtonClass(string $type) { $buttonClasses = [ - 'Joomla\\CMS\\Toolbar\\Button\\' . ucfirst($type) . 'Button', + 'Joomla\\CMS\\Toolbar\\Legacy\\' . ucfirst($type) . 'Button', // @deprecated 5.0 'JToolbarButton' . ucfirst($type), ]; diff --git a/libraries/src/Toolbar/Toolbar.php b/libraries/src/Toolbar/Toolbar.php index e5b6d33f3fcdf..8cfe293727f4f 100644 --- a/libraries/src/Toolbar/Toolbar.php +++ b/libraries/src/Toolbar/Toolbar.php @@ -263,7 +263,7 @@ public function loadButtonType($type, $new = false) return $this->_buttons[$signature]; } - if (!class_exists('Joomla\\CMS\\Toolbar\\ToolbarButton')) + if (!class_exists('Joomla\\CMS\\Toolbar\\LegacyToolbarButton')) { \JLog::add(\JText::_('JLIB_HTML_BUTTON_BASE_CLASS'), \JLog::WARNING, 'jerror'); diff --git a/libraries/src/Toolbar/ToolbarFactoryInterface.php b/libraries/src/Toolbar/ToolbarFactoryInterface.php index 24d50bbd429db..4f6ab131c7ec3 100644 --- a/libraries/src/Toolbar/ToolbarFactoryInterface.php +++ b/libraries/src/Toolbar/ToolbarFactoryInterface.php @@ -23,12 +23,12 @@ interface ToolbarFactoryInterface * @param Toolbar $toolbar The Toolbar instance to attach to the button * @param string $type Button Type * - * @return ToolbarButton + * @return LegacyToolbarButton * * @since __DEPLOY_VERSION__ * @throws \InvalidArgumentException */ - public function createButton(Toolbar $toolbar, string $type): ToolbarButton; + public function createButton(Toolbar $toolbar, string $type): LegacyToolbarButton; /** * Creates a new Toolbar object. diff --git a/libraries/vendor/composer/autoload_classmap.php b/libraries/vendor/composer/autoload_classmap.php index 019c8a21fc3b8..e5ea8b8f4ca1e 100644 --- a/libraries/vendor/composer/autoload_classmap.php +++ b/libraries/vendor/composer/autoload_classmap.php @@ -486,17 +486,17 @@ 'Joomla\\CMS\\Table\\Usergroup' => $baseDir . '/libraries/src/Table/Usergroup.php', 'Joomla\\CMS\\Table\\ViewLevel' => $baseDir . '/libraries/src/Table/ViewLevel.php', 'Joomla\\CMS\\Toolbar\\Button\\ApplyButton' => $baseDir . '/libraries/src/Toolbar/Button/ApplyButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\ConfirmButton' => $baseDir . '/libraries/src/Toolbar/Button/ConfirmButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\CustomButton' => $baseDir . '/libraries/src/Toolbar/Button/CustomButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\HelpButton' => $baseDir . '/libraries/src/Toolbar/Button/HelpButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\LinkButton' => $baseDir . '/libraries/src/Toolbar/Button/LinkButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\PopupButton' => $baseDir . '/libraries/src/Toolbar/Button/PopupButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\SeparatorButton' => $baseDir . '/libraries/src/Toolbar/Button/SeparatorButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\SliderButton' => $baseDir . '/libraries/src/Toolbar/Button/SliderButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\StandardButton' => $baseDir . '/libraries/src/Toolbar/Button/StandardButton.php', 'Joomla\\CMS\\Toolbar\\ContainerAwareToolbarFactory' => $baseDir . '/libraries/src/Toolbar/ContainerAwareToolbarFactory.php', + 'Joomla\\CMS\\Toolbar\\LegacyToolbarButton' => $baseDir . '/libraries/src/Toolbar/LegacyToolbarButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\ConfirmButton' => $baseDir . '/libraries/src/Toolbar/Legacy/ConfirmButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\CustomButton' => $baseDir . '/libraries/src/Toolbar/Legacy/CustomButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\HelpButton' => $baseDir . '/libraries/src/Toolbar/Legacy/HelpButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\LinkButton' => $baseDir . '/libraries/src/Toolbar/Legacy/LinkButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\PopupButton' => $baseDir . '/libraries/src/Toolbar/Legacy/PopupButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\SeparatorButton' => $baseDir . '/libraries/src/Toolbar/Legacy/SeparatorButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\SliderButton' => $baseDir . '/libraries/src/Toolbar/Legacy/SliderButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\StandardButton' => $baseDir . '/libraries/src/Toolbar/Legacy/StandardButton.php', 'Joomla\\CMS\\Toolbar\\Toolbar' => $baseDir . '/libraries/src/Toolbar/Toolbar.php', - 'Joomla\\CMS\\Toolbar\\ToolbarButton' => $baseDir . '/libraries/src/Toolbar/ToolbarButton.php', 'Joomla\\CMS\\Toolbar\\ToolbarFactoryInterface' => $baseDir . '/libraries/src/Toolbar/ToolbarFactoryInterface.php', 'Joomla\\CMS\\Toolbar\\ToolbarHelper' => $baseDir . '/libraries/src/Toolbar/ToolbarHelper.php', 'Joomla\\CMS\\UCM\\UCM' => $baseDir . '/libraries/src/UCM/UCM.php', @@ -642,7 +642,6 @@ 'Joomla\\Input\\Input' => $vendorDir . '/joomla/input/src/Input.php', 'Joomla\\Input\\Json' => $vendorDir . '/joomla/input/src/Json.php', 'Joomla\\Ldap\\LdapClient' => $vendorDir . '/joomla/ldap/src/LdapClient.php', - 'Joomla\\Ldap\\Tests\\LdapClientTest' => $vendorDir . '/joomla/ldap/Tests/LdapClientTest.php', 'Joomla\\OAuth1\\Client' => $vendorDir . '/joomla/oauth1/src/Client.php', 'Joomla\\OAuth2\\Client' => $vendorDir . '/joomla/oauth2/src/Client.php', 'Joomla\\Registry\\Factory' => $vendorDir . '/joomla/registry/src/Factory.php', @@ -710,8 +709,6 @@ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', - 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', - 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'ReCaptcha\\ReCaptcha' => $vendorDir . '/google/recaptcha/src/ReCaptcha/ReCaptcha.php', 'ReCaptcha\\RequestMethod' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod.php', 'ReCaptcha\\RequestMethod\\Curl' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod/Curl.php', @@ -739,7 +736,6 @@ 'Symfony\\Polyfill\\Util\\Binary' => $vendorDir . '/symfony/polyfill-util/Binary.php', 'Symfony\\Polyfill\\Util\\BinaryNoFuncOverload' => $vendorDir . '/symfony/polyfill-util/BinaryNoFuncOverload.php', 'Symfony\\Polyfill\\Util\\BinaryOnFuncOverload' => $vendorDir . '/symfony/polyfill-util/BinaryOnFuncOverload.php', - 'Symfony\\Polyfill\\Util\\TestListener' => $vendorDir . '/symfony/polyfill-util/TestListener.php', 'Zend\\Diactoros\\AbstractSerializer' => $vendorDir . '/zendframework/zend-diactoros/src/AbstractSerializer.php', 'Zend\\Diactoros\\CallbackStream' => $vendorDir . '/zendframework/zend-diactoros/src/CallbackStream.php', 'Zend\\Diactoros\\Exception\\DeprecatedMethodException' => $vendorDir . '/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php', diff --git a/libraries/vendor/composer/autoload_files.php b/libraries/vendor/composer/autoload_files.php index d85e68bf81b47..41d02e2eaeb9e 100644 --- a/libraries/vendor/composer/autoload_files.php +++ b/libraries/vendor/composer/autoload_files.php @@ -22,7 +22,7 @@ '4292e2fa66516089e6006723267587b4' => $vendorDir . '/joomla/string/src/phputf8/utils/ascii.php', '87465e33b7551b401bf051928f220e9a' => $vendorDir . '/joomla/string/src/phputf8/utils/validation.php', '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php', + 'bd9634f2d41831496de0d3dfe4c94881' => $vendorDir . '/symfony/polyfill-php56/bootstrap.php', 'e40631d46120a9c38ea139981f8dab26' => $vendorDir . '/ircmaxell/password-compat/lib/password.php', '3109cb1a231dcd04bee1f9f620d46975' => $vendorDir . '/paragonie/sodium_compat/autoload.php', - 'bd9634f2d41831496de0d3dfe4c94881' => $vendorDir . '/symfony/polyfill-php56/bootstrap.php', ); diff --git a/libraries/vendor/composer/autoload_psr4.php b/libraries/vendor/composer/autoload_psr4.php index 285a429e8ee94..f6646854d1616 100644 --- a/libraries/vendor/composer/autoload_psr4.php +++ b/libraries/vendor/composer/autoload_psr4.php @@ -24,7 +24,6 @@ 'Joomla\\Registry\\' => array($vendorDir . '/joomla/registry/src'), 'Joomla\\OAuth2\\' => array($vendorDir . '/joomla/oauth2/src'), 'Joomla\\OAuth1\\' => array($vendorDir . '/joomla/oauth1/src'), - 'Joomla\\Ldap\\Tests\\' => array($vendorDir . '/joomla/ldap/Tests'), 'Joomla\\Ldap\\' => array($vendorDir . '/joomla/ldap/src'), 'Joomla\\Input\\Tests\\' => array($vendorDir . '/joomla/input/Tests'), 'Joomla\\Input\\' => array($vendorDir . '/joomla/input/src'), diff --git a/libraries/vendor/composer/autoload_static.php b/libraries/vendor/composer/autoload_static.php index 69e8609ed0968..b18957b2854e7 100644 --- a/libraries/vendor/composer/autoload_static.php +++ b/libraries/vendor/composer/autoload_static.php @@ -23,9 +23,9 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 '4292e2fa66516089e6006723267587b4' => __DIR__ . '/..' . '/joomla/string/src/phputf8/utils/ascii.php', '87465e33b7551b401bf051928f220e9a' => __DIR__ . '/..' . '/joomla/string/src/phputf8/utils/validation.php', '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php', + 'bd9634f2d41831496de0d3dfe4c94881' => __DIR__ . '/..' . '/symfony/polyfill-php56/bootstrap.php', 'e40631d46120a9c38ea139981f8dab26' => __DIR__ . '/..' . '/ircmaxell/password-compat/lib/password.php', '3109cb1a231dcd04bee1f9f620d46975' => __DIR__ . '/..' . '/paragonie/sodium_compat/autoload.php', - 'bd9634f2d41831496de0d3dfe4c94881' => __DIR__ . '/..' . '/symfony/polyfill-php56/bootstrap.php', ); public static $prefixLengthsPsr4 = array ( @@ -61,7 +61,6 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 'Joomla\\Registry\\' => 16, 'Joomla\\OAuth2\\' => 14, 'Joomla\\OAuth1\\' => 14, - 'Joomla\\Ldap\\Tests\\' => 18, 'Joomla\\Ldap\\' => 12, 'Joomla\\Input\\Tests\\' => 19, 'Joomla\\Input\\' => 13, @@ -167,10 +166,6 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 array ( 0 => __DIR__ . '/..' . '/joomla/oauth1/src', ), - 'Joomla\\Ldap\\Tests\\' => - array ( - 0 => __DIR__ . '/..' . '/joomla/ldap/Tests', - ), 'Joomla\\Ldap\\' => array ( 0 => __DIR__ . '/..' . '/joomla/ldap/src', @@ -734,17 +729,17 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 'Joomla\\CMS\\Table\\Usergroup' => __DIR__ . '/../../..' . '/libraries/src/Table/Usergroup.php', 'Joomla\\CMS\\Table\\ViewLevel' => __DIR__ . '/../../..' . '/libraries/src/Table/ViewLevel.php', 'Joomla\\CMS\\Toolbar\\Button\\ApplyButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/ApplyButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\ConfirmButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/ConfirmButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\CustomButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/CustomButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\HelpButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/HelpButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\LinkButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/LinkButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\PopupButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/PopupButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\SeparatorButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/SeparatorButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\SliderButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/SliderButton.php', - 'Joomla\\CMS\\Toolbar\\Button\\StandardButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Button/StandardButton.php', 'Joomla\\CMS\\Toolbar\\ContainerAwareToolbarFactory' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/ContainerAwareToolbarFactory.php', + 'Joomla\\CMS\\Toolbar\\LegacyToolbarButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/LegacyToolbarButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\ConfirmButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/ConfirmButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\CustomButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/CustomButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\HelpButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/HelpButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\LinkButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/LinkButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\PopupButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/PopupButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\SeparatorButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/SeparatorButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\SliderButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/SliderButton.php', + 'Joomla\\CMS\\Toolbar\\Legacy\\StandardButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Legacy/StandardButton.php', 'Joomla\\CMS\\Toolbar\\Toolbar' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/Toolbar.php', - 'Joomla\\CMS\\Toolbar\\ToolbarButton' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/ToolbarButton.php', 'Joomla\\CMS\\Toolbar\\ToolbarFactoryInterface' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/ToolbarFactoryInterface.php', 'Joomla\\CMS\\Toolbar\\ToolbarHelper' => __DIR__ . '/../../..' . '/libraries/src/Toolbar/ToolbarHelper.php', 'Joomla\\CMS\\UCM\\UCM' => __DIR__ . '/../../..' . '/libraries/src/UCM/UCM.php', @@ -890,7 +885,6 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 'Joomla\\Input\\Input' => __DIR__ . '/..' . '/joomla/input/src/Input.php', 'Joomla\\Input\\Json' => __DIR__ . '/..' . '/joomla/input/src/Json.php', 'Joomla\\Ldap\\LdapClient' => __DIR__ . '/..' . '/joomla/ldap/src/LdapClient.php', - 'Joomla\\Ldap\\Tests\\LdapClientTest' => __DIR__ . '/..' . '/joomla/ldap/Tests/LdapClientTest.php', 'Joomla\\OAuth1\\Client' => __DIR__ . '/..' . '/joomla/oauth1/src/Client.php', 'Joomla\\OAuth2\\Client' => __DIR__ . '/..' . '/joomla/oauth2/src/Client.php', 'Joomla\\Registry\\Factory' => __DIR__ . '/..' . '/joomla/registry/src/Factory.php', @@ -958,8 +952,6 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', - 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', - 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'ReCaptcha\\ReCaptcha' => __DIR__ . '/..' . '/google/recaptcha/src/ReCaptcha/ReCaptcha.php', 'ReCaptcha\\RequestMethod' => __DIR__ . '/..' . '/google/recaptcha/src/ReCaptcha/RequestMethod.php', 'ReCaptcha\\RequestMethod\\Curl' => __DIR__ . '/..' . '/google/recaptcha/src/ReCaptcha/RequestMethod/Curl.php', @@ -987,7 +979,6 @@ class ComposerStaticInit74ef86c5f34c77e33c93ad0a7df1d823 'Symfony\\Polyfill\\Util\\Binary' => __DIR__ . '/..' . '/symfony/polyfill-util/Binary.php', 'Symfony\\Polyfill\\Util\\BinaryNoFuncOverload' => __DIR__ . '/..' . '/symfony/polyfill-util/BinaryNoFuncOverload.php', 'Symfony\\Polyfill\\Util\\BinaryOnFuncOverload' => __DIR__ . '/..' . '/symfony/polyfill-util/BinaryOnFuncOverload.php', - 'Symfony\\Polyfill\\Util\\TestListener' => __DIR__ . '/..' . '/symfony/polyfill-util/TestListener.php', 'Zend\\Diactoros\\AbstractSerializer' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/AbstractSerializer.php', 'Zend\\Diactoros\\CallbackStream' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/CallbackStream.php', 'Zend\\Diactoros\\Exception\\DeprecatedMethodException' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php', From 0d79c8225df835ca3f41bfb9b92444395dc9c3b4 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Thu, 1 Feb 2018 11:26:35 +0800 Subject: [PATCH 03/31] wip new classes --- .../com_content/View/Articles/HtmlView.php | 12 +- libraries/classmap.php | 4 +- .../src/Toolbar/Button/StandardButton.php | 143 +++++++ .../Toolbar/ContainerAwareToolbarFactory.php | 4 +- .../{Button => Legacy}/ApplyButton.php | 4 +- .../src/Toolbar/Legacy/ConfirmButton.php | 6 +- libraries/src/Toolbar/Legacy/CustomButton.php | 6 +- libraries/src/Toolbar/Legacy/HelpButton.php | 6 +- libraries/src/Toolbar/Legacy/LinkButton.php | 6 +- libraries/src/Toolbar/Legacy/PopupButton.php | 6 +- .../src/Toolbar/Legacy/SeparatorButton.php | 6 +- libraries/src/Toolbar/Legacy/SliderButton.php | 6 +- .../src/Toolbar/Legacy/StandardButton.php | 76 +++- libraries/src/Toolbar/LegacyToolbarButton.php | 116 ------ libraries/src/Toolbar/Toolbar.php | 60 ++- libraries/src/Toolbar/ToolbarButton.php | 372 ++++++++++++++++++ .../src/Toolbar/ToolbarFactoryInterface.php | 4 +- .../cms/toolbar/JToolbarButtonTest.php | 2 +- 18 files changed, 670 insertions(+), 169 deletions(-) create mode 100644 libraries/src/Toolbar/Button/StandardButton.php rename libraries/src/Toolbar/{Button => Legacy}/ApplyButton.php (97%) delete mode 100644 libraries/src/Toolbar/LegacyToolbarButton.php create mode 100644 libraries/src/Toolbar/ToolbarButton.php diff --git a/administrator/components/com_content/View/Articles/HtmlView.php b/administrator/components/com_content/View/Articles/HtmlView.php index e0a3052c3152c..461085ffef52f 100644 --- a/administrator/components/com_content/View/Articles/HtmlView.php +++ b/administrator/components/com_content/View/Articles/HtmlView.php @@ -12,6 +12,9 @@ defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; +use Joomla\CMS\Toolbar\Legacy\StandardButton; +use Joomla\CMS\Toolbar\Toolbar; +use Joomla\CMS\Toolbar\ToolbarHelper; use Joomla\Component\Content\Administrator\Helper\ContentHelper; /** @@ -154,13 +157,18 @@ protected function addToolbar() $user = \JFactory::getUser(); // Get the toolbar object instance - $bar = \JToolbar::getInstance('toolbar'); + $bar = Toolbar::getInstance('toolbar'); + + $bar->appendButton(new StandardButton('new')) + ->task('article.add') + ->icon('new') + ->text('JTOOLBAR_NEW'); \JToolbarHelper::title(\JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article'); if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0) { - \JToolbarHelper::addNew('article.add'); + ToolbarHelper::addNew('article.add'); } if ($canDo->get('core.edit.state')) diff --git a/libraries/classmap.php b/libraries/classmap.php index 577829a4285ad..18976d84d5ad9 100644 --- a/libraries/classmap.php +++ b/libraries/classmap.php @@ -154,7 +154,7 @@ JLoader::registerAlias('JToolbar', '\\Joomla\\CMS\\Toolbar\\Toolbar', '5.0'); JLoader::registerAlias('JToolBar', '\\Joomla\\CMS\\Toolbar\\Toolbar', '5.0'); -JLoader::registerAlias('JToolbarButton', '\\Joomla\\CMS\\Toolbar\\LegacyToolbarButton', '5.0'); +JLoader::registerAlias('JToolbarButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); JLoader::registerAlias('JToolbarButtonConfirm', '\\Joomla\\CMS\\Toolbar\\Legacy\\ConfirmButton', '5.0'); JLoader::registerAlias('JToolbarButtonCustom', '\\Joomla\\CMS\\Toolbar\\Legacy\\CustomButton', '5.0'); JLoader::registerAlias('JToolbarButtonHelp', '\\Joomla\\CMS\\Toolbar\\Legacy\\HelpButton', '5.0'); @@ -164,7 +164,7 @@ JLoader::registerAlias('JToolbarButtonSlider', '\\Joomla\\CMS\\Toolbar\\Legacy\\SliderButton', '5.0'); JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Legacy\\StandardButton', '5.0'); JLoader::registerAlias('JToolbarHelper', '\\Joomla\\CMS\\Toolbar\\ToolbarHelper', '5.0'); -JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\LegacyToolbarButton', '5.0'); +JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); JLoader::registerAlias('JVersion', '\\Joomla\\CMS\\Version', '5.0'); diff --git a/libraries/src/Toolbar/Button/StandardButton.php b/libraries/src/Toolbar/Button/StandardButton.php new file mode 100644 index 0000000000000..1593ac3bacb6f --- /dev/null +++ b/libraries/src/Toolbar/Button/StandardButton.php @@ -0,0 +1,143 @@ +fetchIconClass($name); + $options['doTask'] = $this->_getCommand($options['text'], $task, $list); + $options['group'] = $group; + $options['id'] = $this->fetchId('Standard', $name); + $options['btnClass'] = 'button-' . $name; + + if ($options['id']) + { + $options['id'] = ' id="' . $options['id'] . '"'; + } + + switch ($name) + { + case 'apply': + case 'new': + $options['btnClass'] .= ' btn btn-sm btn-success'; + break; + + case 'save': + case 'save-new': + case 'save-copy': + case 'save-close': + case 'publish': + $options['btnClass'] .= ' btn btn-sm btn-outline-success'; + break; + + case 'unpublish': + $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; + break; + + case 'featured': + $options['btnClass'] .= ' btn btn-sm btn-outline-warning'; + break; + + case 'cancel': + $options['btnClass'] .= ' btn btn-sm btn-danger'; + break; + + case 'trash': + $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; + break; + + + default: + $options['btnClass'] .= ' btn btn-sm btn-outline-primary'; + } + + // Instantiate a new JLayoutFile instance and render the layout + $layout = new FileLayout('joomla.toolbar.standard'); + + return $layout->render($options); + } + + /** + * Get the button CSS Id + * + * @param string $type Unused string. + * @param string $name Name to be used as apart of the id + * @param string $text Button text + * @param string $task The task associated with the button + * @param boolean $list True to allow use of lists + * @param boolean $hideMenu True to hide the menu on click + * + * @return string Button CSS Id + * + * @since 3.0 + */ + public function fetchId($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) + { + return $this->parent->getName() . '-' . $name; + } + + /** + * Get the JavaScript command for the button + * + * @param string $name The task name as seen by the user + * @param string $task The task used by the application + * @param boolean $list True is requires a list confirmation. + * + * @return string JavaScript command string + * + * @since 3.0 + */ + protected function _getCommand($name, $task, $list) + { + \JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); + \JText::script('ERROR'); + + $cmd = "Joomla.submitbutton('" . $task . "');"; + + if ($list) + { + $messages = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; + $alert = "Joomla.renderMessages(" . $messages . ")"; + $cmd = "if (document.adminForm.boxchecked.value == 0) { " . $alert . " } else { " . $cmd . " }"; + } + + return $cmd; + } +} diff --git a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php index 82df98f9d5127..ad058a91e375d 100644 --- a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php +++ b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php @@ -28,12 +28,12 @@ class ContainerAwareToolbarFactory implements ToolbarFactoryInterface, Container * @param Toolbar $toolbar The Toolbar instance to attach to the button * @param string $type Button Type * - * @return LegacyToolbarButton + * @return ToolbarButton * * @since 3.8.0 * @throws \InvalidArgumentException */ - public function createButton(Toolbar $toolbar, string $type): LegacyToolbarButton + public function createButton(Toolbar $toolbar, string $type): ToolbarButton { $buttonClass = $this->loadButtonClass($type); diff --git a/libraries/src/Toolbar/Button/ApplyButton.php b/libraries/src/Toolbar/Legacy/ApplyButton.php similarity index 97% rename from libraries/src/Toolbar/Button/ApplyButton.php rename to libraries/src/Toolbar/Legacy/ApplyButton.php index 76d4089b0226c..c224e3a63c1f7 100644 --- a/libraries/src/Toolbar/Button/ApplyButton.php +++ b/libraries/src/Toolbar/Legacy/ApplyButton.php @@ -7,7 +7,7 @@ * @license GNU General Public License version 2 or later; see LICENSE */ -namespace Joomla\CMS\Toolbar\Button; +namespace Joomla\CMS\Toolbar\Legacy; defined('JPATH_PLATFORM') or die; @@ -87,7 +87,7 @@ public function fetchButton($type = 'Apply', $name = '', $text = '', $task = '', */ public function fetchId($type = 'Apply', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) { - return $this->_parent->getName() . '-' . $name; + return $this->parent->getName() . '-' . $name; } /** diff --git a/libraries/src/Toolbar/Legacy/ConfirmButton.php b/libraries/src/Toolbar/Legacy/ConfirmButton.php index 50e0f43231eac..8ca80a751a301 100644 --- a/libraries/src/Toolbar/Legacy/ConfirmButton.php +++ b/libraries/src/Toolbar/Legacy/ConfirmButton.php @@ -11,14 +11,14 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a standard button with a confirm dialog * * @since 3.0 */ -class ConfirmButton extends LegacyToolbarButton +class ConfirmButton extends ToolbarButton { /** * Button type @@ -80,7 +80,7 @@ public function fetchButton($type = 'Confirm', $msg = '', $name = '', $text = '' */ public function fetchId($type = 'Confirm', $msg = '', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) { - return $this->_parent->getName() . '-' . $name; + return $this->parent->getName() . '-' . $name; } /** diff --git a/libraries/src/Toolbar/Legacy/CustomButton.php b/libraries/src/Toolbar/Legacy/CustomButton.php index b0696ea768175..503bc916055dd 100644 --- a/libraries/src/Toolbar/Legacy/CustomButton.php +++ b/libraries/src/Toolbar/Legacy/CustomButton.php @@ -10,14 +10,14 @@ defined('JPATH_PLATFORM') or die; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a custom button * * @since 3.0 */ -class CustomButton extends LegacyToolbarButton +class CustomButton extends ToolbarButton { /** * Button type @@ -55,6 +55,6 @@ public function fetchButton($type = 'Custom', $html = '', $id = 'custom') */ public function fetchId($type = 'Custom', $html = '', $id = 'custom') { - return $this->_parent->getName() . '-' . $id; + return $this->parent->getName() . '-' . $id; } } diff --git a/libraries/src/Toolbar/Legacy/HelpButton.php b/libraries/src/Toolbar/Legacy/HelpButton.php index ca93a72789e67..111034316264c 100644 --- a/libraries/src/Toolbar/Legacy/HelpButton.php +++ b/libraries/src/Toolbar/Legacy/HelpButton.php @@ -12,14 +12,14 @@ use Joomla\CMS\Help\Help; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a help popup window button * * @since 3.0 */ -class HelpButton extends LegacyToolbarButton +class HelpButton extends ToolbarButton { /** * @var string Button type @@ -69,7 +69,7 @@ public function fetchButton($type = 'Help', $ref = '', $com = false, $override = */ public function fetchId() { - return $this->_parent->getName() . '-help'; + return $this->parent->getName() . '-help'; } /** diff --git a/libraries/src/Toolbar/Legacy/LinkButton.php b/libraries/src/Toolbar/Legacy/LinkButton.php index 92e8d1ca5d7f9..1e71c32d01aaf 100644 --- a/libraries/src/Toolbar/Legacy/LinkButton.php +++ b/libraries/src/Toolbar/Legacy/LinkButton.php @@ -11,14 +11,14 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a link button * * @since 3.0 */ -class LinkButton extends LegacyToolbarButton +class LinkButton extends ToolbarButton { /** * Button type @@ -70,7 +70,7 @@ public function fetchButton($type = 'Link', $name = 'back', $text = '', $url = n */ public function fetchId($type = 'Link', $name = '') { - return $this->_parent->getName() . '-' . $name; + return $this->parent->getName() . '-' . $name; } /** diff --git a/libraries/src/Toolbar/Legacy/PopupButton.php b/libraries/src/Toolbar/Legacy/PopupButton.php index 76011e426b21e..13af4deeb70fe 100644 --- a/libraries/src/Toolbar/Legacy/PopupButton.php +++ b/libraries/src/Toolbar/Legacy/PopupButton.php @@ -11,14 +11,14 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a modal window button * * @since 3.0 */ -class PopupButton extends LegacyToolbarButton +class PopupButton extends ToolbarButton { /** * Button type @@ -119,7 +119,7 @@ public function fetchButton($type = 'Modal', $name = '', $text = '', $url = '', */ public function fetchId($type, $name) { - return $this->_parent->getName() . '-popup-' . $name; + return $this->parent->getName() . '-popup-' . $name; } /** diff --git a/libraries/src/Toolbar/Legacy/SeparatorButton.php b/libraries/src/Toolbar/Legacy/SeparatorButton.php index 8447e0cc0d9be..a68bf2f52ff75 100644 --- a/libraries/src/Toolbar/Legacy/SeparatorButton.php +++ b/libraries/src/Toolbar/Legacy/SeparatorButton.php @@ -11,14 +11,14 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a button separator * * @since 3.0 */ -class SeparatorButton extends LegacyToolbarButton +class SeparatorButton extends ToolbarButton { /** * Button type @@ -34,7 +34,7 @@ class SeparatorButton extends LegacyToolbarButton * * @return string The HTML for the separator * - * @see LegacyToolbarButton::render() + * @see ToolbarButton::render() * @since 3.0 */ public function render(&$definition) diff --git a/libraries/src/Toolbar/Legacy/SliderButton.php b/libraries/src/Toolbar/Legacy/SliderButton.php index a3b8fbfbd1813..e1b1df2597c1d 100644 --- a/libraries/src/Toolbar/Legacy/SliderButton.php +++ b/libraries/src/Toolbar/Legacy/SliderButton.php @@ -11,14 +11,14 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a button to render an HTML element in a slider container * * @since 3.0 */ -class SliderButton extends LegacyToolbarButton +class SliderButton extends ToolbarButton { /** * Button type @@ -85,7 +85,7 @@ public function fetchButton($type = 'Slider', $name = '', $text = '', $url = '', */ public function fetchId($type, $name) { - return $this->_parent->getName() . '-slider-' . $name; + return $this->parent->getName() . '-slider-' . $name; } /** diff --git a/libraries/src/Toolbar/Legacy/StandardButton.php b/libraries/src/Toolbar/Legacy/StandardButton.php index 0e93cd3418872..acd9e682b3df8 100644 --- a/libraries/src/Toolbar/Legacy/StandardButton.php +++ b/libraries/src/Toolbar/Legacy/StandardButton.php @@ -11,21 +11,70 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\LegacyToolbarButton; +use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a standard button * + * @method self list(bool $value) + * @method bool getList() + * * @since 3.0 */ -class StandardButton extends LegacyToolbarButton +class StandardButton extends ToolbarButton { /** - * Button type + * prepareOptions + * + * @param array $options * - * @var string + * @return void */ - protected $_name = 'Standard'; + protected function prepareOptions(array &$options) + { + $options['doTask'] = $this->_getCommand($options['text'], $this->getTask(), $this->getList()); + $options['group'] = $this->getGroup(); + + if ($options['id']) + { + $options['id'] = ' id="' . $options['id'] . '"'; + } + + switch ($options['name']) + { + case 'apply': + case 'new': + $options['btnClass'] .= ' btn btn-sm btn-success'; + break; + + case 'save': + case 'save-new': + case 'save-copy': + case 'save-close': + case 'publish': + $options['btnClass'] .= ' btn btn-sm btn-outline-success'; + break; + + case 'unpublish': + $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; + break; + + case 'featured': + $options['btnClass'] .= ' btn btn-sm btn-outline-warning'; + break; + + case 'cancel': + $options['btnClass'] .= ' btn btn-sm btn-danger'; + break; + + case 'trash': + $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; + break; + + default: + $options['btnClass'] .= ' btn btn-sm btn-outline-primary'; + } + } /** * Fetch the HTML for the button @@ -116,7 +165,7 @@ public function fetchButton($type = 'Standard', $name = '', $text = '', $task = */ public function fetchId($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) { - return $this->_parent->getName() . '-' . $name; + return $this->parent->getName() . '-' . $name; } /** @@ -146,4 +195,19 @@ protected function _getCommand($name, $task, $list) return $cmd; } + + /** + * getAccessors + * + * @return array + */ + protected static function getAccessors() + { + return array_merge( + parent::getAccessors(), + [ + 'list', + ] + ); + } } diff --git a/libraries/src/Toolbar/LegacyToolbarButton.php b/libraries/src/Toolbar/LegacyToolbarButton.php deleted file mode 100644 index d34cbb8c6cc21..0000000000000 --- a/libraries/src/Toolbar/LegacyToolbarButton.php +++ /dev/null @@ -1,116 +0,0 @@ -_parent = $parent; - } - - /** - * Get the element name - * - * @return string type of the parameter - * - * @since 3.0 - */ - public function getName() - { - return $this->_name; - } - - /** - * Get the HTML to render the button - * - * @param array &$definition Parameters to be passed - * - * @return string - * - * @since 3.0 - */ - public function render(&$definition) - { - /* - * Initialise some variables - */ - $action = call_user_func_array(array(&$this, 'fetchButton'), $definition); - - // Build the HTML Button - $options = array(); - $options['action'] = $action; - - $layout = new FileLayout('joomla.toolbar.base'); - - return $layout->render($options); - } - - /** - * Method to get the CSS class name for an icon identifier - * - * Can be redefined in the final class - * - * @param string $identifier Icon identification string - * - * @return string CSS class name - * - * @since 3.0 - */ - public function fetchIconClass($identifier) - { - // It's an ugly hack, but this allows templates to define the icon classes for the toolbar - $layout = new FileLayout('joomla.toolbar.iconclass'); - - return $layout->render(array('icon' => $identifier)); - } - - /** - * Get the button - * - * Defined in the final button class - * - * @return string - * - * @since 3.0 - */ - abstract public function fetchButton(); -} diff --git a/libraries/src/Toolbar/Toolbar.php b/libraries/src/Toolbar/Toolbar.php index 2778200e005af..9c3237e6b32bd 100644 --- a/libraries/src/Toolbar/Toolbar.php +++ b/libraries/src/Toolbar/Toolbar.php @@ -10,11 +10,15 @@ defined('JPATH_PLATFORM') or die; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; +use Joomla\CMS\Toolbar\Button\StandardButton; /** * ToolBar handler * + * @method StandardButton standard(string $name = '', $text = '', $task = '', $list = true, $group = false) + * * @since 1.5 */ class Toolbar @@ -24,28 +28,28 @@ class Toolbar * * @var string */ - protected $_name = array(); + protected $_name = []; /** * Toolbar array * * @var array */ - protected $_bar = array(); + protected $_bar = []; /** * Loaded buttons * * @var array */ - protected $_buttons = array(); + protected $_buttons = []; /** * Directories, where button types can be stored. * * @var array */ - protected $_buttonPath = array(); + protected $_buttonPath = []; /** * Stores the singleton instances of various toolbar. @@ -136,17 +140,33 @@ public function setFactory(ToolbarFactoryInterface $factory): self /** * Set a value * - * @return string The set value. + * @param ToolbarButton $button + * + * @return ToolbarButton * * @since 1.5 */ - public function appendButton() + public function appendButton(...$args) { - // Push button onto the end of the toolbar array. - $btn = func_get_args(); - $this->_bar[] = $btn; + if (count($args) === 0) + { + trigger_error(sprintf('%s require at least 1 argument.', __METHOD__), E_ERROR); + } - return true; + $button = $args[0]; + + if ($button instanceof ToolbarButton) + { + $button->setParent($this); + + $this->_bar[] = $button; + + return $button; + } + + $this->_bar[] = $args; + + return $button; } /** @@ -208,7 +228,14 @@ public function render() // Render each button in the toolbar. foreach ($this->_bar as $button) { - $html[] = $this->renderButton($button); + if ($button instanceof ToolbarButton) + { + $html[] = $button->render(); + } + else + { + $html[] = $this->renderButton($button); + } } // End toolbar div. @@ -222,11 +249,12 @@ public function render() /** * Render a button. * - * @param object &$node A toolbar node. + * @param object &$node A toolbar node. * * @return string * * @since 1.5 + * @throws \UnexpectedValueException */ public function renderButton(&$node) { @@ -238,9 +266,11 @@ public function renderButton(&$node) // Check for error. if ($button === false) { - return \JText::sprintf('JLIB_HTML_BUTTON_NOT_DEFINED', $type); + throw new \UnexpectedValueException(Text::sprintf('JLIB_HTML_BUTTON_NOT_DEFINED', $type)); } + $button->setParent($this); + return $button->render($node); } @@ -250,7 +280,7 @@ public function renderButton(&$node) * @param string $type Button Type * @param boolean $new False by default * - * @return boolean + * @return false|ToolbarButton * * @since 1.5 */ @@ -263,7 +293,7 @@ public function loadButtonType($type, $new = false) return $this->_buttons[$signature]; } - if (!class_exists('Joomla\\CMS\\Toolbar\\LegacyToolbarButton')) + if (!class_exists('Joomla\\CMS\\Toolbar\\ToolbarButton')) { \JLog::add(\JText::_('JLIB_HTML_BUTTON_BASE_CLASS'), \JLog::WARNING, 'jerror'); diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/ToolbarButton.php new file mode 100644 index 0000000000000..c2e8cc43026c8 --- /dev/null +++ b/libraries/src/Toolbar/ToolbarButton.php @@ -0,0 +1,372 @@ +name($name) + ->text($text) + ->task($task); + } + + /** + * prepareOptions + * + * @param array $options + * + * @return void + */ + protected function prepareOptions(array &$options) + { + // + } + + /** + * Get the HTML to render the button + * + * @param array &$definition Parameters to be passed + * + * @return string + * + * @since 3.0 + */ + public function render(&$definition = null) + { + if ($definition === null) + { + /* + * Initialise some variables + */ + $options = $this->getOptions(); + + $options['name'] = $this->getName(); + $options['text'] = Text::_($this->getText()); + $options['class'] = $this->fetchIconClass($this->getIcon()); + $options['group'] = $this->getGroup(); + $options['id'] = $this->fetchId(); + $options['btnClass'] = 'button-' . $this->getName(); + + $this->prepareOptions($options); + + // Instantiate a new JLayoutFile instance and render the layout + $layout = new FileLayout('joomla.toolbar.standard'); + + $action = $layout->render($options); + + // Build the HTML Button + $layout = new FileLayout('joomla.toolbar.base'); + + return $layout->render(['action' => $action]); + } + + /* + * Initialise some variables + */ + $id = call_user_func_array(array(&$this, 'fetchId'), $definition); + $action = call_user_func_array(array(&$this, 'fetchButton'), $definition); + // Build id attribute + if ($id) + { + $id = ' id="' . $id . '"'; + } + // Build the HTML Button + $options = array(); + $options['id'] = $id; + $options['action'] = $action; + $layout = new FileLayout('joomla.toolbar.base'); + return $layout->render($options); + } + + /** + * Get the button CSS Id + * + * @param string $type Unused string. + * @param string $name Name to be used as apart of the id + * @param string $text Button text + * @param string $task The task associated with the button + * @param boolean $list True to allow use of lists + * @param boolean $hideMenu True to hide the menu on click + * + * @return string Button CSS Id + * + * @since 3.0 + */ + protected function fetchId() + { + return $this->parent->getName() . '-' . $this->getName(); + } + + /** + * Method to get the CSS class name for an icon identifier + * + * Can be redefined in the final class + * + * @param string $identifier Icon identification string + * + * @return string CSS class name + * + * @since 3.0 + */ + public function fetchIconClass($identifier) + { + // It's an ugly hack, but this allows templates to define the icon classes for the toolbar + $layout = new FileLayout('joomla.toolbar.iconclass'); + + return $layout->render(array('icon' => $identifier)); + } + + /** + * Get the button + * + * Defined in the final button class + * + * @return string + * + * @since 3.0 + */ + abstract public function fetchButton(); + + /** + * Method to get property Parent + * + * @return Toolbar + */ + public function getParent(): Toolbar + { + return $this->parent; + } + + /** + * Method to set property parent + * + * @param Toolbar $parent + * + * @return static Return self to support chaining. + */ + public function setParent(Toolbar $parent) + { + $this->parent = $parent; + + return $this; + } + + /** + * Method to get property Options + * + * @return array + */ + public function getOptions(): array + { + return $this->options; + } + + /** + * Method to set property options + * + * @param array $options + * + * @return static Return self to support chaining. + */ + public function setOptions(array $options): self + { + $this->options = $options; + + return $this; + } + + /** + * getOption + * + * @param string $name + * @param mixed $default + * + * @return mixed + */ + public function getOption(string $name, $default = null) + { + return $this->options[$name] ?? $default; + } + + /** + * setOption + * + * @param string $name + * @param mixed $value + * + * @return static + */ + public function setOption(string $name, $value): self + { + $this->options[$name] = $value; + + return $this; + } + + /** + * __call + * + * @param string $name + * @param array $args + * + * @return mixed + * @throws \LogicException + */ + public function __call(string $name, array $args) + { + // getter + if (stripos($name, 'get') === 0) + { + $fieldName = static::findOptionName(strtolower(substr($name, 3))); + + if ($fieldName !== false) + { + return $this->getOption($fieldName); + } + } + // setter + else + { + $fieldName = static::findOptionName($name); + + if ($fieldName !== false) + { + if (!isset($args[0])) + { + throw new \InvalidArgumentException( + sprintf( + '%s::%s() miss first argument.', + __CLASS__, + $name + ) + ); + } + + return $this->setOption($fieldName, $args[0]); + } + } + + throw new \BadMethodCallException( + sprintf( + 'Method %s() not found in class: %s', + $name, + __CLASS__ + ) + ); + } + + /** + * findOptionName + * + * @param string $name + * + * @return bool|string + */ + private static function findOptionName(string $name) + { + $accessors = static::getAccessors(); + + if (\in_array($name, $accessors, true)) + { + return $accessors[array_search($name, $accessors, true)]; + } + + // getter with alias + if (isset($accessors[$name])) + { + return $accessors[$name]; + } + + return false; + } + + /** + * getAccessors + * + * @return array + */ + protected static function getAccessors() + { + return [ + 'text', + 'task', + 'icon', + 'group' => 'group' + ]; + } + + /** + * Method to get property Name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Method to set property name + * + * @param string $name + * + * @return static Return self to support chaining. + */ + public function name($name) + { + $this->name = $name; + + return $this; + } +} diff --git a/libraries/src/Toolbar/ToolbarFactoryInterface.php b/libraries/src/Toolbar/ToolbarFactoryInterface.php index e94e4a56464d4..3bbbb7a6b1f69 100644 --- a/libraries/src/Toolbar/ToolbarFactoryInterface.php +++ b/libraries/src/Toolbar/ToolbarFactoryInterface.php @@ -23,12 +23,12 @@ interface ToolbarFactoryInterface * @param Toolbar $toolbar The Toolbar instance to attach to the button * @param string $type Button Type * - * @return LegacyToolbarButton + * @return ToolbarButton * * @since 4.0.0 * @throws \InvalidArgumentException */ - public function createButton(Toolbar $toolbar, string $type): LegacyToolbarButton; + public function createButton(Toolbar $toolbar, string $type): ToolbarButton; /** * Creates a new Toolbar object. diff --git a/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php b/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php index fc164d8f03458..22153684ad18a 100644 --- a/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php +++ b/tests/unit/suites/libraries/cms/toolbar/JToolbarButtonTest.php @@ -91,7 +91,7 @@ public function test__construct() { $this->assertThat( new JToolbarButtonStandard($this->toolbar), - $this->isInstanceOf('Joomla\\CMS\\Toolbar\\LegacyToolbarButton') + $this->isInstanceOf('Joomla\\CMS\\Toolbar\\ToolbarButton') ); } From 44af9fe144598c3103c7cb2e6612eaefaca3005a Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Sun, 11 Feb 2018 17:49:56 +0800 Subject: [PATCH 04/31] Child dropdown and separator --- .../com_content/View/Articles/HtmlView.php | 37 +++- .../modules/mod_toolbar/mod_toolbar.php | 2 +- layouts/joomla/toolbar/base.php | 24 ++- layouts/joomla/toolbar/confirm.php | 24 --- layouts/joomla/toolbar/separator.php | 25 +++ layouts/joomla/toolbar/standard.php | 41 ++-- .../Toolbar/ContainerAwareToolbarFactory.php | 2 +- .../src/Toolbar/Legacy/ConfirmButton.php | 69 ++++--- .../src/Toolbar/Legacy/SeparatorButton.php | 33 +--- .../src/Toolbar/Legacy/StandardButton.php | 134 +++++-------- libraries/src/Toolbar/Toolbar.php | 39 +++- libraries/src/Toolbar/ToolbarButton.php | 181 +++++++++++++----- 12 files changed, 365 insertions(+), 246 deletions(-) delete mode 100644 layouts/joomla/toolbar/confirm.php diff --git a/administrator/components/com_content/View/Articles/HtmlView.php b/administrator/components/com_content/View/Articles/HtmlView.php index 461085ffef52f..d738978d069ec 100644 --- a/administrator/components/com_content/View/Articles/HtmlView.php +++ b/administrator/components/com_content/View/Articles/HtmlView.php @@ -12,6 +12,7 @@ defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; +use Joomla\CMS\Toolbar\Legacy\SeparatorButton; use Joomla\CMS\Toolbar\Legacy\StandardButton; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Toolbar\ToolbarHelper; @@ -160,11 +161,29 @@ protected function addToolbar() $bar = Toolbar::getInstance('toolbar'); $bar->appendButton(new StandardButton('new')) + ->text('JTOOLBAR_NEW') ->task('article.add') ->icon('new') - ->text('JTOOLBAR_NEW'); - - \JToolbarHelper::title(\JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article'); + ->buttonClass('btn btn-success btn-sm') + ->children( + function (Toolbar $child) + { + $child->appendButton(new StandardButton('test')) + ->text('Test') + ->task('article.add') + ->icon('new'); + + $child->appendButton(new SeparatorButton('sp')) + ->text('Header'); + + $child->appendButton(new StandardButton('test2')) + ->text('Test2') + ->task('article.add') + ->icon('remove'); + } + ); + + ToolbarHelper::title(\JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article'); if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0) { @@ -173,12 +192,12 @@ protected function addToolbar() if ($canDo->get('core.edit.state')) { - \JToolbarHelper::publish('articles.publish', 'JTOOLBAR_PUBLISH', true); - \JToolbarHelper::unpublish('articles.unpublish', 'JTOOLBAR_UNPUBLISH', true); - \JToolbarHelper::custom('articles.featured', 'featured.png', 'featured_f2.png', 'JFEATURE', true); - \JToolbarHelper::custom('articles.unfeatured', 'unfeatured.png', 'featured_f2.png', 'JUNFEATURE', true); - \JToolbarHelper::archiveList('articles.archive'); - \JToolbarHelper::checkin('articles.checkin'); + ToolbarHelper::publish('articles.publish', 'JTOOLBAR_PUBLISH', true); + ToolbarHelper::unpublish('articles.unpublish', 'JTOOLBAR_UNPUBLISH', true); + ToolbarHelper::custom('articles.featured', 'featured.png', 'featured_f2.png', 'JFEATURE', true); + ToolbarHelper::custom('articles.unfeatured', 'unfeatured.png', 'featured_f2.png', 'JUNFEATURE', true); + ToolbarHelper::archiveList('articles.archive'); + ToolbarHelper::checkin('articles.checkin'); } // Add a batch button diff --git a/administrator/modules/mod_toolbar/mod_toolbar.php b/administrator/modules/mod_toolbar/mod_toolbar.php index 7e226a8663e41..a5d004ba5fc74 100644 --- a/administrator/modules/mod_toolbar/mod_toolbar.php +++ b/administrator/modules/mod_toolbar/mod_toolbar.php @@ -12,6 +12,6 @@ use Joomla\CMS\Helper\ModuleHelper; use Joomla\CMS\Toolbar\Toolbar; -$toolbar = Toolbar::getInstance('toolbar')->render('toolbar'); +$toolbar = Toolbar::getInstance('toolbar')->render(); require ModuleHelper::getLayoutPath('mod_toolbar', $params->get('layout', 'default')); diff --git a/layouts/joomla/toolbar/base.php b/layouts/joomla/toolbar/base.php index 62ebb00a6aacd..90461a954ec0b 100644 --- a/layouts/joomla/toolbar/base.php +++ b/layouts/joomla/toolbar/base.php @@ -9,5 +9,27 @@ defined('JPATH_BASE') or die; +/** + * @var string $action + * @var bool $hasChildren + * @var string $children + * @var array $options + */ +extract($displayData, EXTR_OVERWRITE); ?> - + + +
+ + + + + +
+ + + diff --git a/layouts/joomla/toolbar/confirm.php b/layouts/joomla/toolbar/confirm.php deleted file mode 100644 index 2d6070a97d1ab..0000000000000 --- a/layouts/joomla/toolbar/confirm.php +++ /dev/null @@ -1,24 +0,0 @@ - - onclick="" class="btn btn-sm btn-outline-danger"> - - - diff --git a/layouts/joomla/toolbar/separator.php b/layouts/joomla/toolbar/separator.php index 215d58fc5e2b1..2fa9b01d7e965 100644 --- a/layouts/joomla/toolbar/separator.php +++ b/layouts/joomla/toolbar/separator.php @@ -8,3 +8,28 @@ */ defined('JPATH_BASE') or die; + +/** + * @var bool $is_child + * @var int $id + * @var string $doTask + * @var string $class + * @var string $text + * @var string $btnClass + * @var string $group + * @var string $tagName + * @var string $htmlAttributes + */ +extract($displayData, EXTR_OVERWRITE); +?> + + + + + + + + + diff --git a/layouts/joomla/toolbar/standard.php b/layouts/joomla/toolbar/standard.php index d632b4493802d..460669b75fe78 100644 --- a/layouts/joomla/toolbar/standard.php +++ b/layouts/joomla/toolbar/standard.php @@ -13,22 +13,35 @@ HTMLHelper::_('behavior.core'); -$id = isset($displayData['id']) ? $displayData['id'] : ''; -$doTask = $displayData['doTask']; -$class = $displayData['class']; -$text = $displayData['text']; -$btnClass = $displayData['btnClass']; -$group = $displayData['group']; +/** + * @var int $id + * @var string $doTask + * @var string $class + * @var string $text + * @var string $btnClass + * @var string $group + * @var string $tagName + * @var string $htmlAttributes + */ +extract($displayData, EXTR_OVERWRITE); + +$tagName = $tagName ?? 'button'; + +// TODO: RE-ADD button-{name} class. ?> - - href="#" onclick="" class="dropdown-item"> - - + + href="#" onclick="" class="dropdown-item"> + + - onclick="" class=""> - - - +< + onclick="" + class="" + + > + + +> diff --git a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php index ad058a91e375d..680b1f316d655 100644 --- a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php +++ b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php @@ -68,7 +68,7 @@ public function createButton(Toolbar $toolbar, string $type): ToolbarButton return $this->getContainer()->get($buttonClass); } - return new $buttonClass($toolbar); + return (new $buttonClass)->setParent($toolbar); } /** diff --git a/libraries/src/Toolbar/Legacy/ConfirmButton.php b/libraries/src/Toolbar/Legacy/ConfirmButton.php index 8ca80a751a301..7db9a2bfcdf68 100644 --- a/libraries/src/Toolbar/Legacy/ConfirmButton.php +++ b/libraries/src/Toolbar/Legacy/ConfirmButton.php @@ -10,23 +10,20 @@ defined('JPATH_PLATFORM') or die; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a standard button with a confirm dialog * + * @method self message(string $value) + * @method bool getMessage() + * * @since 3.0 */ -class ConfirmButton extends ToolbarButton +class ConfirmButton extends StandardButton { - /** - * Button type - * - * @var string - */ - protected $_name = 'Confirm'; - /** * Fetch the HTML for the button * @@ -44,12 +41,17 @@ class ConfirmButton extends ToolbarButton */ public function fetchButton($type = 'Confirm', $msg = '', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) { + $this->name($name) + ->text(Text::_($text)) + ->list($list) + ->message(Text::_($msg)) + ->task($task); + // Store all data to the options array for use with JLayout - $options = array(); - $options['text'] = \JText::_($text); - $options['msg'] = \JText::_($msg, true); + $options = $this->getOptions(); + $options['name'] = $this->getName(); + $options['msg'] = Text::_($msg, true); $options['class'] = $this->fetchIconClass($name); - $options['doTask'] = $this->_getCommand($options['msg'], $name, $task, $list); $options['id'] = $this->fetchId('Confirm', $name); if ($options['id']) @@ -57,30 +59,24 @@ public function fetchButton($type = 'Confirm', $msg = '', $name = '', $text = '' $options['id'] = ' id="' . $options['id'] . '"'; } + $this->prepareOptions($options); + // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.confirm'); + $layout = new FileLayout($this->layout); return $layout->render($options); } /** - * Get the button CSS Id - * - * @param string $type Button type - * @param string $msg Message to display - * @param string $name Name to be used as apart of the id - * @param string $text Button text - * @param string $task The task associated with the button - * @param boolean $list True to allow use of lists - * @param boolean $hideMenu True to hide the menu on click + * getButtonClass * - * @return string Button CSS Id + * @param string $name * - * @since 3.0 + * @return string */ - public function fetchId($type = 'Confirm', $msg = '', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) + public function getButtonClass(string $name): string { - return $this->parent->getName() . '-' . $name; + return ' btn btn-sm btn-outline-danger'; } /** @@ -95,22 +91,37 @@ public function fetchId($type = 'Confirm', $msg = '', $name = '', $text = '', $t * * @since 3.0 */ - protected function _getCommand($msg, $name, $task, $list) + protected function _getCommand($name, $task, $list) { \JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); \JText::script('ERROR'); + $msg = $this->getMessage(); + $cmd = "if (confirm('" . $msg . "')) { Joomla.submitbutton('" . $task . "'); }"; if ($list) { - $message = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; $alert = "Joomla.renderMessages(" . $message . ")"; $cmd = "if (document.adminForm.boxchecked.value == 0) { " . $alert . " } else { " . $cmd . " }"; - } return $cmd; } + + /** + * getAccessors + * + * @return array + */ + protected static function getAccessors(): array + { + return array_merge( + parent::getAccessors(), + [ + 'message', + ] + ); + } } diff --git a/libraries/src/Toolbar/Legacy/SeparatorButton.php b/libraries/src/Toolbar/Legacy/SeparatorButton.php index a68bf2f52ff75..011f87cc57410 100644 --- a/libraries/src/Toolbar/Legacy/SeparatorButton.php +++ b/libraries/src/Toolbar/Legacy/SeparatorButton.php @@ -21,38 +21,11 @@ class SeparatorButton extends ToolbarButton { /** - * Button type + * Property layout. * - * @var string + * @var string */ - protected $_name = 'Separator'; - - /** - * Get the HTML for a separator in the toolbar - * - * @param array &$definition Class name and custom width - * - * @return string The HTML for the separator - * - * @see ToolbarButton::render() - * @since 3.0 - */ - public function render(&$definition) - { - // Store all data to the options array for use with JLayout - $options = array(); - - // Separator class name - $options['class'] = empty($definition[1]) ? '' : $definition[1]; - - // Custom width - $options['style'] = empty($definition[2]) ? '' : ' style="width:' . (int) $definition[2] . 'px;"'; - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.separator'); - - return $layout->render($options); - } + protected $layout = 'joomla.toolbar.separator'; /** * Empty implementation (not required for separator) diff --git a/libraries/src/Toolbar/Legacy/StandardButton.php b/libraries/src/Toolbar/Legacy/StandardButton.php index acd9e682b3df8..8f00cf889aaea 100644 --- a/libraries/src/Toolbar/Legacy/StandardButton.php +++ b/libraries/src/Toolbar/Legacy/StandardButton.php @@ -10,6 +10,7 @@ defined('JPATH_PLATFORM') or die; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Toolbar\ToolbarButton; @@ -23,6 +24,13 @@ */ class StandardButton extends ToolbarButton { + /** + * Property layout. + * + * @var string + */ + protected $layout = 'joomla.toolbar.standard'; + /** * prepareOptions * @@ -32,48 +40,15 @@ class StandardButton extends ToolbarButton */ protected function prepareOptions(array &$options) { - $options['doTask'] = $this->_getCommand($options['text'], $this->getTask(), $this->getList()); - $options['group'] = $this->getGroup(); + $options['doTask'] = $this->_getCommand($options['text'], $this->getTask(), $this->getList()); + $options['group'] = $this->getGroup(); if ($options['id']) { $options['id'] = ' id="' . $options['id'] . '"'; } - switch ($options['name']) - { - case 'apply': - case 'new': - $options['btnClass'] .= ' btn btn-sm btn-success'; - break; - - case 'save': - case 'save-new': - case 'save-copy': - case 'save-close': - case 'publish': - $options['btnClass'] .= ' btn btn-sm btn-outline-success'; - break; - - case 'unpublish': - $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; - break; - - case 'featured': - $options['btnClass'] .= ' btn btn-sm btn-outline-warning'; - break; - - case 'cancel': - $options['btnClass'] .= ' btn btn-sm btn-danger'; - break; - - case 'trash': - $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; - break; - - default: - $options['btnClass'] .= ' btn btn-sm btn-outline-primary'; - } + $options['btnClass'] = ($options['button_class'] ?? $this->getButtonClass($options['name'])); } /** @@ -92,80 +67,63 @@ protected function prepareOptions(array &$options) */ public function fetchButton($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $group = false) { + $this->name($name) + ->text(\JText::_($text)) + ->task($task) + ->list($list) + ->group($group); + // Store all data to the options array for use with JLayout - $options = array(); + $options = $this->getOptions(); + $options['name'] = $name; + $options['class'] = $this->fetchIconClass($name); + $options['id'] = $this->fetchId(); - $options['text'] = \JText::_($text); - $options['class'] = $this->fetchIconClass($name); - $options['doTask'] = $this->_getCommand($options['text'], $task, $list); - $options['group'] = $group; - $options['id'] = $this->fetchId('Standard', $name); - $options['btnClass'] = 'button-' . $name; + $this->prepareOptions($options); - if ($options['id']) - { - $options['id'] = ' id="' . $options['id'] . '"'; - } + // Instantiate a new JLayoutFile instance and render the layout + $layout = new FileLayout($this->layout); + + return $layout->render($options); + } + /** + * getButtonClass + * + * @param string $name + * + * @return string + */ + public function getButtonClass(string $name): string + { switch ($name) { case 'apply': case 'new': - $options['btnClass'] .= ' btn btn-sm btn-success'; - break; + return ' btn btn-sm btn-success'; case 'save': case 'save-new': case 'save-copy': case 'save-close': case 'publish': - $options['btnClass'] .= ' btn btn-sm btn-outline-success'; - break; + return ' btn btn-sm btn-outline-success'; case 'unpublish': - $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; - break; + return ' btn btn-sm btn-outline-danger'; case 'featured': - $options['btnClass'] .= ' btn btn-sm btn-outline-warning'; - break; + return ' btn btn-sm btn-outline-warning'; case 'cancel': - $options['btnClass'] .= ' btn btn-sm btn-danger'; - break; + return ' btn btn-sm btn-danger'; case 'trash': - $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; - break; - + return ' btn btn-sm btn-outline-danger'; default: - $options['btnClass'] .= ' btn btn-sm btn-outline-primary'; + return ' btn btn-sm btn-outline-primary'; } - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.standard'); - - return $layout->render($options); - } - - /** - * Get the button CSS Id - * - * @param string $type Unused string. - * @param string $name Name to be used as apart of the id - * @param string $text Button text - * @param string $task The task associated with the button - * @param boolean $list True to allow use of lists - * @param boolean $hideMenu True to hide the menu on click - * - * @return string Button CSS Id - * - * @since 3.0 - */ - public function fetchId($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) - { - return $this->parent->getName() . '-' . $name; } /** @@ -181,8 +139,8 @@ public function fetchId($type = 'Standard', $name = '', $text = '', $task = '', */ protected function _getCommand($name, $task, $list) { - \JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); - \JText::script('ERROR'); + Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); + Text::script('ERROR'); $cmd = "Joomla.submitbutton('" . $task . "');"; @@ -201,7 +159,7 @@ protected function _getCommand($name, $task, $list) * * @return array */ - protected static function getAccessors() + protected static function getAccessors(): array { return array_merge( parent::getAccessors(), diff --git a/libraries/src/Toolbar/Toolbar.php b/libraries/src/Toolbar/Toolbar.php index 9c3237e6b32bd..6001c8b3ce7ff 100644 --- a/libraries/src/Toolbar/Toolbar.php +++ b/libraries/src/Toolbar/Toolbar.php @@ -212,26 +212,38 @@ public function prependButton() /** * Render a toolbar. * + * @param array $options + * * @return string HTML for the toolbar. * + * @throws \Exception * @since 1.5 */ - public function render() + public function render(array $options = []) { - $html = array(); + $html = []; + + $isChild = !empty($options['is_child']); // Start toolbar div. - $layout = new FileLayout('joomla.toolbar.containeropen'); + if (!$isChild) + { + $layout = new FileLayout('joomla.toolbar.containeropen'); - $html[] = $layout->render(array('id' => $this->_name)); + $html[] = $layout->render(['id' => $this->_name]); + } // Render each button in the toolbar. foreach ($this->_bar as $button) { if ($button instanceof ToolbarButton) { + // Child dropdown only support new syntax + $button->setOption('is_child', (bool) ($options['is_child'] ?? false)); + $html[] = $button->render(); } + // B/C else { $html[] = $this->renderButton($button); @@ -239,9 +251,12 @@ public function render() } // End toolbar div. - $layout = new FileLayout('joomla.toolbar.containerclose'); + if (!$isChild) + { + $layout = new FileLayout('joomla.toolbar.containerclose'); - $html[] = $layout->render(array()); + $html[] = $layout->render([]); + } return implode('', $html); } @@ -383,4 +398,16 @@ public function getButtonPath(): array return $this->_buttonPath; } + + /** + * createChild + * + * @param string $name + * + * @return static + */ + public function createChild($name): self + { + return new static($name, $this->factory); + } } diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/ToolbarButton.php index c2e8cc43026c8..e07fe3777698b 100644 --- a/libraries/src/Toolbar/ToolbarButton.php +++ b/libraries/src/Toolbar/ToolbarButton.php @@ -11,18 +11,23 @@ use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\String\Normalise; +use Joomla\Utilities\ArrayHelper; /** * The ToolbarButton class. * - * @method ToolbarButton text(string $value) - * @method ToolbarButton task(string $value) - * @method ToolbarButton icon(string $value) - * @method ToolbarButton group(bool $value) + * @method self text(string $value) + * @method self task(string $value) + * @method self icon(string $value) + * @method self group(bool $value) + * @method self buttonClass(string $value) + * @method self attributes(array $value) * @method string getText() * @method string getTask() * @method string getIcon() * @method bool getGroup() + * @method string getButtonClass() + * @method array getAttributes() * * @since __DEPLOY_VERSION__ */ @@ -40,7 +45,21 @@ abstract class ToolbarButton * * @var Toolbar */ - protected $parent = null; + protected $parent; + + /** + * Property child. + * + * @var Toolbar + */ + protected $child; + + /** + * Property layout. + * + * @var string + */ + protected $layout; /** * Property options. @@ -52,9 +71,11 @@ abstract class ToolbarButton /** * Constructor * - * @param Toolbar $parent The parent + * @param string $name + * @param string $text + * @param string $task */ - public function __construct($name, $text = '', $task = '') + public function __construct(string $name = '', string $text = '', string $task = '') { $this->name($name) ->text($text) @@ -73,60 +94,108 @@ protected function prepareOptions(array &$options) // } + /** + * children + * + * @param callable $handler + * + * @return static + */ + public function children(callable $handler) + { + $child = $this->getChildToolbar(); + + $handler($child); + + return $this; + } + + /** + * getChildToolbar + * + * @return Toolbar + */ + public function getChildToolbar() + { + if (!$this->child) + { + $this->child = $this->parent->createChild($this->getName() . '.children'); + } + + return $this->child; + } + /** * Get the HTML to render the button * - * @param array &$definition Parameters to be passed + * @param array &$definition Parameters to be passed * * @return string * * @since 3.0 + * + * @throws \Exception */ public function render(&$definition = null) { + $childToolbar = $this->getChildToolbar(); + $hasChildren = count($childToolbar->getItems()) > 0; + + $options = $this->getOptions(); + if ($definition === null) { - /* - * Initialise some variables - */ - $options = $this->getOptions(); - - $options['name'] = $this->getName(); - $options['text'] = Text::_($this->getText()); - $options['class'] = $this->fetchIconClass($this->getIcon()); - $options['group'] = $this->getGroup(); - $options['id'] = $this->fetchId(); - $options['btnClass'] = 'button-' . $this->getName(); + $options['name'] = $this->getName(); + $options['text'] = Text::_($this->getText()); + $options['class'] = $this->fetchIconClass($this->getIcon() ?: $this->getName()); + $options['group'] = $this->getGroup(); + $options['id'] = $this->fetchId(); + $options['hasChildren'] = $hasChildren; + + if (!empty($options['is_child'])) + { + $options['tagName'] = 'a'; + $options['button_class'] = ($options['button_class'] ?? '') . ' dropdown-item'; + $options['attributes']['href'] = '#'; + } + else + { + $options['tagName'] = 'button'; + $options['attributes']['type'] = 'button'; + } $this->prepareOptions($options); + $options['htmlAttributes'] = ArrayHelper::toString($options['attributes']); + // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.standard'); + $layout = new FileLayout($this->layout); $action = $layout->render($options); - - // Build the HTML Button - $layout = new FileLayout('joomla.toolbar.base'); - - return $layout->render(['action' => $action]); } - - /* - * Initialise some variables - */ - $id = call_user_func_array(array(&$this, 'fetchId'), $definition); - $action = call_user_func_array(array(&$this, 'fetchButton'), $definition); - // Build id attribute - if ($id) + // For B/C + elseif (is_array($definition)) { - $id = ' id="' . $id . '"'; + $action = $this->fetchButton(...$definition); } + else + { + throw new \InvalidArgumentException('Wrong argument: $definition, should be NULL or array.'); + } + + $children = $hasChildren ? $childToolbar->render(['is_child' => true]) : ''; + // Build the HTML Button - $options = array(); - $options['id'] = $id; - $options['action'] = $action; $layout = new FileLayout('joomla.toolbar.base'); - return $layout->render($options); + + return $layout->render( + [ + 'action' => $action, + 'hasChildren' => $hasChildren, + 'children' => $children, + 'options' => $options + ] + ); } /** @@ -195,7 +264,7 @@ public function getParent(): Toolbar * * @return static Return self to support chaining. */ - public function setParent(Toolbar $parent) + public function setParent(Toolbar $parent): self { $this->parent = $parent; @@ -254,6 +323,30 @@ public function setOption(string $name, $value): self return $this; } + /** + * Method to get property Layout + * + * @return string + */ + public function getLayout(): string + { + return $this->layout; + } + + /** + * Method to set property layout + * + * @param string $layout + * + * @return static Return self to support chaining. + */ + public function layout(string $layout): self + { + $this->layout = $layout; + + return $this; + } + /** * __call * @@ -336,13 +429,15 @@ private static function findOptionName(string $name) * * @return array */ - protected static function getAccessors() + protected static function getAccessors(): array { return [ 'text', 'task', 'icon', - 'group' => 'group' + 'group', + 'attributes', + 'buttonClass' => 'button_class' ]; } @@ -351,7 +446,7 @@ protected static function getAccessors() * * @return string */ - public function getName() + public function getName(): string { return $this->name; } @@ -363,7 +458,7 @@ public function getName() * * @return static Return self to support chaining. */ - public function name($name) + public function name(string $name): self { $this->name = $name; From b443df087e7725fda32ee19e4512863cd1dc5e4e Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Sun, 11 Feb 2018 23:07:50 +0800 Subject: [PATCH 05/31] popup button --- layouts/joomla/toolbar/popup.php | 30 +++- layouts/joomla/toolbar/standard.php | 3 +- .../src/Toolbar/Legacy/ConfirmButton.php | 39 ++--- libraries/src/Toolbar/Legacy/PopupButton.php | 165 +++++++++++++----- .../src/Toolbar/Legacy/SeparatorButton.php | 2 + .../src/Toolbar/Legacy/StandardButton.php | 23 +-- libraries/src/Toolbar/ToolbarButton.php | 82 +++++---- 7 files changed, 224 insertions(+), 120 deletions(-) diff --git a/layouts/joomla/toolbar/popup.php b/layouts/joomla/toolbar/popup.php index 3db4fe454b53c..ed24ea27991ab 100644 --- a/layouts/joomla/toolbar/popup.php +++ b/layouts/joomla/toolbar/popup.php @@ -13,13 +13,29 @@ HTMLHelper::_('behavior.core'); -$id = isset($displayData['id']) ? $displayData['id'] : ''; -$doTask = $displayData['doTask']; -$class = $displayData['class']; -$text = $displayData['text']; -$name = $displayData['name']; +/** + * @var int $id + * @var string $name + * @var string $doTask + * @var string $class + * @var string $text + * @var string $btnClass + * @var string $group + * @var string $tagName + * @var string $htmlAttributes + */ +extract($displayData, EXTR_OVERWRITE); + +$tagName = $tagName ?? 'button'; ?> - value="" class="btn btn-sm btn-outline-primary" data-toggle="modal" data-target="#modal-"> +< + id="" + value="" + class="" + + data-toggle="modal" + data-target="#" +> - +> diff --git a/layouts/joomla/toolbar/standard.php b/layouts/joomla/toolbar/standard.php index 460669b75fe78..4bfc565ebdcf5 100644 --- a/layouts/joomla/toolbar/standard.php +++ b/layouts/joomla/toolbar/standard.php @@ -36,7 +36,8 @@ -< +< + id="" onclick="" class="" diff --git a/libraries/src/Toolbar/Legacy/ConfirmButton.php b/libraries/src/Toolbar/Legacy/ConfirmButton.php index 7db9a2bfcdf68..47cd3696459b5 100644 --- a/libraries/src/Toolbar/Legacy/ConfirmButton.php +++ b/libraries/src/Toolbar/Legacy/ConfirmButton.php @@ -24,6 +24,20 @@ */ class ConfirmButton extends StandardButton { + /** + * prepareOptions + * + * @param array $options + * + * @return void + */ + protected function prepareOptions(array &$options) + { + parent::prepareOptions($options); + + $options['message'] = Text::_($options['message']); + } + /** * Fetch the HTML for the button * @@ -38,33 +52,18 @@ class ConfirmButton extends StandardButton * @return string HTML string for the button * * @since 3.0 + * + * @deprecated 5.0 Use render() instead. */ public function fetchButton($type = 'Confirm', $msg = '', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) { $this->name($name) - ->text(Text::_($text)) + ->text($text) ->list($list) - ->message(Text::_($msg)) + ->message($msg) ->task($task); - // Store all data to the options array for use with JLayout - $options = $this->getOptions(); - $options['name'] = $this->getName(); - $options['msg'] = Text::_($msg, true); - $options['class'] = $this->fetchIconClass($name); - $options['id'] = $this->fetchId('Confirm', $name); - - if ($options['id']) - { - $options['id'] = ' id="' . $options['id'] . '"'; - } - - $this->prepareOptions($options); - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout($this->layout); - - return $layout->render($options); + return $this->renderButton($this->options); } /** diff --git a/libraries/src/Toolbar/Legacy/PopupButton.php b/libraries/src/Toolbar/Legacy/PopupButton.php index 13af4deeb70fe..1ca5a99d322a6 100644 --- a/libraries/src/Toolbar/Legacy/PopupButton.php +++ b/libraries/src/Toolbar/Legacy/PopupButton.php @@ -10,22 +10,58 @@ defined('JPATH_PLATFORM') or die; +use Joomla\CMS\Factory; +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a modal window button * + * @method self url(string $value) + * @method self iframeWidth(int $value) + * @method self iframeHeight(int $value) + * @method self bodyHeight(int $value) + * @method self modalWidth(int $value) + * @method self onclose(string $value) + * @method self title(string $value) + * @method self footer(string $value) + * @method self selector(string $value) + * @method string getUrl() + * @method int getIframeWidth() + * @method int getIframeHeight() + * @method int getBodyHeight() + * @method int getModalWidth() + * @method string getOnclose() + * @method string getTitle() + * @method string getFooter() + * @method string getSelector() + * * @since 3.0 */ class PopupButton extends ToolbarButton { /** - * Button type + * Property layout. * - * @var string + * @var string */ - protected $_name = 'Popup'; + protected $layout = 'joomla.toolbar.popup'; + + /** + * prepareOptions + * + * @param array $options + * + * @return void + */ + protected function prepareOptions(array &$options) + { + $options['doTask'] = $this->_getCommand($this->getUrl()); + + $options['selector'] = $options['selector'] ?? 'modal-' . $this->getName(); + } /** * Fetch the HTML for the button @@ -49,61 +85,76 @@ class PopupButton extends ToolbarButton public function fetchButton($type = 'Modal', $name = '', $text = '', $url = '', $iframeWidth = 640, $iframeHeight = 480, $bodyHeight = null, $modalWidth = null, $onClose = '', $title = '', $footer = null) { - // If no $title is set, use the $text element - if ($title === '') - { - $title = $text; - } + $this->name($name) + ->text(Text::_($text)) + ->task($this->_getCommand($url)) + ->url($url) + ->iframeWidth($iframeWidth) + ->iframeHeight($iframeHeight) + ->bodyHeight($bodyHeight) + ->modalWidth($modalWidth) + ->onclose($onClose) + ->title($title) + ->footer($footer); + + return $this->renderButton($this->options); + } - // Store all data to the options array for use with JLayout - $options = array(); - $options['name'] = $name; - $options['text'] = \JText::_($text); - $options['title'] = \JText::_($title); - $options['class'] = $this->fetchIconClass($name); - $options['doTask'] = $this->_getCommand($url); - $options['id'] = $this->fetchId('Popup', $name); + /** + * renderButton + * + * @param array $options + * + * @return string + */ + protected function renderButton(array &$options): string + { + $html = []; + $html[] = parent::renderButton($options); - if ($options['id']) + // Build the options array for the modal + $params = array(); + $params['title'] = Text::_($options['title'] ?? $options['text']); + $params['height'] = $options['iframeHeight'] ?? 480; + $params['width'] = $options['iframeWidth'] ?? 640; + $params['bodyHeight'] = $options['bodyHeight'] ?? null; + $params['modalWidth'] = $options['modalWidth'] ?? null; + + if ((string) $this->getUrl() !== '') { - $options['id'] = ' id="' . $options['id'] . '"'; - } + $params['url'] = $this->getUrl(); - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.popup'); + // Place modal div and scripts in a new div + $html[] = '
'; - $html = array(); - $html[] = $layout->render($options); + $selector = $options['selector']; - // Place modal div and scripts in a new div - $html[] = '
'; + $html[] = HTMLHelper::_('bootstrap.renderModal', $selector, $params); - // Build the options array for the modal - $params = array(); - $params['title'] = $options['title']; - $params['url'] = $options['doTask']; - $params['height'] = $iframeHeight; - $params['width'] = $iframeWidth; - $params['bodyHeight'] = $bodyHeight; - $params['modalWidth'] = $modalWidth; - - if (isset($footer)) + $html[] = '
'; + } + + $footer = $this->getFooter(); + + if ($footer !== null) { $params['footer'] = $footer; } - $html[] = \JHtml::_('bootstrap.renderModal', 'modal-' . $name, $params); - // If an $onClose event is passed, add it to the modal JS object - if ($onClose !== '') + if ((string) $this->getOnclose() !== '') { - $html[] = ''; + Factory::getDocument()->addScriptDeclaration( + <<parent->getName() . '-popup-' . $name; + return $this->parent->getName() . '-popup-' . $this->getName(); } /** @@ -140,4 +191,28 @@ private function _getCommand($url) return $url; } + + /** + * getAccessors + * + * @return array + */ + protected static function getAccessors(): array + { + return array_merge( + parent::getAccessors(), + [ + 'url', + 'iframeWidth', + 'iframeHeight', + 'bodyHeight', + 'modalWidth', + 'onclose', + 'title', + 'footer', + 'selector' + ] + ); + } + } diff --git a/libraries/src/Toolbar/Legacy/SeparatorButton.php b/libraries/src/Toolbar/Legacy/SeparatorButton.php index 011f87cc57410..eb0120b3c316e 100644 --- a/libraries/src/Toolbar/Legacy/SeparatorButton.php +++ b/libraries/src/Toolbar/Legacy/SeparatorButton.php @@ -33,6 +33,8 @@ class SeparatorButton extends ToolbarButton * @return void * * @since 3.0 + * + * @deprecated 5.0 Use render() instead. */ public function fetchButton() { diff --git a/libraries/src/Toolbar/Legacy/StandardButton.php b/libraries/src/Toolbar/Legacy/StandardButton.php index 8f00cf889aaea..0a1c3a7485a47 100644 --- a/libraries/src/Toolbar/Legacy/StandardButton.php +++ b/libraries/src/Toolbar/Legacy/StandardButton.php @@ -43,12 +43,10 @@ protected function prepareOptions(array &$options) $options['doTask'] = $this->_getCommand($options['text'], $this->getTask(), $this->getList()); $options['group'] = $this->getGroup(); - if ($options['id']) + if (empty($options['is_child'])) { - $options['id'] = ' id="' . $options['id'] . '"'; + $options['btnClass'] = ($options['button_class'] ?? $this->getButtonClass($options['name'])); } - - $options['btnClass'] = ($options['button_class'] ?? $this->getButtonClass($options['name'])); } /** @@ -64,27 +62,18 @@ protected function prepareOptions(array &$options) * @return string HTML string for the button * * @since 3.0 + * + * @deprecated 5.0 Use render() instead. */ public function fetchButton($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $group = false) { $this->name($name) - ->text(\JText::_($text)) + ->text($text) ->task($task) ->list($list) ->group($group); - // Store all data to the options array for use with JLayout - $options = $this->getOptions(); - $options['name'] = $name; - $options['class'] = $this->fetchIconClass($name); - $options['id'] = $this->fetchId(); - - $this->prepareOptions($options); - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout($this->layout); - - return $layout->render($options); + return $this->renderButton($this->options); } /** diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/ToolbarButton.php index e07fe3777698b..6001cf27e78aa 100644 --- a/libraries/src/Toolbar/ToolbarButton.php +++ b/libraries/src/Toolbar/ToolbarButton.php @@ -119,7 +119,7 @@ public function getChildToolbar() { if (!$this->child) { - $this->child = $this->parent->createChild($this->getName() . '.children'); + $this->child = $this->parent->createChild($this->getName() . '-children'); } return $this->child; @@ -145,33 +145,9 @@ public function render(&$definition = null) if ($definition === null) { - $options['name'] = $this->getName(); - $options['text'] = Text::_($this->getText()); - $options['class'] = $this->fetchIconClass($this->getIcon() ?: $this->getName()); - $options['group'] = $this->getGroup(); - $options['id'] = $this->fetchId(); $options['hasChildren'] = $hasChildren; - if (!empty($options['is_child'])) - { - $options['tagName'] = 'a'; - $options['button_class'] = ($options['button_class'] ?? '') . ' dropdown-item'; - $options['attributes']['href'] = '#'; - } - else - { - $options['tagName'] = 'button'; - $options['attributes']['type'] = 'button'; - } - - $this->prepareOptions($options); - - $options['htmlAttributes'] = ArrayHelper::toString($options['attributes']); - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout($this->layout); - - $action = $layout->render($options); + $action = $this->renderButton($options); } // For B/C elseif (is_array($definition)) @@ -198,6 +174,50 @@ public function render(&$definition = null) ); } + /** + * renderButton + * + * @param array $options + * + * @return string + */ + protected function renderButton(array &$options): string + { + $options['name'] = $this->getName(); + $options['text'] = Text::_($this->getText()); + $options['class'] = $this->fetchIconClass($this->getIcon() ?: $this->getName()); + $options['group'] = $this->getGroup(); + $options['id'] = $this->fetchId(); + + if (!empty($options['is_child'])) + { + $options['tagName'] = 'a'; + $options['btnClass'] = ($options['button_class'] ?? '') . ' dropdown-item'; + $options['attributes']['href'] = '#'; + } + else + { + $options['tagName'] = 'button'; + $options['btnClass'] = ($options['button_class'] ?? '') . ' btn btn-sm btn-outline-primary'; + $options['attributes']['type'] = 'button'; + } + + $this->prepareOptions($options); + + // Prepare custom attributes. + unset( + $options['attributes']['id'], + $options['attributes']['class'] + ); + + $options['htmlAttributes'] = ArrayHelper::toString($options['attributes']); + + // Instantiate a new JLayoutFile instance and render the layout + $layout = new FileLayout($this->layout); + + return $layout->render($options); + } + /** * Get the button CSS Id * @@ -244,6 +264,8 @@ public function fetchIconClass($identifier) * @return string * * @since 3.0 + * + * @deprecated 5.0 Use render() instead. */ abstract public function fetchButton(); @@ -361,7 +383,7 @@ public function __call(string $name, array $args) // getter if (stripos($name, 'get') === 0) { - $fieldName = static::findOptionName(strtolower(substr($name, 3))); + $fieldName = static::findOptionName(lcfirst(substr($name, 3))); if ($fieldName !== false) { @@ -375,12 +397,12 @@ public function __call(string $name, array $args) if ($fieldName !== false) { - if (!isset($args[0])) + if (!array_key_exists(0, $args)) { throw new \InvalidArgumentException( sprintf( '%s::%s() miss first argument.', - __CLASS__, + get_called_class(), $name ) ); @@ -394,7 +416,7 @@ public function __call(string $name, array $args) sprintf( 'Method %s() not found in class: %s', $name, - __CLASS__ + get_called_class() ) ); } From 365a1d9f7c96850c111000435c09630fd460f701 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Sun, 11 Feb 2018 23:19:19 +0800 Subject: [PATCH 06/31] popup fix --- libraries/src/Toolbar/Legacy/PopupButton.php | 33 ++++++++++---------- libraries/src/Toolbar/ToolbarButton.php | 8 ++--- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/libraries/src/Toolbar/Legacy/PopupButton.php b/libraries/src/Toolbar/Legacy/PopupButton.php index 1ca5a99d322a6..db34cccdb9c17 100644 --- a/libraries/src/Toolbar/Legacy/PopupButton.php +++ b/libraries/src/Toolbar/Legacy/PopupButton.php @@ -112,33 +112,32 @@ protected function renderButton(array &$options): string $html = []; $html[] = parent::renderButton($options); - // Build the options array for the modal - $params = array(); - $params['title'] = Text::_($options['title'] ?? $options['text']); - $params['height'] = $options['iframeHeight'] ?? 480; - $params['width'] = $options['iframeWidth'] ?? 640; - $params['bodyHeight'] = $options['bodyHeight'] ?? null; - $params['modalWidth'] = $options['modalWidth'] ?? null; - if ((string) $this->getUrl() !== '') { - $params['url'] = $this->getUrl(); + // Build the options array for the modal + $params = array(); + $params['title'] = Text::_($options['title'] ?? $options['text']); + $params['url'] = $this->getUrl(); + $params['height'] = $options['iframeHeight'] ?? 480; + $params['width'] = $options['iframeWidth'] ?? 640; + $params['bodyHeight'] = $options['bodyHeight'] ?? null; + $params['modalWidth'] = $options['modalWidth'] ?? null; // Place modal div and scripts in a new div $html[] = '
'; $selector = $options['selector']; - $html[] = HTMLHelper::_('bootstrap.renderModal', $selector, $params); + $footer = $this->getFooter(); - $html[] = '
'; - } + if ($footer !== null) + { + $params['footer'] = $footer; + } - $footer = $this->getFooter(); + $html[] = HTMLHelper::_('bootstrap.renderModal', $selector, $params); - if ($footer !== null) - { - $params['footer'] = $footer; + $html[] = '
'; } // If an $onClose event is passed, add it to the modal JS object @@ -147,7 +146,7 @@ protected function renderButton(array &$options): string Factory::getDocument()->addScriptDeclaration( <<getChildToolbar(); $hasChildren = count($childToolbar->getItems()) > 0; - $options = $this->getOptions(); - if ($definition === null) { $options['hasChildren'] = $hasChildren; - $action = $this->renderButton($options); + $this->setOption('hasChildren', $hasChildren); + + $action = $this->renderButton($this->options); } // For B/C elseif (is_array($definition)) @@ -169,7 +169,7 @@ public function render(&$definition = null) 'action' => $action, 'hasChildren' => $hasChildren, 'children' => $children, - 'options' => $options + 'options' => $this->options ] ); } From 842e688ea9cae05e5c9a1cc5e89d5b9b46865cb9 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Mon, 12 Feb 2018 00:55:57 +0800 Subject: [PATCH 07/31] More buttons --- .../com_content/View/Article/HtmlView.php | 23 +++++- .../com_content/View/Articles/HtmlView.php | 33 +++++--- layouts/joomla/toolbar/basic.php | 40 +++++++++ layouts/joomla/toolbar/batch.php | 2 + layouts/joomla/toolbar/help.php | 23 ------ layouts/joomla/toolbar/link.php | 27 ++++-- layouts/joomla/toolbar/popup.php | 25 +++++- layouts/joomla/toolbar/standard.php | 6 +- libraries/src/Toolbar/Legacy/BasicButton.php | 46 +++++++++++ .../src/Toolbar/Legacy/ConfirmButton.php | 8 +- libraries/src/Toolbar/Legacy/CustomButton.php | 33 +++++--- libraries/src/Toolbar/Legacy/HelpButton.php | 82 +++++++++++-------- libraries/src/Toolbar/Legacy/LinkButton.php | 79 +++++++++--------- libraries/src/Toolbar/Legacy/PopupButton.php | 10 ++- .../src/Toolbar/Legacy/StandardButton.php | 27 +++--- libraries/src/Toolbar/Toolbar.php | 18 +--- libraries/src/Toolbar/ToolbarButton.php | 53 ++++++------ 17 files changed, 334 insertions(+), 201 deletions(-) create mode 100644 layouts/joomla/toolbar/basic.php delete mode 100644 layouts/joomla/toolbar/help.php create mode 100644 libraries/src/Toolbar/Legacy/BasicButton.php diff --git a/administrator/components/com_content/View/Article/HtmlView.php b/administrator/components/com_content/View/Article/HtmlView.php index 9636b42928398..7f4898cc7756e 100644 --- a/administrator/components/com_content/View/Article/HtmlView.php +++ b/administrator/components/com_content/View/Article/HtmlView.php @@ -12,6 +12,10 @@ defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; +use Joomla\CMS\Toolbar\Legacy\LinkButton; +use Joomla\CMS\Toolbar\Legacy\PopupButton; +use Joomla\CMS\Toolbar\Toolbar; +use Joomla\CMS\Toolbar\ToolbarHelper; /** * View to edit an article. @@ -119,11 +123,19 @@ protected function addToolbar() // Built the actions for new and existing records. $canDo = $this->canDo; + $bar = Toolbar::getInstance(); + \JToolbarHelper::title( \JText::_('COM_CONTENT_PAGE_' . ($checkedOut ? 'VIEW_ARTICLE' : ($isNew ? 'ADD_ARTICLE' : 'EDIT_ARTICLE'))), 'pencil-2 article-add' ); + $bar->appendButton(new LinkButton('back')) + ->text('Back') + ->target('_parent') + ->url('https://help.joomla.org/proxy?keyref=Help40:Content_Article_Manager_Edit&lang=en'); + + // For new records, check the create permission. if ($isNew && (count($user->getAuthorisedCategories('com_content', 'core.create')) > 0)) { @@ -178,7 +190,16 @@ protected function addToolbar() { \JLoader::register('ContentHelperPreview', JPATH_ADMINISTRATOR . '/components/com_content/helpers/preview.php'); $url = \ContentHelperPreview::url($this->item); - \JToolbarHelper::preview($url, \JText::_('JGLOBAL_PREVIEW'), 'eye', 80, 90); + ToolbarHelper::preview($url, \JText::_('JGLOBAL_PREVIEW'), 'eye', 80, 90); + + Toolbar::getInstance()->appendButton( + (new PopupButton('preview')) + ->url($url) + ->text('JGLOBAL_PREVIEW') + ->icon('eye') + ->bodyHeight(80) + ->modalWidth(90) + ); } \JToolbarHelper::cancel('article.cancel', 'JTOOLBAR_CLOSE'); diff --git a/administrator/components/com_content/View/Articles/HtmlView.php b/administrator/components/com_content/View/Articles/HtmlView.php index d738978d069ec..12185e104da6e 100644 --- a/administrator/components/com_content/View/Articles/HtmlView.php +++ b/administrator/components/com_content/View/Articles/HtmlView.php @@ -12,6 +12,8 @@ defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; +use Joomla\CMS\Toolbar\Legacy\CustomButton; +use Joomla\CMS\Toolbar\Legacy\PopupButton; use Joomla\CMS\Toolbar\Legacy\SeparatorButton; use Joomla\CMS\Toolbar\Legacy\StandardButton; use Joomla\CMS\Toolbar\Toolbar; @@ -183,6 +185,16 @@ function (Toolbar $child) } ); + $bar->appendButton( + (new PopupButton('preview')) + ->url('http://localhost/joomla/40dev/index.php?option=com_content&view=article&id=66&catid=65&Itemid=435') +// ->selector('#collapseModal') + ->text('JGLOBAL_PREVIEW') + ->icon('eye') + ->bodyHeight(80) + ->modalWidth(90) + ); + ToolbarHelper::title(\JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article'); if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0) @@ -205,30 +217,29 @@ function (Toolbar $child) && $user->authorise('core.edit', 'com_content') && $user->authorise('core.edit.state', 'com_content')) { - $title = \JText::_('JTOOLBAR_BATCH'); - - // Instantiate a new \JLayoutFile instance and render the batch button - $layout = new \JLayoutFile('joomla.toolbar.batch'); - - $dhtml = $layout->render(array('title' => $title)); - $bar->appendButton('Custom', $dhtml, 'batch'); + $bar->appendButton( + (new PopupButton('batch')) + ->selector('collapseModal') + ->text('JTOOLBAR_BATCH') + ->listCheck(true) + ); } if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete')) { - \JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'articles.delete', 'JTOOLBAR_EMPTY_TRASH'); + ToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'articles.delete', 'JTOOLBAR_EMPTY_TRASH'); } elseif ($canDo->get('core.edit.state')) { - \JToolbarHelper::trash('articles.trash'); + ToolbarHelper::trash('articles.trash'); } if ($user->authorise('core.admin', 'com_content') || $user->authorise('core.options', 'com_content')) { - \JToolbarHelper::preferences('com_content'); + ToolbarHelper::preferences('com_content'); } - \JToolbarHelper::help('JHELP_CONTENT_ARTICLE_MANAGER'); + ToolbarHelper::help('JHELP_CONTENT_ARTICLE_MANAGER'); } /** diff --git a/layouts/joomla/toolbar/basic.php b/layouts/joomla/toolbar/basic.php new file mode 100644 index 0000000000000..9cebebba675c4 --- /dev/null +++ b/layouts/joomla/toolbar/basic.php @@ -0,0 +1,40 @@ + +< + id="" + onclick="" + class="" + + > + + +> diff --git a/layouts/joomla/toolbar/batch.php b/layouts/joomla/toolbar/batch.php index c5c56936ead0e..e47310947d42a 100644 --- a/layouts/joomla/toolbar/batch.php +++ b/layouts/joomla/toolbar/batch.php @@ -12,6 +12,8 @@ use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; +// TODO: Deprecate this file since we can use popup button to raise batch modal. + HTMLHelper::_('behavior.core'); $id = isset($displayData['id']) ? $displayData['id'] : ''; diff --git a/layouts/joomla/toolbar/help.php b/layouts/joomla/toolbar/help.php deleted file mode 100644 index df9e2109c0e6e..0000000000000 --- a/layouts/joomla/toolbar/help.php +++ /dev/null @@ -1,23 +0,0 @@ - - onclick="" rel="help" class="btn btn-outline-info btn-sm"> - - - diff --git a/layouts/joomla/toolbar/link.php b/layouts/joomla/toolbar/link.php index 0149f0c138841..f6e705d3945e6 100644 --- a/layouts/joomla/toolbar/link.php +++ b/layouts/joomla/toolbar/link.php @@ -9,13 +9,26 @@ defined('JPATH_BASE') or die; -$id = isset($displayData['id']) ? $displayData['id'] : ''; -$doTask = $displayData['doTask']; -$class = $displayData['class']; -$text = $displayData['text']; -$margin = (strpos($doTask, 'index.php?option=com_config') === false) ? '' : ' ml-auto'; +/** + * @var int $id + * @var string $name + * @var string $class + * @var string $text + * @var string $btnClass + * @var string $tagName + * @var string $htmlAttributes + */ +extract($displayData, EXTR_OVERWRITE); + +$margin = (strpos($url ?? '', 'index.php?option=com_config') === false) ? '' : ' ml-auto'; +$target = empty($target) ? '' : 'target="' . $target . '"'; ?> - class="btn btn-outline-danger btn-sm" onclick="location.href='';"> + + > - + diff --git a/layouts/joomla/toolbar/popup.php b/layouts/joomla/toolbar/popup.php index ed24ea27991ab..f41bb2b6741b3 100644 --- a/layouts/joomla/toolbar/popup.php +++ b/layouts/joomla/toolbar/popup.php @@ -10,6 +10,8 @@ defined('JPATH_BASE') or die; use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; +use Joomla\Utilities\ArrayHelper; HTMLHelper::_('behavior.core'); @@ -20,21 +22,38 @@ * @var string $class * @var string $text * @var string $btnClass - * @var string $group * @var string $tagName + * @var bool $listCheck * @var string $htmlAttributes */ extract($displayData, EXTR_OVERWRITE); $tagName = $tagName ?? 'button'; + +$modalAttrs['data-toggle'] = 'modal'; + +if (!empty($listCheck)) +{ + Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); + Text::script('ERROR'); + $message = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; + $alert = "Joomla.renderMessages(" . $message . ")"; + + $modalAttrs['onclick'] = << < id="" value="" class="" - data-toggle="modal" - data-target="#" + > diff --git a/layouts/joomla/toolbar/standard.php b/layouts/joomla/toolbar/standard.php index 4bfc565ebdcf5..8e7a730aeb8ba 100644 --- a/layouts/joomla/toolbar/standard.php +++ b/layouts/joomla/toolbar/standard.php @@ -15,7 +15,7 @@ /** * @var int $id - * @var string $doTask + * @var string $onclick * @var string $class * @var string $text * @var string $btnClass @@ -31,14 +31,14 @@ ?> - href="#" onclick="" class="dropdown-item"> + href="#" onclick="" class="dropdown-item"> < id="" - onclick="" + onclick="" class="" > diff --git a/libraries/src/Toolbar/Legacy/BasicButton.php b/libraries/src/Toolbar/Legacy/BasicButton.php new file mode 100644 index 0000000000000..41968e73d888d --- /dev/null +++ b/libraries/src/Toolbar/Legacy/BasicButton.php @@ -0,0 +1,46 @@ +name($name) ->text($text) - ->list($list) + ->listCheck($list) ->message($msg) ->task($task); @@ -90,16 +90,16 @@ public function getButtonClass(string $name): string * * @since 3.0 */ - protected function _getCommand($name, $task, $list) + protected function _getCommand() { \JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); \JText::script('ERROR'); $msg = $this->getMessage(); - $cmd = "if (confirm('" . $msg . "')) { Joomla.submitbutton('" . $task . "'); }"; + $cmd = "if (confirm('" . $msg . "')) { Joomla.submitbutton('" . $this->getTask() . "'); }"; - if ($list) + if ($this->getListCheck()) { $message = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; $alert = "Joomla.renderMessages(" . $message . ")"; diff --git a/libraries/src/Toolbar/Legacy/CustomButton.php b/libraries/src/Toolbar/Legacy/CustomButton.php index 503bc916055dd..a0380002a9c89 100644 --- a/libraries/src/Toolbar/Legacy/CustomButton.php +++ b/libraries/src/Toolbar/Legacy/CustomButton.php @@ -15,16 +15,24 @@ /** * Renders a custom button * + * @method self html(string $value) + * @method string getHtml() + * * @since 3.0 */ class CustomButton extends ToolbarButton { /** - * Button type + * renderButton + * + * @param array $options * - * @var string + * @return string */ - protected $_name = 'Custom'; + protected function renderButton(array &$options): string + { + return (string) ($options['html'] ?? ''); + } /** * Fetch the HTML for the button @@ -43,18 +51,17 @@ public function fetchButton($type = 'Custom', $html = '', $id = 'custom') } /** - * Get the button CSS Id + * getAccessors * - * @param string $type Not used. - * @param string $html Not used. - * @param string $id The id prefix for the button. - * - * @return string Button CSS Id - * - * @since 3.0 + * @return array */ - public function fetchId($type = 'Custom', $html = '', $id = 'custom') + protected static function getAccessors(): array { - return $this->parent->getName() . '-' . $id; + return array_merge( + parent::getAccessors(), + [ + 'html', + ] + ); } } diff --git a/libraries/src/Toolbar/Legacy/HelpButton.php b/libraries/src/Toolbar/Legacy/HelpButton.php index 111034316264c..ceae78e53ac53 100644 --- a/libraries/src/Toolbar/Legacy/HelpButton.php +++ b/libraries/src/Toolbar/Legacy/HelpButton.php @@ -17,14 +17,34 @@ /** * Renders a help popup window button * + * @method self ref(string $value) + * @method self component(string $value) + * @method self useComponent(bool $value) + * @method self url(string $value) + * @method string getRef() + * @method string getComponent() + * @method bool getUseComponent() + * @method string getUrl() + * * @since 3.0 */ -class HelpButton extends ToolbarButton +class HelpButton extends BasicButton { /** - * @var string Button type + * prepareOptions + * + * @param array $options + * + * @return void */ - protected $_name = 'Help'; + protected function prepareOptions(array &$options) + { + $options['text'] = $options['text'] ?: \JText::_('JTOOLBAR_HELP'); + $options['icon'] = $options['icon'] ?? 'fa fa-question'; + $options['button_class'] = $options['button_class'] ?? 'btn btn-outline-info btn-sm'; + + parent::prepareOptions($options); + } /** * Fetches the button HTML code. @@ -41,35 +61,13 @@ class HelpButton extends ToolbarButton */ public function fetchButton($type = 'Help', $ref = '', $com = false, $override = null, $component = null) { - // Store all data to the options array for use with JLayout - $options = array(); - $options['text'] = \JText::_('JTOOLBAR_HELP'); - $options['doTask'] = $this->_getCommand($ref, $com, $override, $component); - $options['id'] = $this->fetchId(); + $this->name('help') + ->ref($ref) + ->useComponent($com) + ->component($component) + ->url($override); - if ($options['id']) - { - $options['id'] = ' id="' . $options['id'] . '"'; - } - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.help'); - - return $layout->render($options); - } - - /** - * Get the button id - * - * Redefined from JButton class - * - * @return string Button CSS Id - * - * @since 3.0 - */ - public function fetchId() - { - return $this->parent->getName() . '-help'; + return $this->renderButton($this->options); } /** @@ -84,13 +82,31 @@ public function fetchId() * * @since 3.0 */ - protected function _getCommand($ref, $com, $override, $component) + protected function _getCommand() { // Get Help URL - $url = Help::createUrl($ref, $com, $override, $component); + $url = Help::createUrl($this->getRef(), $this->getUseComponent(), $this->getUrl(), $this->getComponent()); $url = htmlspecialchars($url, ENT_QUOTES); $cmd = "Joomla.popupWindow('$url', '" . \JText::_('JHELP', true) . "', 700, 500, 1)"; return $cmd; } + + /** + * getAccessors + * + * @return array + */ + protected static function getAccessors(): array + { + return array_merge( + parent::getAccessors(), + [ + 'ref', + 'useComponent', + 'component', + 'url' + ] + ); + } } diff --git a/libraries/src/Toolbar/Legacy/LinkButton.php b/libraries/src/Toolbar/Legacy/LinkButton.php index 1e71c32d01aaf..43c875dfd943c 100644 --- a/libraries/src/Toolbar/Legacy/LinkButton.php +++ b/libraries/src/Toolbar/Legacy/LinkButton.php @@ -10,80 +10,77 @@ defined('JPATH_PLATFORM') or die; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a link button * + * @method self url(string $value) + * @method self target(string $value) + * @method string getUrl() + * @method string getTarget() + * * @since 3.0 */ class LinkButton extends ToolbarButton { /** - * Button type - * @var string + * Property layout. + * + * @var string */ - protected $_name = 'Link'; + protected $layout = 'joomla.toolbar.link'; /** - * Fetch the HTML for the button - * - * @param string $type Unused string. - * @param string $name Name to be used as apart of the id - * @param string $text Button text - * @param string $url The link url + * prepareOptions * - * @return string HTML string for the button + * @param array $options * - * @since 3.0 + * @return void */ - public function fetchButton($type = 'Link', $name = 'back', $text = '', $url = null) + protected function prepareOptions(array &$options) { - // Store all data to the options array for use with JLayout - $options = array(); - $options['text'] = \JText::_($text); - $options['class'] = $this->fetchIconClass($name); - $options['doTask'] = $this->_getCommand($url); - $options['id'] = $this->fetchId('Link', $name); - - if ($options['id']) - { - $options['id'] = ' id="' . $options['id'] . '"'; - } + parent::prepareOptions($options); - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.link'); - - return $layout->render($options); + unset($options['attributes']['type']); } /** - * Get the button CSS Id + * Fetch the HTML for the button * - * @param string $type The button type. - * @param string $name The name of the button. + * @param string $type Unused string. + * @param string $name Name to be used as apart of the id + * @param string $text Button text + * @param string $url The link url * - * @return string Button CSS Id + * @return string HTML string for the button * * @since 3.0 */ - public function fetchId($type = 'Link', $name = '') + public function fetchButton($type = 'Link', $name = 'back', $text = '', $url = null) { - return $this->parent->getName() . '-' . $name; + $this->name($name) + ->text($text) + ->url($url); + + return $this->renderButton($this->options); } /** - * Get the JavaScript command for the button + * getAccessors * - * @param object $url Button definition - * - * @return string JavaScript command string - * - * @since 3.0 + * @return array */ - protected function _getCommand($url) + protected static function getAccessors(): array { - return $url; + return array_merge( + parent::getAccessors(), + [ + 'url', + 'target' + ] + ); } } diff --git a/libraries/src/Toolbar/Legacy/PopupButton.php b/libraries/src/Toolbar/Legacy/PopupButton.php index db34cccdb9c17..d2b72adde9205 100644 --- a/libraries/src/Toolbar/Legacy/PopupButton.php +++ b/libraries/src/Toolbar/Legacy/PopupButton.php @@ -28,6 +28,7 @@ * @method self title(string $value) * @method self footer(string $value) * @method self selector(string $value) + * @method self listCheck(bool $value) * @method string getUrl() * @method int getIframeWidth() * @method int getIframeHeight() @@ -37,6 +38,7 @@ * @method string getTitle() * @method string getFooter() * @method string getSelector() + * @method bool getListCheck() * * @since 3.0 */ @@ -58,6 +60,10 @@ class PopupButton extends ToolbarButton */ protected function prepareOptions(array &$options) { + $options['icon'] = $options['icon'] ?? 'fa fa-square'; + + parent::prepareOptions($options); + $options['doTask'] = $this->_getCommand($this->getUrl()); $options['selector'] = $options['selector'] ?? 'modal-' . $this->getName(); @@ -209,9 +215,9 @@ protected static function getAccessors(): array 'onclose', 'title', 'footer', - 'selector' + 'selector', + 'listCheck', ] ); } - } diff --git a/libraries/src/Toolbar/Legacy/StandardButton.php b/libraries/src/Toolbar/Legacy/StandardButton.php index 0a1c3a7485a47..fc2308feb400f 100644 --- a/libraries/src/Toolbar/Legacy/StandardButton.php +++ b/libraries/src/Toolbar/Legacy/StandardButton.php @@ -11,18 +11,16 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Language\Text; -use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a standard button * - * @method self list(bool $value) - * @method bool getList() + * @method self listCheck(bool $value) + * @method bool getListCheck() * * @since 3.0 */ -class StandardButton extends ToolbarButton +class StandardButton extends BasicButton { /** * Property layout. @@ -40,7 +38,9 @@ class StandardButton extends ToolbarButton */ protected function prepareOptions(array &$options) { - $options['doTask'] = $this->_getCommand($options['text'], $this->getTask(), $this->getList()); + parent::prepareOptions($options); + + $options['onclick'] = $options['onclick'] ?? $this->_getCommand(); $options['group'] = $this->getGroup(); if (empty($options['is_child'])) @@ -70,7 +70,7 @@ public function fetchButton($type = 'Standard', $name = '', $text = '', $task = $this->name($name) ->text($text) ->task($task) - ->list($list) + ->listCheck($list) ->group($group); return $this->renderButton($this->options); @@ -118,22 +118,18 @@ public function getButtonClass(string $name): string /** * Get the JavaScript command for the button * - * @param string $name The task name as seen by the user - * @param string $task The task used by the application - * @param boolean $list True is requires a list confirmation. - * * @return string JavaScript command string * * @since 3.0 */ - protected function _getCommand($name, $task, $list) + protected function _getCommand() { Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); Text::script('ERROR'); - $cmd = "Joomla.submitbutton('" . $task . "');"; + $cmd = "Joomla.submitbutton('" . $this->getTask() . "');"; - if ($list) + if ($this->getListCheck()) { $messages = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; $alert = "Joomla.renderMessages(" . $messages . ")"; @@ -153,7 +149,8 @@ protected static function getAccessors(): array return array_merge( parent::getAccessors(), [ - 'list', + 'listCheck', + 'group' ] ); } diff --git a/libraries/src/Toolbar/Toolbar.php b/libraries/src/Toolbar/Toolbar.php index 6001c8b3ce7ff..6e59ca65d7e31 100644 --- a/libraries/src/Toolbar/Toolbar.php +++ b/libraries/src/Toolbar/Toolbar.php @@ -37,13 +37,6 @@ class Toolbar */ protected $_bar = []; - /** - * Loaded buttons - * - * @var array - */ - protected $_buttons = []; - /** * Directories, where button types can be stored. * @@ -301,13 +294,6 @@ public function renderButton(&$node) */ public function loadButtonType($type, $new = false) { - $signature = md5($type); - - if ($new === false && isset($this->_buttons[$signature])) - { - return $this->_buttons[$signature]; - } - if (!class_exists('Joomla\\CMS\\Toolbar\\ToolbarButton')) { \JLog::add(\JText::_('JLIB_HTML_BUTTON_BASE_CLASS'), \JLog::WARNING, 'jerror'); @@ -318,7 +304,7 @@ public function loadButtonType($type, $new = false) // For B/C, catch the exceptions thrown by the factory try { - $this->_buttons[$signature] = $this->factory->createButton($this, $type); + return $this->factory->createButton($this, $type); } catch (\InvalidArgumentException $e) { @@ -326,8 +312,6 @@ public function loadButtonType($type, $new = false) return false; } - - return $this->_buttons[$signature]; } /** diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/ToolbarButton.php index 2ad40fc8ecec5..282f36741e42a 100644 --- a/libraries/src/Toolbar/ToolbarButton.php +++ b/libraries/src/Toolbar/ToolbarButton.php @@ -19,15 +19,15 @@ * @method self text(string $value) * @method self task(string $value) * @method self icon(string $value) - * @method self group(bool $value) * @method self buttonClass(string $value) * @method self attributes(array $value) - * @method string getText() - * @method string getTask() - * @method string getIcon() - * @method bool getGroup() - * @method string getButtonClass() - * @method array getAttributes() + * @method self onclick(array $value) + * @method string getText() + * @method string getTask() + * @method string getIcon() + * @method string getButtonClass() + * @method array getAttributes() + * @method string getOnclick() * * @since __DEPLOY_VERSION__ */ @@ -91,7 +91,23 @@ public function __construct(string $name = '', string $text = '', string $task = */ protected function prepareOptions(array &$options) { - // + $options['name'] = $this->getName(); + $options['text'] = Text::_($this->getText()); + $options['class'] = $this->getIcon() ?: $this->fetchIconClass($this->getName()); + $options['id'] = $this->fetchId(); + + if (!empty($options['is_child'])) + { + $options['tagName'] = 'a'; + $options['btnClass'] = ($options['button_class'] ?? '') . ' dropdown-item'; + $options['attributes']['href'] = '#'; + } + else + { + $options['tagName'] = 'button'; + $options['btnClass'] = ($options['button_class'] ?? '') . ' btn btn-sm btn-outline-primary'; + $options['attributes']['type'] = 'button'; + } } /** @@ -183,25 +199,6 @@ public function render(&$definition = null) */ protected function renderButton(array &$options): string { - $options['name'] = $this->getName(); - $options['text'] = Text::_($this->getText()); - $options['class'] = $this->fetchIconClass($this->getIcon() ?: $this->getName()); - $options['group'] = $this->getGroup(); - $options['id'] = $this->fetchId(); - - if (!empty($options['is_child'])) - { - $options['tagName'] = 'a'; - $options['btnClass'] = ($options['button_class'] ?? '') . ' dropdown-item'; - $options['attributes']['href'] = '#'; - } - else - { - $options['tagName'] = 'button'; - $options['btnClass'] = ($options['button_class'] ?? '') . ' btn btn-sm btn-outline-primary'; - $options['attributes']['type'] = 'button'; - } - $this->prepareOptions($options); // Prepare custom attributes. @@ -457,8 +454,8 @@ protected static function getAccessors(): array 'text', 'task', 'icon', - 'group', 'attributes', + 'onclick', 'buttonClass' => 'button_class' ]; } From e514f70c54a4b0909dd6dea247ea2fd80d587b24 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Mon, 12 Feb 2018 02:11:04 +0800 Subject: [PATCH 08/31] Complete basic butons usage --- .../com_content/View/Article/HtmlView.php | 19 +- .../com_content/View/Articles/HtmlView.php | 41 +--- layouts/joomla/toolbar/base.php | 3 +- .../{Legacy => Button}/ApplyButton.php | 2 +- .../{Legacy => Button}/BasicButton.php | 2 +- .../{Legacy => Button}/ConfirmButton.php | 2 +- .../{Legacy => Button}/CustomButton.php | 2 +- .../Toolbar/{Legacy => Button}/HelpButton.php | 2 +- .../Toolbar/{Legacy => Button}/LinkButton.php | 2 +- .../{Legacy => Button}/PopupButton.php | 2 +- .../{Legacy => Button}/SeparatorButton.php | 2 +- .../{Legacy => Button}/SliderButton.php | 2 +- .../src/Toolbar/Button/StandardButton.php | 145 +++++++------ .../Toolbar/ContainerAwareToolbarFactory.php | 2 +- libraries/src/Toolbar/CoreButtonsTrait.php | 190 ++++++++++++++++++ .../src/Toolbar/Legacy/StandardButton.php | 157 --------------- libraries/src/Toolbar/Toolbar.php | 55 ++++- libraries/src/Toolbar/ToolbarButton.php | 9 +- 18 files changed, 347 insertions(+), 292 deletions(-) rename libraries/src/Toolbar/{Legacy => Button}/ApplyButton.php (98%) rename libraries/src/Toolbar/{Legacy => Button}/BasicButton.php (96%) rename libraries/src/Toolbar/{Legacy => Button}/ConfirmButton.php (98%) rename libraries/src/Toolbar/{Legacy => Button}/CustomButton.php (97%) rename libraries/src/Toolbar/{Legacy => Button}/HelpButton.php (98%) rename libraries/src/Toolbar/{Legacy => Button}/LinkButton.php (97%) rename libraries/src/Toolbar/{Legacy => Button}/PopupButton.php (99%) rename libraries/src/Toolbar/{Legacy => Button}/SeparatorButton.php (95%) rename libraries/src/Toolbar/{Legacy => Button}/SliderButton.php (98%) create mode 100644 libraries/src/Toolbar/CoreButtonsTrait.php delete mode 100644 libraries/src/Toolbar/Legacy/StandardButton.php diff --git a/administrator/components/com_content/View/Article/HtmlView.php b/administrator/components/com_content/View/Article/HtmlView.php index 7f4898cc7756e..1f20beddf7d7d 100644 --- a/administrator/components/com_content/View/Article/HtmlView.php +++ b/administrator/components/com_content/View/Article/HtmlView.php @@ -12,8 +12,8 @@ defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; -use Joomla\CMS\Toolbar\Legacy\LinkButton; -use Joomla\CMS\Toolbar\Legacy\PopupButton; +use Joomla\CMS\Toolbar\Button\LinkButton; +use Joomla\CMS\Toolbar\Button\PopupButton; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Toolbar\ToolbarHelper; @@ -130,12 +130,6 @@ protected function addToolbar() 'pencil-2 article-add' ); - $bar->appendButton(new LinkButton('back')) - ->text('Back') - ->target('_parent') - ->url('https://help.joomla.org/proxy?keyref=Help40:Content_Article_Manager_Edit&lang=en'); - - // For new records, check the create permission. if ($isNew && (count($user->getAuthorisedCategories('com_content', 'core.create')) > 0)) { @@ -191,15 +185,6 @@ protected function addToolbar() \JLoader::register('ContentHelperPreview', JPATH_ADMINISTRATOR . '/components/com_content/helpers/preview.php'); $url = \ContentHelperPreview::url($this->item); ToolbarHelper::preview($url, \JText::_('JGLOBAL_PREVIEW'), 'eye', 80, 90); - - Toolbar::getInstance()->appendButton( - (new PopupButton('preview')) - ->url($url) - ->text('JGLOBAL_PREVIEW') - ->icon('eye') - ->bodyHeight(80) - ->modalWidth(90) - ); } \JToolbarHelper::cancel('article.cancel', 'JTOOLBAR_CLOSE'); diff --git a/administrator/components/com_content/View/Articles/HtmlView.php b/administrator/components/com_content/View/Articles/HtmlView.php index 12185e104da6e..5d19bd725f4ec 100644 --- a/administrator/components/com_content/View/Articles/HtmlView.php +++ b/administrator/components/com_content/View/Articles/HtmlView.php @@ -12,10 +12,10 @@ defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; -use Joomla\CMS\Toolbar\Legacy\CustomButton; -use Joomla\CMS\Toolbar\Legacy\PopupButton; -use Joomla\CMS\Toolbar\Legacy\SeparatorButton; -use Joomla\CMS\Toolbar\Legacy\StandardButton; +use Joomla\CMS\Toolbar\Button\CustomButton; +use Joomla\CMS\Toolbar\Button\PopupButton; +use Joomla\CMS\Toolbar\Button\SeparatorButton; +use Joomla\CMS\Toolbar\Button\StandardButton; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Toolbar\ToolbarHelper; use Joomla\Component\Content\Administrator\Helper\ContentHelper; @@ -162,39 +162,6 @@ protected function addToolbar() // Get the toolbar object instance $bar = Toolbar::getInstance('toolbar'); - $bar->appendButton(new StandardButton('new')) - ->text('JTOOLBAR_NEW') - ->task('article.add') - ->icon('new') - ->buttonClass('btn btn-success btn-sm') - ->children( - function (Toolbar $child) - { - $child->appendButton(new StandardButton('test')) - ->text('Test') - ->task('article.add') - ->icon('new'); - - $child->appendButton(new SeparatorButton('sp')) - ->text('Header'); - - $child->appendButton(new StandardButton('test2')) - ->text('Test2') - ->task('article.add') - ->icon('remove'); - } - ); - - $bar->appendButton( - (new PopupButton('preview')) - ->url('http://localhost/joomla/40dev/index.php?option=com_content&view=article&id=66&catid=65&Itemid=435') -// ->selector('#collapseModal') - ->text('JGLOBAL_PREVIEW') - ->icon('eye') - ->bodyHeight(80) - ->modalWidth(90) - ); - ToolbarHelper::title(\JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article'); if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0) diff --git a/layouts/joomla/toolbar/base.php b/layouts/joomla/toolbar/base.php index 90461a954ec0b..0436fdd64d323 100644 --- a/layouts/joomla/toolbar/base.php +++ b/layouts/joomla/toolbar/base.php @@ -22,7 +22,8 @@
- diff --git a/libraries/src/Toolbar/Legacy/ApplyButton.php b/libraries/src/Toolbar/Button/ApplyButton.php similarity index 98% rename from libraries/src/Toolbar/Legacy/ApplyButton.php rename to libraries/src/Toolbar/Button/ApplyButton.php index c224e3a63c1f7..aa599ccd3d0bc 100644 --- a/libraries/src/Toolbar/Legacy/ApplyButton.php +++ b/libraries/src/Toolbar/Button/ApplyButton.php @@ -7,7 +7,7 @@ * @license GNU General Public License version 2 or later; see LICENSE */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/BasicButton.php b/libraries/src/Toolbar/Button/BasicButton.php similarity index 96% rename from libraries/src/Toolbar/Legacy/BasicButton.php rename to libraries/src/Toolbar/Button/BasicButton.php index 41968e73d888d..45114e74fb638 100644 --- a/libraries/src/Toolbar/Legacy/BasicButton.php +++ b/libraries/src/Toolbar/Button/BasicButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/ConfirmButton.php b/libraries/src/Toolbar/Button/ConfirmButton.php similarity index 98% rename from libraries/src/Toolbar/Legacy/ConfirmButton.php rename to libraries/src/Toolbar/Button/ConfirmButton.php index 6fb71675654ee..ce00aaf2783af 100644 --- a/libraries/src/Toolbar/Legacy/ConfirmButton.php +++ b/libraries/src/Toolbar/Button/ConfirmButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/CustomButton.php b/libraries/src/Toolbar/Button/CustomButton.php similarity index 97% rename from libraries/src/Toolbar/Legacy/CustomButton.php rename to libraries/src/Toolbar/Button/CustomButton.php index a0380002a9c89..00db9f7fe65e6 100644 --- a/libraries/src/Toolbar/Legacy/CustomButton.php +++ b/libraries/src/Toolbar/Button/CustomButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/HelpButton.php b/libraries/src/Toolbar/Button/HelpButton.php similarity index 98% rename from libraries/src/Toolbar/Legacy/HelpButton.php rename to libraries/src/Toolbar/Button/HelpButton.php index ceae78e53ac53..de4c027f27328 100644 --- a/libraries/src/Toolbar/Legacy/HelpButton.php +++ b/libraries/src/Toolbar/Button/HelpButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/LinkButton.php b/libraries/src/Toolbar/Button/LinkButton.php similarity index 97% rename from libraries/src/Toolbar/Legacy/LinkButton.php rename to libraries/src/Toolbar/Button/LinkButton.php index 43c875dfd943c..a3005ed35346d 100644 --- a/libraries/src/Toolbar/Legacy/LinkButton.php +++ b/libraries/src/Toolbar/Button/LinkButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/PopupButton.php b/libraries/src/Toolbar/Button/PopupButton.php similarity index 99% rename from libraries/src/Toolbar/Legacy/PopupButton.php rename to libraries/src/Toolbar/Button/PopupButton.php index d2b72adde9205..fa003d136b044 100644 --- a/libraries/src/Toolbar/Legacy/PopupButton.php +++ b/libraries/src/Toolbar/Button/PopupButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/SeparatorButton.php b/libraries/src/Toolbar/Button/SeparatorButton.php similarity index 95% rename from libraries/src/Toolbar/Legacy/SeparatorButton.php rename to libraries/src/Toolbar/Button/SeparatorButton.php index eb0120b3c316e..d5e2c61b1cf6a 100644 --- a/libraries/src/Toolbar/Legacy/SeparatorButton.php +++ b/libraries/src/Toolbar/Button/SeparatorButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Legacy/SliderButton.php b/libraries/src/Toolbar/Button/SliderButton.php similarity index 98% rename from libraries/src/Toolbar/Legacy/SliderButton.php rename to libraries/src/Toolbar/Button/SliderButton.php index e1b1df2597c1d..6aaf419d8b215 100644 --- a/libraries/src/Toolbar/Legacy/SliderButton.php +++ b/libraries/src/Toolbar/Button/SliderButton.php @@ -6,7 +6,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace Joomla\CMS\Toolbar\Legacy; +namespace Joomla\CMS\Toolbar\Button; defined('JPATH_PLATFORM') or die; diff --git a/libraries/src/Toolbar/Button/StandardButton.php b/libraries/src/Toolbar/Button/StandardButton.php index 1593ac3bacb6f..ee7550ff27276 100644 --- a/libraries/src/Toolbar/Button/StandardButton.php +++ b/libraries/src/Toolbar/Button/StandardButton.php @@ -10,17 +10,48 @@ defined('JPATH_PLATFORM') or die; -use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; -use Joomla\CMS\Toolbar\ToolbarButton; +use Joomla\CMS\Language\Text; /** * Renders a standard button * + * @method self listCheck(bool $value) + * @method bool getListCheck() + * * @since 3.0 */ -class StandardButton extends ToolbarButton +class StandardButton extends BasicButton { + /** + * Property layout. + * + * @var string + */ + protected $layout = 'joomla.toolbar.standard'; + + /** + * prepareOptions + * + * @param array $options + * + * @return void + */ + protected function prepareOptions(array &$options) + { + parent::prepareOptions($options); + + if (empty($options['is_child'])) + { + $class = $this->getButtonClass($this->getName()); + + $options['btnClass'] = ($options['button_class'] ?? $class); + $options['caretClass'] = ($options['button_class'] ?? $class); + } + + $options['onclick'] = $options['onclick'] ?? $this->_getCommand(); + $options['group'] = $this->getGroup(); + } + /** * Fetch the HTML for the button * @@ -34,104 +65,74 @@ class StandardButton extends ToolbarButton * @return string HTML string for the button * * @since 3.0 + * + * @deprecated 5.0 Use render() instead. */ public function fetchButton($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $group = false) { - // Store all data to the options array for use with JLayout - $options = array(); + $this->name($name) + ->text($text) + ->task($task) + ->listCheck($list) + ->group($group); - $options['text'] = \JText::_($text); - $options['class'] = $this->fetchIconClass($name); - $options['doTask'] = $this->_getCommand($options['text'], $task, $list); - $options['group'] = $group; - $options['id'] = $this->fetchId('Standard', $name); - $options['btnClass'] = 'button-' . $name; - - if ($options['id']) - { - $options['id'] = ' id="' . $options['id'] . '"'; - } + return $this->renderButton($this->options); + } + /** + * getButtonClass + * + * @param string $name + * + * @return string + */ + public function getButtonClass(string $name): string + { switch ($name) { case 'apply': case 'new': - $options['btnClass'] .= ' btn btn-sm btn-success'; - break; + return ' btn btn-sm btn-success'; case 'save': case 'save-new': case 'save-copy': case 'save-close': case 'publish': - $options['btnClass'] .= ' btn btn-sm btn-outline-success'; - break; + return ' btn btn-sm btn-outline-success'; case 'unpublish': - $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; - break; + return ' btn btn-sm btn-outline-danger'; case 'featured': - $options['btnClass'] .= ' btn btn-sm btn-outline-warning'; - break; + return ' btn btn-sm btn-outline-warning'; case 'cancel': - $options['btnClass'] .= ' btn btn-sm btn-danger'; - break; + return ' btn btn-sm btn-danger'; case 'trash': - $options['btnClass'] .= ' btn btn-sm btn-outline-danger'; - break; - + return ' btn btn-sm btn-outline-danger'; default: - $options['btnClass'] .= ' btn btn-sm btn-outline-primary'; + return ' btn btn-sm btn-outline-primary'; } - - // Instantiate a new JLayoutFile instance and render the layout - $layout = new FileLayout('joomla.toolbar.standard'); - - return $layout->render($options); - } - - /** - * Get the button CSS Id - * - * @param string $type Unused string. - * @param string $name Name to be used as apart of the id - * @param string $text Button text - * @param string $task The task associated with the button - * @param boolean $list True to allow use of lists - * @param boolean $hideMenu True to hide the menu on click - * - * @return string Button CSS Id - * - * @since 3.0 - */ - public function fetchId($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $hideMenu = false) - { - return $this->parent->getName() . '-' . $name; } /** * Get the JavaScript command for the button * - * @param string $name The task name as seen by the user - * @param string $task The task used by the application - * @param boolean $list True is requires a list confirmation. - * * @return string JavaScript command string * * @since 3.0 */ - protected function _getCommand($name, $task, $list) + protected function _getCommand() { - \JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); - \JText::script('ERROR'); + Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); + Text::script('ERROR'); - $cmd = "Joomla.submitbutton('" . $task . "');"; + $cmd = "Joomla.submitbutton('" . $this->getTask() . "');"; - if ($list) + if ($this->getListCheck()) { $messages = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; $alert = "Joomla.renderMessages(" . $messages . ")"; @@ -140,4 +141,20 @@ protected function _getCommand($name, $task, $list) return $cmd; } + + /** + * getAccessors + * + * @return array + */ + protected static function getAccessors(): array + { + return array_merge( + parent::getAccessors(), + [ + 'listCheck', + 'group' + ] + ); + } } diff --git a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php index 680b1f316d655..7459a56ad3193 100644 --- a/libraries/src/Toolbar/ContainerAwareToolbarFactory.php +++ b/libraries/src/Toolbar/ContainerAwareToolbarFactory.php @@ -97,7 +97,7 @@ public function createToolbar(string $name = 'toolbar'): Toolbar private function loadButtonClass(string $type) { $buttonClasses = [ - 'Joomla\\CMS\\Toolbar\\Legacy\\' . ucfirst($type) . 'Button', + 'Joomla\\CMS\\Toolbar\\Button\\' . ucfirst($type) . 'Button', // @deprecated 5.0 'JToolbarButton' . ucfirst($type), ]; diff --git a/libraries/src/Toolbar/CoreButtonsTrait.php b/libraries/src/Toolbar/CoreButtonsTrait.php new file mode 100644 index 0000000000000..68c6fc749033f --- /dev/null +++ b/libraries/src/Toolbar/CoreButtonsTrait.php @@ -0,0 +1,190 @@ +separatorButton($name, $text); + } + + public function preview(string $name = 'preview', string $text = 'JGLOBAL_PREVIEW'): PopupButton + { + return $this->popupButton($name, $text) + ->iframeWidth(640) + ->iframeHeight(480); + } + + public function help(string $name = 'help', string $text = 'JTOOLBAR_HELP'): HelpButton + { + return $this->helpButton($name, $text); + } + + public function back(string $name = 'back', string $text = 'JTOOLBAR_BACK'): LinkButton + { + return $this->link($name, $text) + ->url('javascript:history.back();'); + } + + public function link(string $name = 'link', string $text): LinkButton + { + return $this->linkButton($name, $text); + } + + public function mediaManager($directory, string $name = 'upload', string $text = 'JTOOLBAR_UPLOAD'): PopupButton + { + return $this->popupButton($name, $text) + ->iframeWidth(800) + ->iframeHeight(520) + ->url('index.php?option=com_media&tmpl=component&task=popupUpload&folder=' . $directory); + } + + public function makeDefault(string $name = 'default', string $text = 'JTOOLBAR_DEFAULT'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function assign(string $name = 'assign', string $text = 'JTOOLBAR_ASSIGN'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function addNew(string $name = 'new', string $text = 'JTOOLBAR_NEW'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function publish(string $name = 'publish', string $text = 'JTOOLBAR_PUBLISH'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function unpublish(string $name = 'unpublish', string $text = 'JTOOLBAR_UNPUBLISH'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function archive(string $name = 'archive', string $text = 'JTOOLBAR_ARCHIVE'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function unarchive(string $name = 'unarchive', string $text = 'JTOOLBAR_UNARCHIVE'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function edit(string $name = 'edit', string $text = 'JTOOLBAR_EDIT'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function editHtml(string $name = 'edithtml', string $text = 'JTOOLBAR_EDIT_HTML'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function editCss(string $name = 'editcss', string $text = 'JTOOLBAR_EDIT_CSS'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function delete(string $name = 'delete', string $text = 'JTOOLBAR_DELETE'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function trash(string $name = 'trash', string $text = 'JTOOLBAR_TRASH'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function apply(string $name = 'apply', string $text = 'JTOOLBAR_APPLY'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function save(string $name = 'save', string $text = 'JTOOLBAR_SAVE'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function save2new(string $name = 'save2new', string $text = 'JTOOLBAR_SAVE_AND_NEW'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function save2copy(string $name = 'save2copy', string $text = 'JTOOLBAR_SAVE_AS_COPY'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function checkin(string $name = 'checkin', string $text = 'JTOOLBAR_CHECKIN'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function cancel(string $name = 'cancel', string $text = 'JTOOLBAR_CANCEL'): StandardButton + { + return $this->standardButton($name, $text); + } + + public function preferences($component, string $name = 'options', string $text = 'JToolbar_Options', $path = ''): LinkButton + { + $component = urlencode($component); + $path = urlencode($path); + + $uri = (string) Uri::getInstance(); + $return = urlencode(base64_encode($uri)); + + return $this->linkButton($name, $text) + ->url('index.php?option=com_config&view=component&component=' . $component . '&path=' . $path . '&return=' . $return); + } + + public function versions($typeAlias, $itemId, $height = 800, $width = 500, string $text = 'JTOOLBAR_VERSIONS'): CustomButton + { + $lang = Factory::getLanguage(); + $lang->load('com_contenthistory', JPATH_ADMINISTRATOR, $lang->getTag(), true); + + /** @var \Joomla\CMS\Table\ContentType $contentTypeTable */ + $contentTypeTable = Table::getInstance('Contenttype'); + $typeId = $contentTypeTable->getTypeId($typeAlias); + + // Options array for JLayout + $options = array(); + $options['title'] = \JText::_($text); + $options['height'] = $height; + $options['width'] = $width; + $options['itemId'] = $itemId; + $options['typeId'] = $typeId; + $options['typeAlias'] = $typeAlias; + + $layout = new FileLayout('joomla.toolbar.versions'); + + return $this->customButton('version', $text) + ->html($layout->render($options)); + } +} diff --git a/libraries/src/Toolbar/Legacy/StandardButton.php b/libraries/src/Toolbar/Legacy/StandardButton.php deleted file mode 100644 index fc2308feb400f..0000000000000 --- a/libraries/src/Toolbar/Legacy/StandardButton.php +++ /dev/null @@ -1,157 +0,0 @@ -_getCommand(); - $options['group'] = $this->getGroup(); - - if (empty($options['is_child'])) - { - $options['btnClass'] = ($options['button_class'] ?? $this->getButtonClass($options['name'])); - } - } - - /** - * Fetch the HTML for the button - * - * @param string $type Unused string. - * @param string $name The name of the button icon class. - * @param string $text Button text. - * @param string $task Task associated with the button. - * @param boolean $list True to allow lists - * @param boolean $group Does the button belong to a group? - * - * @return string HTML string for the button - * - * @since 3.0 - * - * @deprecated 5.0 Use render() instead. - */ - public function fetchButton($type = 'Standard', $name = '', $text = '', $task = '', $list = true, $group = false) - { - $this->name($name) - ->text($text) - ->task($task) - ->listCheck($list) - ->group($group); - - return $this->renderButton($this->options); - } - - /** - * getButtonClass - * - * @param string $name - * - * @return string - */ - public function getButtonClass(string $name): string - { - switch ($name) - { - case 'apply': - case 'new': - return ' btn btn-sm btn-success'; - - case 'save': - case 'save-new': - case 'save-copy': - case 'save-close': - case 'publish': - return ' btn btn-sm btn-outline-success'; - - case 'unpublish': - return ' btn btn-sm btn-outline-danger'; - - case 'featured': - return ' btn btn-sm btn-outline-warning'; - - case 'cancel': - return ' btn btn-sm btn-danger'; - - case 'trash': - return ' btn btn-sm btn-outline-danger'; - - default: - return ' btn btn-sm btn-outline-primary'; - } - } - - /** - * Get the JavaScript command for the button - * - * @return string JavaScript command string - * - * @since 3.0 - */ - protected function _getCommand() - { - Text::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'); - Text::script('ERROR'); - - $cmd = "Joomla.submitbutton('" . $this->getTask() . "');"; - - if ($this->getListCheck()) - { - $messages = "{'error': [Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')]}"; - $alert = "Joomla.renderMessages(" . $messages . ")"; - $cmd = "if (document.adminForm.boxchecked.value == 0) { " . $alert . " } else { " . $cmd . " }"; - } - - return $cmd; - } - - /** - * getAccessors - * - * @return array - */ - protected static function getAccessors(): array - { - return array_merge( - parent::getAccessors(), - [ - 'listCheck', - 'group' - ] - ); - } -} diff --git a/libraries/src/Toolbar/Toolbar.php b/libraries/src/Toolbar/Toolbar.php index 6e59ca65d7e31..7b316cbbbd8d1 100644 --- a/libraries/src/Toolbar/Toolbar.php +++ b/libraries/src/Toolbar/Toolbar.php @@ -12,17 +12,33 @@ use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\FileLayout; +use Joomla\CMS\Toolbar\Button\BasicButton; +use Joomla\CMS\Toolbar\Button\ConfirmButton; +use Joomla\CMS\Toolbar\Button\CustomButton; +use Joomla\CMS\Toolbar\Button\HelpButton; +use Joomla\CMS\Toolbar\Button\LinkButton; +use Joomla\CMS\Toolbar\Button\PopupButton; +use Joomla\CMS\Toolbar\Button\SeparatorButton; use Joomla\CMS\Toolbar\Button\StandardButton; /** * ToolBar handler * - * @method StandardButton standard(string $name = '', $text = '', $task = '', $list = true, $group = false) + * @method StandardButton standardButton(string $name = '', string $text = '', string $task = '') + * @method SeparatorButton separatorButton(string $name = '', string $text = '', string $task = '') + * @method PopupButton popupButton(string $name = '', string $text = '', string $task = '') + * @method LinkButton linkButton(string $name = '', string $text = '', string $task = '') + * @method HelpButton helpButton(string $name = '', string $text = '', string $task = '') + * @method CustomButton customButton(string $name = '', string $text = '', string $task = '') + * @method ConfirmButton confirmButton(string $name = '', string $text = '', string $task = '') + * @method BasicButton basicButton(string $name = '', string $text = '', string $task = '') * * @since 1.5 */ class Toolbar { + use CoreButtonsTrait; + /** * Toolbar name * @@ -394,4 +410,41 @@ public function createChild($name): self { return new static($name, $this->factory); } + + /** + * __call + * + * @param string $name + * @param array $args + * + * @return ToolbarButton + * @throws \Exception + */ + public function __call($name, $args) + { + if (strtolower(substr($name, -6)) === 'button') + { + $type = substr($name, 0, -6); + + $button = $this->loadButtonType($type); + + if ($button === false) + { + throw new \UnexpectedValueException(sprintf('Button type: %s not found.', $type)); + } + + $button->name($args[0] ?? '') + ->text($args[1] ?? ''); + + return $this->appendButton($button); + } + + throw new \BadMethodCallException( + sprintf( + 'Method %s() not found in class: %s', + $name, + get_called_class() + ) + ); + } } diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/ToolbarButton.php index 282f36741e42a..41feab961ae7c 100644 --- a/libraries/src/Toolbar/ToolbarButton.php +++ b/libraries/src/Toolbar/ToolbarButton.php @@ -73,13 +73,11 @@ abstract class ToolbarButton * * @param string $name * @param string $text - * @param string $task */ - public function __construct(string $name = '', string $text = '', string $task = '') + public function __construct(string $name = '', string $text = '') { $this->name($name) - ->text($text) - ->task($task); + ->text($text); } /** @@ -105,7 +103,8 @@ protected function prepareOptions(array &$options) else { $options['tagName'] = 'button'; - $options['btnClass'] = ($options['button_class'] ?? '') . ' btn btn-sm btn-outline-primary'; + $options['btnClass'] = ($options['button_class'] ?? 'btn btn-sm btn-outline-primary'); + $options['caretClass'] = ($options['button_class'] ?? 'btn btn-sm btn-outline-primary'); $options['attributes']['type'] = 'button'; } } From 0334f86b2c7a83c4fdd21e41d0590960ed45cdbe Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Mon, 12 Feb 2018 03:19:39 +0800 Subject: [PATCH 09/31] Replace article buttons --- .../com_content/View/Article/HtmlView.php | 86 ++++++------ .../com_content/View/Articles/HtmlView.php | 46 ++++--- .../src/Toolbar/Button/ConfirmButton.php | 6 +- libraries/src/Toolbar/Button/GroupButton.php | 56 ++++++++ libraries/src/Toolbar/Button/HelpButton.php | 1 + libraries/src/Toolbar/CoreButtonsTrait.php | 128 +++++++++++------- libraries/src/Toolbar/Toolbar.php | 16 +++ 7 files changed, 224 insertions(+), 115 deletions(-) create mode 100644 libraries/src/Toolbar/Button/GroupButton.php diff --git a/administrator/components/com_content/View/Article/HtmlView.php b/administrator/components/com_content/View/Article/HtmlView.php index 1f20beddf7d7d..6134b16ae9cd9 100644 --- a/administrator/components/com_content/View/Article/HtmlView.php +++ b/administrator/components/com_content/View/Article/HtmlView.php @@ -123,74 +123,74 @@ protected function addToolbar() // Built the actions for new and existing records. $canDo = $this->canDo; - $bar = Toolbar::getInstance(); + $toolbar = Toolbar::getInstance(); - \JToolbarHelper::title( + ToolbarHelper::title( \JText::_('COM_CONTENT_PAGE_' . ($checkedOut ? 'VIEW_ARTICLE' : ($isNew ? 'ADD_ARTICLE' : 'EDIT_ARTICLE'))), 'pencil-2 article-add' ); + $saveGroup = $toolbar->groupButton(); + // For new records, check the create permission. if ($isNew && (count($user->getAuthorisedCategories('com_content', 'core.create')) > 0)) { - \JToolbarHelper::saveGroup( - [ - ['apply', 'article.apply'], - ['save', 'article.save'], - ['save2new', 'article.save2new'] - ], - 'btn-success' - ); - - \JToolbarHelper::cancel('article.cancel'); + $saveGroup->children( + function (Toolbar $childBar) + { + $childBar->apply('article.apply'); + $childBar->save('article.save'); + $childBar->save2new('article.save2new'); + } + ); } else { // Since it's an existing record, check the edit permission, or fall back to edit own if the owner. $itemEditable = $canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == $userId); - $toolbarButtons = []; - - // Can't save the record if it's checked out and editable - if (!$checkedOut && $itemEditable) - { - $toolbarButtons[] = ['apply', 'article.apply']; - $toolbarButtons[] = ['save', 'article.save']; - - // We can save this record, but check the create permission to see if we can return to make a new one. - if ($canDo->get('core.create')) - { - $toolbarButtons[] = ['save2new', 'article.save2new']; - } - } - - // If checked out, we can still save - if ($canDo->get('core.create')) - { - $toolbarButtons[] = ['save2copy', 'article.save2copy']; - } - - \JToolbarHelper::saveGroup( - $toolbarButtons, - 'btn-success' - ); + $saveGroup->children( + function (Toolbar $childBar) use ($checkedOut, $itemEditable, $canDo) + { + // Can't save the record if it's checked out and editable + if (!$checkedOut && $itemEditable) + { + $childBar->apply('article.apply'); + $childBar->save('article.save'); + + // We can save this record, but check the create permission to see if we can return to make a new one. + if ($canDo->get('core.create')) + { + $childBar->save2new('article.save2new'); + } + } + + // If checked out, we can still save + if ($canDo->get('core.create')) + { + $childBar->save2copy('article.save2copy'); + } + } + ); if (\JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $itemEditable) { - \JToolbarHelper::versions('com_content.article', $this->item->id); + $toolbar->versions('com_content.article', $this->item->id); } if (!$isNew) { \JLoader::register('ContentHelperPreview', JPATH_ADMINISTRATOR . '/components/com_content/helpers/preview.php'); $url = \ContentHelperPreview::url($this->item); - ToolbarHelper::preview($url, \JText::_('JGLOBAL_PREVIEW'), 'eye', 80, 90); + $toolbar->preview($url, \JText::_('JGLOBAL_PREVIEW')) + ->bodyHeight(80) + ->modalWidth(90); } - - \JToolbarHelper::cancel('article.cancel', 'JTOOLBAR_CLOSE'); } - \JToolbarHelper::divider(); - \JToolbarHelper::help('JHELP_CONTENT_ARTICLE_MANAGER_EDIT'); + $toolbar->cancel('article.cancel', 'JTOOLBAR_CLOSE'); + + $toolbar->divider(); + $toolbar->help('JHELP_CONTENT_ARTICLE_MANAGER_EDIT'); } } diff --git a/administrator/components/com_content/View/Articles/HtmlView.php b/administrator/components/com_content/View/Articles/HtmlView.php index 5d19bd725f4ec..f1e9aab736640 100644 --- a/administrator/components/com_content/View/Articles/HtmlView.php +++ b/administrator/components/com_content/View/Articles/HtmlView.php @@ -160,23 +160,34 @@ protected function addToolbar() $user = \JFactory::getUser(); // Get the toolbar object instance - $bar = Toolbar::getInstance('toolbar'); + $toolbar = Toolbar::getInstance('toolbar'); ToolbarHelper::title(\JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article'); if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0) { - ToolbarHelper::addNew('article.add'); + $toolbar->addNew('article.add'); } if ($canDo->get('core.edit.state')) { - ToolbarHelper::publish('articles.publish', 'JTOOLBAR_PUBLISH', true); - ToolbarHelper::unpublish('articles.unpublish', 'JTOOLBAR_UNPUBLISH', true); - ToolbarHelper::custom('articles.featured', 'featured.png', 'featured_f2.png', 'JFEATURE', true); - ToolbarHelper::custom('articles.unfeatured', 'unfeatured.png', 'featured_f2.png', 'JUNFEATURE', true); - ToolbarHelper::archiveList('articles.archive'); - ToolbarHelper::checkin('articles.checkin'); + $toolbar->publish('articles.publish')->listCheck(true); + + $toolbar->unpublish('articles.unpublish')->listCheck(true); + + $toolbar->standardButton('featured') + ->text('JFEATURE') + ->task('articles.featured') + ->listCheck(true); + + $toolbar->standardButton('unfeatured') + ->text('JUNFEATURE') + ->task('articles.unfeatured') + ->listCheck(true); + + $toolbar->archive('articles.archive')->listCheck(true); + + $toolbar->checkin('articles.checkin')->listCheck(true); } // Add a batch button @@ -184,29 +195,30 @@ protected function addToolbar() && $user->authorise('core.edit', 'com_content') && $user->authorise('core.edit.state', 'com_content')) { - $bar->appendButton( - (new PopupButton('batch')) - ->selector('collapseModal') + $toolbar->popupButton('batch') ->text('JTOOLBAR_BATCH') - ->listCheck(true) - ); + ->selector('collapseModal') + ->listCheck(true); } if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete')) { - ToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'articles.delete', 'JTOOLBAR_EMPTY_TRASH'); + $toolbar->delete('articles.delete') + ->text('JTOOLBAR_EMPTY_TRASH') + ->message('JGLOBAL_CONFIRM_DELETE') + ->listCheck(true); } elseif ($canDo->get('core.edit.state')) { - ToolbarHelper::trash('articles.trash'); + $toolbar->trash('articles.trash')->listCheck(true); } if ($user->authorise('core.admin', 'com_content') || $user->authorise('core.options', 'com_content')) { - ToolbarHelper::preferences('com_content'); + $toolbar->preferences('com_content'); } - ToolbarHelper::help('JHELP_CONTENT_ARTICLE_MANAGER'); + $toolbar->help('JHELP_CONTENT_ARTICLE_MANAGER'); } /** diff --git a/libraries/src/Toolbar/Button/ConfirmButton.php b/libraries/src/Toolbar/Button/ConfirmButton.php index ce00aaf2783af..10ac06c1ad0cc 100644 --- a/libraries/src/Toolbar/Button/ConfirmButton.php +++ b/libraries/src/Toolbar/Button/ConfirmButton.php @@ -11,8 +11,6 @@ defined('JPATH_PLATFORM') or die; use Joomla\CMS\Language\Text; -use Joomla\CMS\Layout\FileLayout; -use Joomla\CMS\Toolbar\ToolbarButton; /** * Renders a standard button with a confirm dialog @@ -33,9 +31,9 @@ class ConfirmButton extends StandardButton */ protected function prepareOptions(array &$options) { - parent::prepareOptions($options); + $options['message'] = Text::_($options['message'] ?? ''); - $options['message'] = Text::_($options['message']); + parent::prepareOptions($options); } /** diff --git a/libraries/src/Toolbar/Button/GroupButton.php b/libraries/src/Toolbar/Button/GroupButton.php new file mode 100644 index 0000000000000..cae196a29bea5 --- /dev/null +++ b/libraries/src/Toolbar/Button/GroupButton.php @@ -0,0 +1,56 @@ +getChildToolbar(); + $hasChildren = count($childToolbar->getItems()) > 0; + + if (!$hasChildren) + { + return ''; + } + + $buttons = $childToolbar->getItems(); + + /** @var ToolbarButton $button */ + $button = array_shift($buttons); + + $childToolbar->setItems($buttons); + + $button->child = $childToolbar; + + return $button->render($definition); + } + +} diff --git a/libraries/src/Toolbar/Button/HelpButton.php b/libraries/src/Toolbar/Button/HelpButton.php index de4c027f27328..dd78083792975 100644 --- a/libraries/src/Toolbar/Button/HelpButton.php +++ b/libraries/src/Toolbar/Button/HelpButton.php @@ -42,6 +42,7 @@ protected function prepareOptions(array &$options) $options['text'] = $options['text'] ?: \JText::_('JTOOLBAR_HELP'); $options['icon'] = $options['icon'] ?? 'fa fa-question'; $options['button_class'] = $options['button_class'] ?? 'btn btn-outline-info btn-sm'; + $options['onclick'] = $options['onclick'] ?? $this->_getCommand(); parent::prepareOptions($options); } diff --git a/libraries/src/Toolbar/CoreButtonsTrait.php b/libraries/src/Toolbar/CoreButtonsTrait.php index 68c6fc749033f..20fa3c548e956 100644 --- a/libraries/src/Toolbar/CoreButtonsTrait.php +++ b/libraries/src/Toolbar/CoreButtonsTrait.php @@ -11,6 +11,7 @@ use Joomla\CMS\Factory; use Joomla\CMS\Layout\FileLayout; use Joomla\CMS\Table\Table; +use Joomla\CMS\Toolbar\Button\ConfirmButton; use Joomla\CMS\Toolbar\Button\CustomButton; use Joomla\CMS\Toolbar\Button\HelpButton; use Joomla\CMS\Toolbar\Button\LinkButton; @@ -26,133 +27,158 @@ */ trait CoreButtonsTrait { - public function divider(string $name = 'divider', string $text = ''): SeparatorButton + public function divider(string $text = ''): SeparatorButton { - return $this->separatorButton($name, $text); + return $this->separatorButton('divider', $text); } - public function preview(string $name = 'preview', string $text = 'JGLOBAL_PREVIEW'): PopupButton + public function preview(string $url, string $text = 'JGLOBAL_PREVIEW'): PopupButton { - return $this->popupButton($name, $text) + return $this->popupButton('preview', $text) + ->url($url) ->iframeWidth(640) - ->iframeHeight(480); + ->iframeHeight(480) + ->icon('icon-eye'); } - public function help(string $name = 'help', string $text = 'JTOOLBAR_HELP'): HelpButton + public function help($ref, $useComponent = false, $url = null, $component = null): HelpButton { - return $this->helpButton($name, $text); + return $this->helpButton('help', 'JTOOLBAR_HELP') + ->ref($ref) + ->useComponent($useComponent) + ->url($url) + ->component($component); } - public function back(string $name = 'back', string $text = 'JTOOLBAR_BACK'): LinkButton + public function back(string $text = 'JTOOLBAR_BACK'): LinkButton { - return $this->link($name, $text) + return $this->link('back', $text) ->url('javascript:history.back();'); } - public function link(string $name = 'link', string $text): LinkButton + public function link(string $text, string $url): LinkButton { - return $this->linkButton($name, $text); + return $this->linkButton('link', $text) + ->url($url); } - public function mediaManager($directory, string $name = 'upload', string $text = 'JTOOLBAR_UPLOAD'): PopupButton + public function mediaManager(string $directory, string $text = 'JTOOLBAR_UPLOAD'): PopupButton { - return $this->popupButton($name, $text) + return $this->popupButton('upload', $text) ->iframeWidth(800) ->iframeHeight(520) ->url('index.php?option=com_media&tmpl=component&task=popupUpload&folder=' . $directory); } - public function makeDefault(string $name = 'default', string $text = 'JTOOLBAR_DEFAULT'): StandardButton + public function makeDefault($task, string $text = 'JTOOLBAR_DEFAULT'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('default', $text) + ->task($task); } - public function assign(string $name = 'assign', string $text = 'JTOOLBAR_ASSIGN'): StandardButton + public function assign($task, string $text = 'JTOOLBAR_ASSIGN'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('assign', $text) + ->task($task); } - public function addNew(string $name = 'new', string $text = 'JTOOLBAR_NEW'): StandardButton + public function addNew($task, string $text = 'JTOOLBAR_NEW'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('new', $text) + ->task($task); } - public function publish(string $name = 'publish', string $text = 'JTOOLBAR_PUBLISH'): StandardButton + public function publish($task, string $text = 'JTOOLBAR_PUBLISH'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('publish', $text) + ->task($task); } - public function unpublish(string $name = 'unpublish', string $text = 'JTOOLBAR_UNPUBLISH'): StandardButton + public function unpublish($task, string $text = 'JTOOLBAR_UNPUBLISH'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('unpublish', $text) + ->task($task); } - public function archive(string $name = 'archive', string $text = 'JTOOLBAR_ARCHIVE'): StandardButton + public function archive($task, string $text = 'JTOOLBAR_ARCHIVE'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('archive', $text) + ->task($task); } - public function unarchive(string $name = 'unarchive', string $text = 'JTOOLBAR_UNARCHIVE'): StandardButton + public function unarchive($task, string $text = 'JTOOLBAR_UNARCHIVE'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('unarchive', $text) + ->task($task); } - public function edit(string $name = 'edit', string $text = 'JTOOLBAR_EDIT'): StandardButton + public function edit($task, string $text = 'JTOOLBAR_EDIT'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('edit', $text) + ->task($task); } - public function editHtml(string $name = 'edithtml', string $text = 'JTOOLBAR_EDIT_HTML'): StandardButton + public function editHtml($task, string $text = 'JTOOLBAR_EDIT_HTML'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('edithtml', $text) + ->task($task); } - public function editCss(string $name = 'editcss', string $text = 'JTOOLBAR_EDIT_CSS'): StandardButton + public function editCss($task, string $text = 'JTOOLBAR_EDIT_CSS'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('editcss', $text) + ->task($task); } - public function delete(string $name = 'delete', string $text = 'JTOOLBAR_DELETE'): StandardButton + public function delete($task, string $text = 'JTOOLBAR_DELETE'): ConfirmButton { - return $this->standardButton($name, $text); + return $this->confirmButton('delete', $text) + ->task($task); } - public function trash(string $name = 'trash', string $text = 'JTOOLBAR_TRASH'): StandardButton + public function trash($task, string $text = 'JTOOLBAR_TRASH'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('trash', $text) + ->task($task); } - public function apply(string $name = 'apply', string $text = 'JTOOLBAR_APPLY'): StandardButton + public function apply($task, string $text = 'JTOOLBAR_APPLY'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('apply', $text) + ->task($task); } - public function save(string $name = 'save', string $text = 'JTOOLBAR_SAVE'): StandardButton + public function save($task, string $text = 'JTOOLBAR_SAVE'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('save', $text) + ->task($task); } - public function save2new(string $name = 'save2new', string $text = 'JTOOLBAR_SAVE_AND_NEW'): StandardButton + public function save2new($task, string $text = 'JTOOLBAR_SAVE_AND_NEW'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('save-new', $text) + ->task($task); } - public function save2copy(string $name = 'save2copy', string $text = 'JTOOLBAR_SAVE_AS_COPY'): StandardButton + public function save2copy($task, string $text = 'JTOOLBAR_SAVE_AS_COPY'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('save-copy', $text) + ->task($task); } - public function checkin(string $name = 'checkin', string $text = 'JTOOLBAR_CHECKIN'): StandardButton + public function checkin($task, string $text = 'JTOOLBAR_CHECKIN'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('checkin', $text) + ->task($task); } - public function cancel(string $name = 'cancel', string $text = 'JTOOLBAR_CANCEL'): StandardButton + public function cancel($task, string $text = 'JTOOLBAR_CLOSE'): StandardButton { - return $this->standardButton($name, $text); + return $this->standardButton('cancel', $text) + ->task($task); } - public function preferences($component, string $name = 'options', string $text = 'JToolbar_Options', $path = ''): LinkButton + public function preferences($component, string $text = 'JToolbar_Options', $path = ''): LinkButton { $component = urlencode($component); $path = urlencode($path); @@ -160,7 +186,7 @@ public function preferences($component, string $name = 'options', string $text = $uri = (string) Uri::getInstance(); $return = urlencode(base64_encode($uri)); - return $this->linkButton($name, $text) + return $this->linkButton('options', $text) ->url('index.php?option=com_config&view=component&component=' . $component . '&path=' . $path . '&return=' . $return); } diff --git a/libraries/src/Toolbar/Toolbar.php b/libraries/src/Toolbar/Toolbar.php index 7b316cbbbd8d1..dcd5b78378328 100644 --- a/libraries/src/Toolbar/Toolbar.php +++ b/libraries/src/Toolbar/Toolbar.php @@ -15,6 +15,7 @@ use Joomla\CMS\Toolbar\Button\BasicButton; use Joomla\CMS\Toolbar\Button\ConfirmButton; use Joomla\CMS\Toolbar\Button\CustomButton; +use Joomla\CMS\Toolbar\Button\GroupButton; use Joomla\CMS\Toolbar\Button\HelpButton; use Joomla\CMS\Toolbar\Button\LinkButton; use Joomla\CMS\Toolbar\Button\PopupButton; @@ -32,6 +33,7 @@ * @method CustomButton customButton(string $name = '', string $text = '', string $task = '') * @method ConfirmButton confirmButton(string $name = '', string $text = '', string $task = '') * @method BasicButton basicButton(string $name = '', string $text = '', string $task = '') + * @method GroupButton groupButton(string $name = '', string $text = '', string $task = '') * * @since 1.5 */ @@ -190,6 +192,20 @@ public function getItems() return $this->_bar; } + /** + * setItems + * + * @param array $items + * + * @return self + */ + public function setItems(array $items): self + { + $this->_bar = $items; + + return $this; + } + /** * Get the name of the toolbar. * From d8adb29cc6a8dd7e333701a1cc311b099c360d52 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Mon, 12 Feb 2018 03:29:55 +0800 Subject: [PATCH 10/31] Add customHtml() --- libraries/src/Toolbar/CoreButtonsTrait.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libraries/src/Toolbar/CoreButtonsTrait.php b/libraries/src/Toolbar/CoreButtonsTrait.php index 20fa3c548e956..09c365854650f 100644 --- a/libraries/src/Toolbar/CoreButtonsTrait.php +++ b/libraries/src/Toolbar/CoreButtonsTrait.php @@ -210,7 +210,12 @@ public function versions($typeAlias, $itemId, $height = 800, $width = 500, strin $layout = new FileLayout('joomla.toolbar.versions'); - return $this->customButton('version', $text) - ->html($layout->render($options)); + return $this->customHtml($layout->render($options), 'version'); + } + + public function customHtml(string $html, string $name = 'custom'): CustomButton + { + $this->customButton($name) + ->html($html); } } From 2f10bc3d17f20dfa58231d9f62930c1c134e0909 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Mon, 12 Feb 2018 03:40:57 +0800 Subject: [PATCH 11/31] classmap fix --- libraries/classmap.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/classmap.php b/libraries/classmap.php index 18976d84d5ad9..c8008eec4006d 100644 --- a/libraries/classmap.php +++ b/libraries/classmap.php @@ -154,17 +154,17 @@ JLoader::registerAlias('JToolbar', '\\Joomla\\CMS\\Toolbar\\Toolbar', '5.0'); JLoader::registerAlias('JToolBar', '\\Joomla\\CMS\\Toolbar\\Toolbar', '5.0'); -JLoader::registerAlias('JToolbarButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); -JLoader::registerAlias('JToolbarButtonConfirm', '\\Joomla\\CMS\\Toolbar\\Legacy\\ConfirmButton', '5.0'); -JLoader::registerAlias('JToolbarButtonCustom', '\\Joomla\\CMS\\Toolbar\\Legacy\\CustomButton', '5.0'); -JLoader::registerAlias('JToolbarButtonHelp', '\\Joomla\\CMS\\Toolbar\\Legacy\\HelpButton', '5.0'); -JLoader::registerAlias('JToolbarButtonLink', '\\Joomla\\CMS\\Toolbar\\Legacy\\LinkButton', '5.0'); -JLoader::registerAlias('JToolbarButtonPopup', '\\Joomla\\CMS\\Toolbar\\Legacy\\PopupButton', '5.0'); -JLoader::registerAlias('JToolbarButtonSeparator', '\\Joomla\\CMS\\Toolbar\\Legacy\\SeparatorButton', '5.0'); -JLoader::registerAlias('JToolbarButtonSlider', '\\Joomla\\CMS\\Toolbar\\Legacy\\SliderButton', '5.0'); -JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Legacy\\StandardButton', '5.0'); +JLoader::registerAlias('JToolbarButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); +JLoader::registerAlias('JToolbarButtonConfirm', '\\Joomla\\CMS\\Toolbar\\Button\\ConfirmButton', '5.0'); +JLoader::registerAlias('JToolbarButtonCustom', '\\Joomla\\CMS\\Toolbar\\Button\\CustomButton', '5.0'); +JLoader::registerAlias('JToolbarButtonHelp', '\\Joomla\\CMS\\Toolbar\\Button\\HelpButton', '5.0'); +JLoader::registerAlias('JToolbarButtonLink', '\\Joomla\\CMS\\Toolbar\\Button\\LinkButton', '5.0'); +JLoader::registerAlias('JToolbarButtonPopup', '\\Joomla\\CMS\\Toolbar\\Button\\PopupButton', '5.0'); +JLoader::registerAlias('JToolbarButtonSeparator', '\\Joomla\\CMS\\Toolbar\\Button\\SeparatorButton', '5.0'); +JLoader::registerAlias('JToolbarButtonSlider', '\\Joomla\\CMS\\Toolbar\\Button\\SliderButton', '5.0'); +JLoader::registerAlias('JToolbarButtonStandard', '\\Joomla\\CMS\\Toolbar\\Button\\StandardButton', '5.0'); JLoader::registerAlias('JToolbarHelper', '\\Joomla\\CMS\\Toolbar\\ToolbarHelper', '5.0'); -JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); +JLoader::registerAlias('JButton', '\\Joomla\\CMS\\Toolbar\\ToolbarButton', '5.0'); JLoader::registerAlias('JVersion', '\\Joomla\\CMS\\Version', '5.0'); From 43fec76db9267465f4e918baaf7f8fa97fd0f4fe Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Mon, 12 Feb 2018 12:44:55 +0800 Subject: [PATCH 12/31] Fix customHtml() --- libraries/src/Toolbar/CoreButtonsTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/src/Toolbar/CoreButtonsTrait.php b/libraries/src/Toolbar/CoreButtonsTrait.php index 09c365854650f..866e0678e3090 100644 --- a/libraries/src/Toolbar/CoreButtonsTrait.php +++ b/libraries/src/Toolbar/CoreButtonsTrait.php @@ -215,7 +215,7 @@ public function versions($typeAlias, $itemId, $height = 800, $width = 500, strin public function customHtml(string $html, string $name = 'custom'): CustomButton { - $this->customButton($name) + return $this->customButton($name) ->html($html); } } From b2635b60a8c76c83d9696000f0929cf502e9d11c Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Wed, 14 Feb 2018 00:08:08 +0800 Subject: [PATCH 13/31] Button group and styles --- .../templates/atum/css/template-rtl.css | 279 ++++++++++++++---- .../templates/atum/css/template-rtl.min.css | 2 +- administrator/templates/atum/css/template.css | 279 ++++++++++++++---- .../templates/atum/css/template.min.css | 2 +- .../templates/atum/scss/blocks/_toolbar.scss | 130 +++----- layouts/joomla/toolbar/link.php | 2 +- .../src/Toolbar/Button/StandardButton.php | 2 +- libraries/src/Toolbar/CoreButtonsTrait.php | 2 +- libraries/src/Toolbar/ToolbarButton.php | 1 + 9 files changed, 508 insertions(+), 191 deletions(-) diff --git a/administrator/templates/atum/css/template-rtl.css b/administrator/templates/atum/css/template-rtl.css index a57317524f491..a8f7c201c8f48 100644 --- a/administrator/templates/atum/css/template-rtl.css +++ b/administrator/templates/atum/css/template-rtl.css @@ -1073,7 +1073,7 @@ iframe { margin-right: .25rem; } .subhead .btn-group .btn { margin-left: 0; } - .subhead button:first-of-type { + .subhead a:first-child, .subhead button:first-child, .subhead div:first-child { margin: 0; } .subhead .btn-group-sm > .btn, .subhead .btn-sm { @@ -1083,9 +1083,6 @@ iframe { padding: 0 10px; font-size: .875rem; line-height: 1.8rem; - color: #212529; - background-color: #fefefe; - border-color: #ccc; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .subhead .btn-sm [class^="icon-"], @@ -1105,53 +1102,78 @@ iframe { .subhead .btn-sm:hover { background-color: #e9ecef; border-color: #ccc; } - .subhead .btn-primary [class^="icon-"], - .subhead .btn-primary [class*=" icon-"], - .subhead .btn-primary [class^="fa-"], - .subhead .btn-primary [class*=" fa-"], - .subhead .btn-outline-primary [class^="icon-"], - .subhead .btn-outline-primary [class*=" icon-"], - .subhead .btn-outline-primary [class^="fa-"], - .subhead .btn-outline-primary [class*=" fa-"] { - color: #006898; } - .subhead .btn-success [class^="icon-"], - .subhead .btn-success [class*=" icon-"], - .subhead .btn-success [class^="fa-"], - .subhead .btn-success [class*=" fa-"], - .subhead .btn-outline-success [class^="icon-"], - .subhead .btn-outline-success [class*=" icon-"], - .subhead .btn-outline-success [class^="fa-"], - .subhead .btn-outline-success [class*=" fa-"] { - color: #438243; } - .subhead .btn-info [class^="icon-"], - .subhead .btn-info [class*=" icon-"], - .subhead .btn-info [class^="fa-"], - .subhead .btn-info [class*=" fa-"], - .subhead .btn-outline-info [class^="icon-"], - .subhead .btn-outline-info [class*=" icon-"], - .subhead .btn-outline-info [class^="fa-"], - .subhead .btn-outline-info [class*=" fa-"] { - color: #17a2b8; } - .subhead .btn-danger [class^="icon-"], - .subhead .btn-danger [class*=" icon-"], - .subhead .btn-danger [class^="fa-"], - .subhead .btn-danger [class*=" fa-"], - .subhead .btn-outline-danger [class^="icon-"], - .subhead .btn-outline-danger [class*=" icon-"], - .subhead .btn-outline-danger [class^="fa-"], - .subhead .btn-outline-danger [class*=" fa-"] { - color: #d9534f; } - .subhead .btn-warning [class^="icon-"], - .subhead .btn-warning [class*=" icon-"], - .subhead .btn-warning [class^="fa-"], - .subhead .btn-warning [class*=" fa-"], - .subhead .btn-outline-warning [class^="icon-"], - .subhead .btn-outline-warning [class*=" icon-"], - .subhead .btn-outline-warning [class^="fa-"], - .subhead .btn-outline-warning [class*=" fa-"] { - color: #f0ad4e; } + .subhead .btn-outline-primary { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-primary [class^="icon-"], + .subhead .btn-outline-primary [class*=" icon-"], + .subhead .btn-outline-primary [class^="fa-"], + .subhead .btn-outline-primary [class*=" fa-"] { + color: #006898; } + .subhead .btn-primary:not(.dropdown-toggle) { + color: #fefefe; + background-color: #006898; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-primary:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-primary:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-primary:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-primary:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-primary:not(.dropdown-toggle):hover { + background-color: #004565; } + .subhead .btn-primary.dropdown-toggle { + background: #003e5b; + border-color: #003e5b; } + .subhead .btn-primary.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-secondary { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-secondary [class^="icon-"], + .subhead .btn-outline-secondary [class*=" icon-"], + .subhead .btn-outline-secondary [class^="fa-"], + .subhead .btn-outline-secondary [class*=" fa-"] { + color: #868e96; } + .subhead .btn-secondary:not(.dropdown-toggle) { + color: #fefefe; + background-color: #868e96; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-secondary:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-secondary:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-secondary:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-secondary:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-secondary:not(.dropdown-toggle):hover { + background-color: #6c757d; } + .subhead .btn-secondary.dropdown-toggle { + background: #686f77; + border-color: #686f77; } + .subhead .btn-secondary.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-success { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-success [class^="icon-"], + .subhead .btn-outline-success [class*=" icon-"], + .subhead .btn-outline-success [class^="fa-"], + .subhead .btn-outline-success [class*=" fa-"] { + color: #438243; } .subhead .btn-success:not(.dropdown-toggle) { - width: 140px; color: #fefefe; background-color: #438243; border-color: rgba(0, 0, 0, 0.2); } @@ -1173,6 +1195,163 @@ iframe { border-color: #2e5a2e; } .subhead .btn-success.dropdown-toggle::after { color: #fefefe; } + .subhead .btn-outline-info { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-info [class^="icon-"], + .subhead .btn-outline-info [class*=" icon-"], + .subhead .btn-outline-info [class^="fa-"], + .subhead .btn-outline-info [class*=" fa-"] { + color: #17a2b8; } + .subhead .btn-info:not(.dropdown-toggle) { + color: #fefefe; + background-color: #17a2b8; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-info:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-info:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-info:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-info:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-info:not(.dropdown-toggle):hover { + background-color: #117a8b; } + .subhead .btn-info.dropdown-toggle { + background: #107282; + border-color: #107282; } + .subhead .btn-info.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-warning { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-warning [class^="icon-"], + .subhead .btn-outline-warning [class*=" icon-"], + .subhead .btn-outline-warning [class^="fa-"], + .subhead .btn-outline-warning [class*=" fa-"] { + color: #f0ad4e; } + .subhead .btn-warning:not(.dropdown-toggle) { + color: #fefefe; + background-color: #f0ad4e; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-warning:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-warning:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-warning:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-warning:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-warning:not(.dropdown-toggle):hover { + background-color: #ec971f; } + .subhead .btn-warning.dropdown-toggle { + background: #eb9316; + border-color: #eb9316; } + .subhead .btn-warning.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-danger { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-danger [class^="icon-"], + .subhead .btn-outline-danger [class*=" icon-"], + .subhead .btn-outline-danger [class^="fa-"], + .subhead .btn-outline-danger [class*=" fa-"] { + color: #d9534f; } + .subhead .btn-danger:not(.dropdown-toggle) { + color: #fefefe; + background-color: #d9534f; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-danger:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-danger:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-danger:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-danger:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-danger:not(.dropdown-toggle):hover { + background-color: #c9302c; } + .subhead .btn-danger.dropdown-toggle { + background: #c12e2a; + border-color: #c12e2a; } + .subhead .btn-danger.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-light { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-light [class^="icon-"], + .subhead .btn-outline-light [class*=" icon-"], + .subhead .btn-outline-light [class^="fa-"], + .subhead .btn-outline-light [class*=" fa-"] { + color: #f8f9fa; } + .subhead .btn-light:not(.dropdown-toggle) { + color: #fefefe; + background-color: #f8f9fa; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-light:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-light:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-light:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-light:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-light:not(.dropdown-toggle):hover { + background-color: #dae0e5; } + .subhead .btn-light.dropdown-toggle { + background: #d4dae1; + border-color: #d4dae1; } + .subhead .btn-light.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-dark { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-dark [class^="icon-"], + .subhead .btn-outline-dark [class*=" icon-"], + .subhead .btn-outline-dark [class^="fa-"], + .subhead .btn-outline-dark [class*=" fa-"] { + color: #343a40; } + .subhead .btn-dark:not(.dropdown-toggle) { + color: #fefefe; + background-color: #343a40; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-dark:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-dark:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-dark:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-dark:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-dark:not(.dropdown-toggle):hover { + background-color: #1d2124; } + .subhead .btn-dark.dropdown-toggle { + background: #191b1e; + border-color: #191b1e; } + .subhead .btn-dark.dropdown-toggle::after { + color: #fefefe; } + .subhead .button-new, .subhead .button-apply, .subhead .button-wide { + width: 140px; } .subhead > *:first-child:not(.float-sm-right) { margin-left: 0; } .subhead .float-sm-right { diff --git a/administrator/templates/atum/css/template-rtl.min.css b/administrator/templates/atum/css/template-rtl.min.css index bb8c70406e2a4..2580111ab4d0e 100644 --- a/administrator/templates/atum/css/template-rtl.min.css +++ b/administrator/templates/atum/css/template-rtl.min.css @@ -1 +1 @@ -#flying-focus{position:absolute;margin:0;background:transparent;-webkit-transition-property:left,top,width,height;transition-property:left,top,width,height;-webkit-transition-timing-function:cubic-bezier(0,1,0,1);transition-timing-function:cubic-bezier(0,1,0,1);visibility:hidden;pointer-events:none;-webkit-box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;border-radius:2px}#flying-focus.flying-focus_visible{visibility:visible;z-index:9999}@media screen and (-webkit-min-device-pixel-ratio:0){#flying-focus{-webkit-box-shadow:none;box-shadow:none;outline:5px auto -webkit-focus-ring-color;outline-offset:-3px}}.flying-focus_target{outline:none !important}.flying-focus_target::-moz-focus-inner{border:0 !important}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#006898}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#4cc6ff}.custom-control-input:disabled ~ .custom-control-label{color:#868e96}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#19b6ff;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.7rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#19b6ff;-webkit-box-shadow:0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 .2rem rgba(0,104,152,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#19b6ff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.alert-message{background-color:#438243;border-color:#438243;border-left:10px solid #438243;color:#e9ecef}.alert-message hr{border-top-color:#3a713a}.alert-message .alert-link{color:#326032}html,body{height:100%;font-size:14px}body{padding:0;margin:0}h1,h2,h3,h4,h5,h6{font-weight:bold}h1{font-weight:normal}small,.small{font-size:.8rem}.j-main-container .alert{margin:10px}.notify-alerts{position:fixed;top:15px;left:50%;z-index:1031;margin-left:125px;-webkit-transition:all .5s ease;transition:all .5s ease;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.notify-alerts .alert{width:100%;min-width:280px;max-width:400px;margin-bottom:.5rem;opacity:0;-webkit-animation:fadeIn ease-in 1;animation:fadeIn ease-in 1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.notify-alerts .alert:first-of-type{-webkit-animation-delay:.3s;animation-delay:.3s}.notify-alerts.fullWidth{left:265px}.notify-alerts.fullWidth .alert{width:auto;min-width:none;max-width:none;margin-left:0}.notify-alerts .close{position:relative;right:-.5rem;padding:.5rem;line-height:1rem;color:#000;opacity:1}.closed .notify-alerts{margin-left:0}.closed+.notify-alerts.fullWidth{left:70px}.wrapper0 .notify-alerts{margin-left:0}@-webkit-keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.form-control{max-width:240px;background-color:#fefefe}.form-control.input-xlarge{max-width:350px}.form-control.input-xxlarge{max-width:550px}.form-control.input-full{max-width:100%}.control-group{margin-bottom:18px}.control-group>.form-check{display:inline-block}.control-group::after{display:table;clear:both;content:""}.control-group .control-label{float:left;width:220px;padding-top:5px;padding-right:5px;text-align:left}.control-group .controls{margin-left:220px}.form-no-margin .control-group .controls{margin-left:0}.form-no-margin .control-group .control-label{float:none}.custom-select{max-width:240px}.spacer hr{width:380px}td .form-control{display:inline-block;width:auto}legend{margin-bottom:1.1rem}.checkboxes{padding-top:5px}.checkboxes .checkbox input{position:static;margin-left:0}.form-check{padding-top:5px;margin-bottom:0}.modal label{width:100%}.invalid{color:#d9534f;border-color:#d9534f}.valid{border-color:#438243}.form-control-feedback{display:block}.header{position:relative;z-index:5;height:48px;background:#1c3d5c}.header::after{position:absolute;top:100%;width:100%;height:3px;content:"";background-color:#006898;background-image:-webkit-gradient(linear,left top,right top,from(#59afff),to(#59daff));background-image:linear-gradient(to right,#59afff 0,#59daff 100%)}.header .page-title{display:inline-block;margin:0 5px;font-size:1.3rem;font-weight:normal;line-height:48px;color:#fefefe}.header .page-title [class^="icon-"]{margin-right:15px;font-size:1.857rem 1.857rem;vertical-align:middle}.header .navbar-brand{padding:0;font-size:1.1rem;color:#fefefe}.header .navbar-brand:hover,.header .navbar-brand:focus{color:#efefef}@media(min-width:576px) and (max-width:767.98px){.header .navbar-brand{margin-right:0;margin-left:10px}}.header .navbar-brand span{margin-left:.4rem}.header .nav-item{background-color:#2e5a84;border-left:1px solid #1c3d5c}.header .nav-link{position:relative;padding:0;line-height:48px}.header .nav-link .fa{width:50px;font-size:1.2rem;color:#fefefe;vertical-align:middle;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .nav-link .fa-external-link{position:relative;left:2px}.header .nav-link .badge{position:absolute;top:4px;right:2px}.header .nav-link.dropdown-toggle::after{display:none}.header .nav-link:hover .fa{font-size:1.3rem;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .dropdown-notifications{min-width:280px;padding:0;border:0}.header .dropdown-notifications h2{font-size:.9286rem}.header .dropdown-menu::after{left:.65rem}.header .dropdown-menu-right::after{right:.65rem;left:auto}.header .header-profile .dropdown-menu{padding-top:0}.header .header-profile .dropdown-menu::after{color:#f2f2f2}.header .header-profile-user{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:.3rem;background-color:#f2f2f2;border-bottom:1px solid rgba(0,0,0,0.1);border-radius:.25rem .25rem 0 0}.header .list-group-item-text:last-child{margin-bottom:0}.header .joomla-version{margin-right:.9rem;margin-bottom:0;font-size:.9286rem;color:#fefefe}@media(max-width:991.98px){.header{position:fixed;top:0;width:100%}.header+.container-title{margin-top:48px}}.menu-collapse{font-size:2rem;text-align:center}.menu-collapse a{display:block;width:48px;line-height:48px;color:#fff;background-color:#2e5a84}.icon-back::before{content:"\e008"}.icon-crop::before{content:"\f125"}.icon-white{color:#fefefe}.icon-publish{color:#438243}.icon-unpublish{color:#d9534f}.tbody-icon{padding:0 3px;text-align:center;background-color:transparent;border:0}.tbody-icon span{width:26px;height:26px;font-size:1rem;line-height:22px;color:#ccc;border:2px solid #ccc;border-radius:50%}.tbody-icon .icon-publish{color:#438243;border-color:#438243}.tbody-icon .icon-featured{color:#f0ad4e;border-color:#f0ad4e}.tbody-icon .icon-unpublish{color:#d9534f;border-color:#d9534f}.tbody-icon .icon-archive{color:#495057;border-color:#495057}.tbody-icon .icon-checkedout{width:auto;height:auto;font-size:1.2rem;line-height:1rem;color:#495057;border:0}iframe{border:0}.modal iframe{width:100%}.view-login{background:#1c3d5c}.view-login .login-initial{display:none}.view-login .login{width:320px}@media(max-width:767.98px){.view-login .login{padding:0 15px}}.view-login .login-logo{margin:0 0 2rem;text-align:center}@media(max-width:767.98px){.view-login .login-logo{margin:1rem 0}}.view-login h2{font-size:1.9rem;font-weight:300}.view-login .card-img-top{max-width:100%}.view-login .nav p,.view-login .nav a{margin-bottom:0;color:#fff}@media(max-width:575.98px){.view-login .btn{padding:8px 10px;font-size:14px}}.modal .btn{margin-right:.5rem}.modal .btn-primary:not([href]),.modal .btn-success:not([href]){color:#fff}.modal .btn-primary:not([href]):hover,.modal .btn-success:not([href]):hover{color:#fff}.modal-header{padding:0 15px}.modal-header .close{width:46px;height:46px;margin-top:0;margin-right:-15px;font-size:2rem;line-height:1rem;border-left:1px solid #ccc}.modal-body{padding:0;overflow-y:auto}.modal-title{font-weight:normal;line-height:46px}.contentpane{padding:15px}.quick-icons a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:120px;height:120px;margin-right:15px;margin-bottom:15px;color:#fff;text-align:center;background:#1c3d5c;border-radius:3px;-webkit-box-shadow:0 0 5px 0 #1c3d5c;box-shadow:0 0 5px 0 #1c3d5c;-webkit-transition:background .25s ease;transition:background .25s ease}.quick-icons a>div{-webkit-box-flex:1;-ms-flex:1 0 0;flex:1 0 0}@media(max-width:575.98px){.quick-icons a.pulse{-webkit-box-shadow:0 0 0 0 rgba(28,61,92,0.7);box-shadow:0 0 0 0 rgba(28,61,92,0.7);-webkit-animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1);animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1)}}@media(max-width:575.98px){.quick-icons a.pulse.danger,.quick-icons a.pulse.success{-webkit-animation:none;animation:none}}.quick-icons a:hover,.quick-icons a:focus{text-decoration:none;background:#2e5a84}.quick-icons a .j-links-link{display:block;width:100%;padding:0 1rem;font-size:1rem;line-height:1.1}.quick-icons a .fa{margin:5px auto;font-size:2.5rem;font-weight:normal;line-height:3rem}.quick-icons a.danger{background-color:#df706c;-webkit-box-shadow:0 0 5px 0 #df706c;box-shadow:0 0 5px 0 #df706c}.quick-icons a.success{background-color:#4f9a4f;-webkit-box-shadow:0 0 5px 0 #4f9a4f;box-shadow:0 0 5px 0 #4f9a4f}.quick-icons [id*="plg_quickicon"] a,.quick-icons [id*="plg_quickicon"] a::before{-webkit-transition-delay:.4s;transition-delay:.4s}@-webkit-keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}@keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}.js-stools{position:relative;width:100%;padding:8px 10px 0;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15)}.js-stools .btn-wrapper{display:inline-block;margin-right:5px}.js-stools .js-stools-container-filters{position:absolute;right:-1px;z-index:1;display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:10px;margin:0;background-color:#fff;border:1px solid #ccc;border-radius:0 0 0 .25rem;-webkit-box-shadow:-1px 1px 4px rgba(0,0,0,0.05);box-shadow:-1px 1px 4px rgba(0,0,0,0.05)}.js-stools .js-stools-container-filters .js-stools-field-list:last-of-type .custom-select{min-width:auto}.js-stools .js-stools-container-filters .custom-select{width:100%}.js-stools .js-stools-container-filters.js-filters-show{display:-webkit-box;display:-ms-flexbox;display:flex}.js-stools .js-stools-container-filters .chzn-container-single{display:block}.js-stools .js-stools-container-filters .chzn-container-single .chzn-single{display:block;font-size:1rem}.js-stools .js-stools-field-filter .custom-select.active{color:#fff;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23fff' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat scroll right .75rem center/8px 10px;background-color:#006898}.js-stools .js-stools-field-filter .custom-select option{color:#495057;background-color:#fff}.js-stools .js-stools-container-selector{float:left}.js-stools .js-stools-container-bar{float:right}.js-stools .js-stools-container-bar .btn-toolbar{float:left;margin-bottom:8px}.js-stools .js-stools-container-bar .btn-toolbar .btn-group:first-child{margin-left:0}.js-stools .js-stools-container-bar .input-append{margin-bottom:0}.js-stools .js-stools-container-list{float:left;text-align:left}.js-stools .js-stools-container-list .js-stools-field-list:last-child{margin-right:0}.js-stools-column-order [class*=" icon-"],.js-stools-column-order [class^="icon-"]{text-align:center}.wrapper{padding-left:250px;-webkit-transition:all .3s ease;transition:all .3s ease}@media(max-width:991.98px){.wrapper{padding-left:0}}.sidebar-wrapper{position:fixed;left:0;z-index:10;width:250px;height:100%;margin-left:0;background-color:#1c3d5c;-webkit-box-shadow:0 3px 10px rgba(0,0,0,0.5);box-shadow:0 3px 10px rgba(0,0,0,0.5);-webkit-transition:all .3s ease;transition:all .3s ease}.sidebar-wrapper .sidebar-brand{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;overflow:hidden}@media(max-width:991.98px){.sidebar-wrapper{margin-top:3px}.sidebar-wrapper .main-nav{max-height:calc(100vh - 147px)}}.sidebar-wrapper .main-brand{margin-left:5px;font-size:30px;line-height:96px;text-align:center;text-indent:0;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a{display:block;margin-right:5px;overflow:hidden;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a:hover{background:0}.sidebar-wrapper .main-brand img{width:190px}.menu-toggle-icon{width:48px;font-size:1.7rem}.main-nav{position:relative;z-index:1;width:250px;height:calc(100vh - 96px);list-style:none;background-color:#1c3d5c;opacity:1}.main-nav::after{position:absolute;top:0;right:0;bottom:0;width:0;content:"";background-color:#0f2131;-webkit-transition:all .3s ease;transition:all .3s ease}.main-nav>li{background-color:#1c3d5c;border-bottom:1px solid rgba(0,0,0,0.15)}.main-nav>li:first-of-type{border-top:1px solid rgba(0,0,0,0.15)}.main-nav li{max-height:40px;line-height:40px}.main-nav li a{position:relative;display:block;max-height:40px;overflow:hidden;color:#fff;text-decoration:none;cursor:pointer;opacity:1}.main-nav li a:hover{color:#fff;text-decoration:none;background-color:rgba(0,0,0,0.2)}.main-nav li a:active,.main-nav li a:focus{text-decoration:none;outline:0;-webkit-box-shadow:inset 0 0 0 1px #78aeda;box-shadow:inset 0 0 0 1px #78aeda}.main-nav li.menuitem-group a:hover{cursor:text;background:0}.main-nav li ul{position:absolute;top:0;left:50px;z-index:-3;display:block;width:200px;height:100%;padding:0;opacity:0;-webkit-transition:left .2s ease,opacity .2s ease;transition:left .2s ease,opacity .2s ease;-webkit-transition-delay:0;transition-delay:0}.main-nav li ul ul{display:none;opacity:1}.main-nav li ul li{text-indent:15px}.main-nav .close{padding:2px 10px;font-size:1.7rem;color:rgba(255,255,255,0.8);text-indent:0;text-shadow:none}.main-nav .close:hover{background-color:transparent}.main-nav .open>a+ul{left:50px;z-index:1;opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.main-nav li li{line-height:2.2rem;border:0;-webkit-box-shadow:none;box-shadow:none}.main-nav li li a{-webkit-box-shadow:none;box-shadow:none}.main-nav li li a:hover{background-color:#2e5a84;-webkit-box-shadow:inset 2px 0 2px rgba(0,0,0,0.1);box-shadow:inset 2px 0 2px rgba(0,0,0,0.1)}.main-nav li li>span{color:rgba(255,255,255,0.4)}.main-nav li li:last-of-type>a{border-bottom:0}.main-nav .fa{position:relative;top:-2px;display:inline-block;margin:0 12px;font-size:20px;text-align:center;vertical-align:middle}.main-nav .collapse-level-1 a::before{display:none}.main-nav .collapse-level-1 .menuitem-group,.main-nav .collapse-level-1>li:first-of-type{margin:6px 0 0;color:rgba(255,255,255,0.7);text-transform:uppercase;letter-spacing:1px}.main-nav .collapse-level-1 li{position:relative}.main-nav .collapse-level-1 li:hover ul{display:block !important}.main-nav .collapse-level-2{position:absolute;top:0;left:100% !important;height:auto;padding:2px 0;background-color:#152d45;border-radius:0 .25rem .25rem 0;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.2);box-shadow:0 0 8px rgba(0,0,0,0.2)}.main-nav .collapse-level-2>li>a{color:#fff;text-indent:15px}.main-nav .parent .collapse-arrow::after{position:absolute;top:0;right:15px;font-family:FontAwesome;font-size:.75rem;color:#fff;visibility:visible;content:"\f0da";-webkit-transition-delay:.25s;transition-delay:.25s}.closed .main-nav{overflow-x:hidden}.child-open{overflow:visible}.child-open::after{width:200px}.child-open>li.parent>.collapse-arrow::after{visibility:hidden;opacity:0;-webkit-transition-delay:0s;transition-delay:0s}.child-open>li.open>a::before{position:absolute;top:1px;bottom:1px;left:0;width:3px;content:"";background-color:#59afff}.child-open .open>ul{display:block}@media(min-width:992px){.closed{padding-left:50px}}.closed .child-open::after{display:none}.closed .sidebar-wrapper{width:50px;overflow:hidden}.closed .parent .collapse-arrow::after{visibility:hidden;-webkit-transition-delay:0s !important;transition-delay:0s !important}.closed .menu-toggle-icon::before{content:"\f054"}.layout-edit .sidebar-wrapper .no-dropdown:hover{color:#fff;cursor:not-allowed;background:0}.sidebar-item-title{visibility:visible !important;opacity:1 !important}.sidebar-nav ul{padding-left:.5rem}.sidebar-nav li{padding-bottom:3px;font-size:.9rem;font-weight:bold}.sidebar-nav li.nav-header{padding:.5rem 0 .2rem;margin-bottom:.2rem;font-size:.9rem;color:#495057;border-bottom:1px solid #ced4da}.sidebar-nav li.divider{margin:.3rem 0}.sidebar-nav li a{color:#003e5b}.status{z-index:9;padding:5px 10px;margin-left:250px;color:#626262;background:#ebebeb;border-top:1px solid #d4d4d4;-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;-webkit-transition:all .3s ease;transition:all .3s ease;-webkit-transition-delay:0s;transition-delay:0s}.status p{margin:0}.status li,.status a{font-size:14px;color:#555}.closed .status{margin-left:50px}.sidebar-wrapper[data-hidden="1"] ~ .status{margin-left:0}.subhead{position:absolute;top:0;right:0;left:0;width:auto;min-height:43px;padding:15px 0;color:#0c192e;background:#f2f2f2}.subhead .row{margin-right:0;margin-left:0}.subhead .btn-toolbar{margin-bottom:0}.subhead .btn-toolbar>*{margin-left:.5rem}.subhead .btn-group{margin-right:.25rem}.subhead .btn-group .btn{margin-left:0}.subhead button:first-of-type{margin:0}.subhead .btn-group-sm>.btn,.subhead .btn-sm{padding:0 .8rem;line-height:24px}.subhead .btn-sm{padding:0 10px;font-size:.875rem;line-height:1.8rem;color:#212529;background-color:#fefefe;border-color:#ccc;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.subhead .btn-sm [class^="icon-"],.subhead .btn-sm [class*=" icon-"],.subhead .btn-sm [class^="fa-"],.subhead .btn-sm [class*=" fa-"]{z-index:-1;display:inline-block;width:28px;height:auto;margin:0 6px 0 -10px;line-height:1.8rem;color:inherit;background-color:#e9ecef;border-right:1px solid #ccc;border-radius:3px 0 0 3px}.subhead .btn-sm:hover{background-color:#e9ecef;border-color:#ccc}.subhead .btn-primary [class^="icon-"],.subhead .btn-primary [class*=" icon-"],.subhead .btn-primary [class^="fa-"],.subhead .btn-primary [class*=" fa-"],.subhead .btn-outline-primary [class^="icon-"],.subhead .btn-outline-primary [class*=" icon-"],.subhead .btn-outline-primary [class^="fa-"],.subhead .btn-outline-primary [class*=" fa-"]{color:#006898}.subhead .btn-success [class^="icon-"],.subhead .btn-success [class*=" icon-"],.subhead .btn-success [class^="fa-"],.subhead .btn-success [class*=" fa-"],.subhead .btn-outline-success [class^="icon-"],.subhead .btn-outline-success [class*=" icon-"],.subhead .btn-outline-success [class^="fa-"],.subhead .btn-outline-success [class*=" fa-"]{color:#438243}.subhead .btn-info [class^="icon-"],.subhead .btn-info [class*=" icon-"],.subhead .btn-info [class^="fa-"],.subhead .btn-info [class*=" fa-"],.subhead .btn-outline-info [class^="icon-"],.subhead .btn-outline-info [class*=" icon-"],.subhead .btn-outline-info [class^="fa-"],.subhead .btn-outline-info [class*=" fa-"]{color:#17a2b8}.subhead .btn-danger [class^="icon-"],.subhead .btn-danger [class*=" icon-"],.subhead .btn-danger [class^="fa-"],.subhead .btn-danger [class*=" fa-"],.subhead .btn-outline-danger [class^="icon-"],.subhead .btn-outline-danger [class*=" icon-"],.subhead .btn-outline-danger [class^="fa-"],.subhead .btn-outline-danger [class*=" fa-"]{color:#d9534f}.subhead .btn-warning [class^="icon-"],.subhead .btn-warning [class*=" icon-"],.subhead .btn-warning [class^="fa-"],.subhead .btn-warning [class*=" fa-"],.subhead .btn-outline-warning [class^="icon-"],.subhead .btn-outline-warning [class*=" icon-"],.subhead .btn-outline-warning [class^="fa-"],.subhead .btn-outline-warning [class*=" fa-"]{color:#f0ad4e}.subhead .btn-success:not(.dropdown-toggle){width:140px;color:#fefefe;background-color:#438243;border-color:rgba(0,0,0,0.2)}.subhead .btn-success:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-success:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-success:not(.dropdown-toggle):hover{background-color:#326032}.subhead .btn-success.dropdown-toggle{background:#2e5a2e;border-color:#2e5a2e}.subhead .btn-success.dropdown-toggle::after{color:#fefefe}.subhead>*:first-child:not(.float-sm-right){margin-left:0}.subhead .float-sm-right{margin-left:.8rem}.subhead.subhead-fixed{position:fixed;top:0;left:250px;z-index:9;padding-top:12px;padding-bottom:12px;border-bottom:1px solid #adb5bd}.closed .subhead-fixed{left:55px}.btn-toolbar{margin-bottom:20px;margin-left:0}.treeselect{display:block;padding-left:0;list-style:none}.treeselect .nav-header{font-weight:700;color:#212529}.treeselect li{position:relative;display:block;line-height:2.2rem;list-style:none}.treeselect li::before{position:absolute;top:14px;left:25px;width:10px;height:1px;margin:auto;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li::after{position:absolute;top:0;bottom:0;left:25px;width:1px;height:100%;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li:last-child::after{height:14px}.treeselect li li{padding-left:40px}.treeselect>li::before,.treeselect>li::after{display:none}.treeselect .icon-{display:none}.treeselect .treeselect-toggle{display:inline-block;padding:0;margin-right:.1rem;text-align:center;cursor:pointer}.treeselect .treeselect-menu{display:inline-block}.treeselect .treeselect-item{display:inline-block}.treeselect .treeselect-item input{position:relative;top:1px;margin-right:.2rem}.treeselect .treeselect-item label{margin-bottom:0}.treeselect .dropdown-toggle{padding:0 .5rem .3rem;margin-left:.5rem}.treeselect .dropdown-toggle::after{margin-left:0;font-size:1rem;color:#495057}.treeselect-sub{padding-left:0}.tree-holder ul ul li::before,.tree-holder ul ul li::after{left:8px;display:block}.tree-holder ul ul li::before{top:12px}.tree-holder ul ul li:last-child::after{height:12px}.tree-holder li{line-height:1.8rem}.tree-holder li li{padding-left:20px}.fg-1{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.fg-2{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2}.fg-3{-webkit-box-flex:3;-ms-flex-positive:3;flex-grow:3}.element-invisible{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.hidden{display:none;visibility:hidden}joomla-alert{display:none}.awesomplete{display:block}.btn.btn-xs,.btn-group-xs>.btn{padding:.09rem .4rem;font-size:.7rem;line-height:1.2;border-radius:.2rem}.btn.btn-xs .caret{font-size:16px;line-height:13px}.btn:focus,.btn.focus,.btn:active:focus,.btn.focus:active,.btn.active:focus,.btn.active.focus{text-decoration:none}.btn.group-move{cursor:move}.btn-secondary{color:#343a40;background-color:#fefefe;border-color:#ced4da}.btn-secondary:hover,.btn-secondary:focus{color:#343a40;background-color:#f8f9fa}.card{background-color:#f8f8f8}.card.card-light{background-color:#f8f8f8}.card.card-dark{background-color:#0d1321}.card.card-dark>*,.card.card-dark a:not(.dropdown-item),.card.card-dark .module-dropdown>a{color:#fefefe}.card.card-dark .list-group-item{background:0}.custom-select.custom-select-color-state.custom-select-success{color:#fefefe;background-color:#438243}.custom-select.custom-select-color-state.custom-select-success option{color:#495057;background-color:#fefefe}.custom-select.custom-select-color-state.custom-select-danger{color:#fefefe;background-color:#d9534f}.custom-select.custom-select-color-state.custom-select-danger option{color:#495057;background-color:#fefefe}.accordion .card-header{display:block;font-size:.9286rem;font-weight:bold;line-height:1.2}.accordion .list-group-item{color:#006898}.dropdown-menu{padding:.2rem 0;margin-top:.5rem;background-color:#fefefe;border-color:#ccc}.dropdown-menu::after{position:absolute;top:-1.5rem;left:.9rem;font-family:FontAwesome;font-size:1.6rem;color:#fefefe;text-shadow:0 -1px 0 rgba(0,0,0,0.2);content:"\f0d8"}.dropdown-item{padding:3px .75rem}.dropdown-menu-right::after{right:.9rem;left:auto}.list-group-item{background-color:#fefefe}.list-unstyled .list-unstyled{padding-left:20px}.jviewport-height10{height:10vh}.jviewport-height20{height:20vh}.jviewport-height30{height:30vh}.jviewport-height40{height:40vh}.jviewport-height50{height:50vh}.jviewport-height60{height:60vh}.jviewport-height70{height:70vh}.jviewport-height80{height:80vh}.jviewport-height90{height:90vh}.jviewport-height100{height:100vh}[class*=jviewport-height] iframe{height:100%}.modal-dialog.jviewport-width10{width:10vw;max-width:none}.modal-dialog.jviewport-width20{width:20vw;max-width:none}.modal-dialog.jviewport-width30{width:30vw;max-width:none}.modal-dialog.jviewport-width40{width:40vw;max-width:none}.modal-dialog.jviewport-width50{width:50vw;max-width:none}.modal-dialog.jviewport-width60{width:60vw;max-width:none}.modal-dialog.jviewport-width70{width:70vw;max-width:none}.modal-dialog.jviewport-width80{width:80vw;max-width:none}.modal-dialog.jviewport-width90{width:90vw;max-width:none}.modal-dialog.jviewport-width100{width:100vw;max-width:none}.nav.nav-tabs{padding:0;margin:0;background-color:#f5f5f5;border:1px solid #ccc;border-bottom:0;border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04)}.nav.nav-tabs .nav-item{margin-bottom:0;margin-left:0}.nav.nav-tabs .nav-item:first-of-type .nav-link.active{border-radius:.25rem 0 0;-webkit-box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-item:last-of-type .nav-link{-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-item:last-of-type .nav-link.active{-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link{position:relative;padding:.75em 1em;color:#0d1321;border:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-link.active{background-color:rgba(0,0,0,0.03);background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,0.05)));background-image:linear-gradient(to bottom,transparent,rgba(0,0,0,0.05) 100%);border-right:0;border-left:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link.active::after{position:absolute;right:0;bottom:-1px;left:0;height:5px;content:"";background-color:#006898;opacity:.8}.nav-tabs+.tab-content{padding:15px;background:#fefefe;border:1px solid;border-color:#ccc;border-radius:0 0 .25rem .25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.pagination{margin:1rem}.table thead th{white-space:nowrap;border-bottom-width:1px}.table th,.table td{padding:8px;vertical-align:middle}.table th label,.table td label{margin-bottom:0}.chzn-container.chzn-container-single .chzn-single{display:inline-block;max-width:100%;height:calc(calc(2.25rem + 2px) - 2px);padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem \9;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-image:none \9;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-box-shadow:none;box-shadow:none;-moz-appearance:none;-webkit-appearance:none}.chzn-container.chzn-container-single .chzn-single abbr{top:10px}.chzn-container.chzn-container-single .chzn-single:focus{border-color:#19b6ff;outline:0}.chzn-container.chzn-container-single .chzn-single:disabled{color:#868e96;cursor:not-allowed;background-color:#e9ecef}.chzn-container.chzn-container-single .chzn-single div b{background:0}.chzn-container.chzn-container-single .chzn-drop{background:#fefefe;border:1px solid #ced4da}.chzn-container.chzn-container-single.chzn-container-active .chzn-single{border-bottom-right-radius:0;border-bottom-left-radius:0}.chzn-container-single{width:auto !important}.card .chzn-container.chzn-container-single{width:100% !important}.card .chzn-container.chzn-container-single .chzn-single{width:100% !important}.gu-mirror{position:fixed !important;z-index:9999 !important;margin:0 !important;cursor:move;background-color:#90ee90;opacity:.8}.gu-mirror.table{display:table}.gu-mirror.table td{display:table-cell}.js-draggable .sortable-handler{cursor:move}.minicolors-theme-bootstrap .minicolors-input{width:120px}.minicolors-theme-bootstrap .rgb{width:175px}.minicolors-theme-bootstrap .rgba{width:220px}.editor .toggle-editor{margin-top:1rem}.editor .mce-tinymce{border:1px solid #ccc;border-radius:.25rem}.editor .mce-btn,.editor .mce-panel{background:#f8f8f8}.com_config .content{background-color:transparent}.com_config [class^='col-']>fieldset{margin-bottom:2rem}.com_cpanel .content{margin-top:0}.com_cpanel .card{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.com_cpanel .card p:first-of-type{margin-top:1rem}.com_cpanel .card p:last-child{margin-bottom:0}.com_cpanel .card .list-group{margin-top:0;margin-right:-1.25rem;margin-bottom:-1.25rem;margin-left:-1.25rem}.com_cpanel .card .list-group>li{padding:.6rem 1.25rem;overflow:hidden}.com_cpanel .card .list-group>.published{padding-left:.9rem;border-left:5px solid #438243}.com_cpanel .card .list-group>.unpublished{padding-left:.9rem;border-left:5px solid #d9534f}.com_cpanel .card .list-group:first-of-type{border-top:0}.com_cpanel .card .list-group-item:first-child{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card .list-group-item:last-child{border-bottom:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card-title{position:relative;padding:.9em 1.25rem .75rem;margin-top:-1.25rem;margin-right:-1.25rem;margin-bottom:0;margin-left:-1.25rem;font-size:.9286rem;color:#1c3d5c;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15)}.com_cpanel .module-actions{position:absolute;top:0;right:0;z-index:2}.com_cpanel .module-actions>a{display:inline-block;width:2.6em;height:2.6em;line-height:2.6em;color:#495057;text-align:center;background-color:#f5f5f5;border-left:1px solid #ccc;border-top-right-radius:.25rem;-webkit-box-shadow:1px 0 #fefefe inset;box-shadow:1px 0 #fefefe inset}.com_cpanel .module-actions>a:hover,.com_cpanel .module-actions>a:focus{background-color:#f0f0f0;-webkit-box-shadow:none;box-shadow:none}.admin.com_modules .js-stools-container-bar .btn-toolbar{float:left}.menu-assignment{position:relative}.menu-assignment .menu-links{padding-left:0;margin-top:15px;margin-left:0;-webkit-column-count:3;column-count:3;-webkit-column-gap:15px;column-gap:15px}.menu-assignment .menu-links>li{display:inline-block;width:100%;margin-bottom:15px;vertical-align:top;list-style:none;column-break-inside:avoid;-webkit-backface-visibility:hidden;backface-visibility:hidden}.menu-assignment .menu-links-block{padding:15px;background-color:#fafafa;border:1px solid #ddd;border-radius:3px}.menu-assignment label{display:block}.menu-assignment label input{position:relative;top:2px}@media(max-width:767px){.menu-assignment .menu-links{-webkit-column-count:auto;column-count:auto}}.com_users.view-debuggroup thead th,.com_users.view-debuguser thead th{white-space:normal}.com_users.view-debuggroup .legend,.com_users.view-debuguser .legend{margin:1rem 1rem 0}.container-main,.system-debug{padding-bottom:50px}.container-main{position:relative;min-height:calc(100vh - 50px);padding-top:15px;background-color:#f2f2f2}@media(max-width:991.98px){.container-main{padding-left:50px;margin-top:47px}}.list-view-main .container-main{background-color:#f2f2f2}.content{margin-top:45px;border-radius:.25rem}.content>.row{margin-right:0;margin-left:0}.j-main-container{background-color:#fefefe;border:1px solid rgba(0,0,0,0.17);border-radius:.25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.075);box-shadow:0 0 3px rgba(0,0,0,0.075)}.row-selected{background-color:#d9edf7}.chzn-container-single{width:auto !important}.item-associations{padding:0}.item-associations li{display:inline-block;list-style:none}dl,ol,ul{padding-right:0}th{text-align:right}.close{float:left}.notify-alerts .close{right:auto;left:-.5rem}.control-group .control-label{float:right;text-align:right}.dropdown-menu-right{right:auto;left:0}.dropdown-menu-right::after{right:auto;left:.9rem}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:.25rem;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:.25rem}.switcher-labels{margin-right:10px;margin-left:0}.switcher-labels span{right:0;left:auto}.wrapper{padding-right:250px;padding-left:0}.wrapper.closed{padding-right:50px}.wrapper.closed .main-brand img{position:relative;left:151px}.sidebar-wrapper{right:0;left:auto}.notify-alerts{margin-right:125px;margin-left:0}.closed .notify-alerts{margin-right:0}.header .page-title [class^="icon-"]{margin-right:0;margin-left:15px}.menu-collapse{right:0;left:auto;margin-right:-7.5px;margin-left:0}.menu-toggle-icon::before{content:"\f054"}.closed .menu-toggle-icon::before{content:"\f053"}.quick-icons a::before{right:auto;left:-40px}.quick-icons a [class*=" icon-"],.quick-icons a [class^="icon-"]{border-right:0;border-left:1px solid rgba(255,255,255,0.15)}.main-nav .fa{margin:0 12px 0 8px}.main-nav .open>a+ul{right:50px;left:auto}.main-nav .collapse-level-2{right:100%;left:auto;border-radius:.25rem 0 0 .25rem}.main-nav .close{float:left}.main-nav .parent .collapse-arrow::after{right:auto;left:15px;content:"\f0d9"}.child-open>.open>a::before{right:0;left:auto}.status{margin-right:250px;margin-left:0}.closed .status{margin-right:50px;margin-left:0}.sidebar-wrapper[data-hidden="1"] ~ .status{margin-right:0}.subhead .btn-group-sm>.btn [class^="icon-"],.subhead .btn-group-sm>.btn [class*=" icon-"],.subhead .btn-group-sm>.btn [class^="fa-"],.subhead .btn-group-sm>.btn [class*=" fa-"]{margin:0 -10px 0 6px;border-right:0;border-left:1px solid #ccc;border-radius:0 3px 3px 0}.subhead .btn-toolbar>*:first-of-type{margin-right:0}.subhead .btn-group-sm>.btn [class*=" fa-"],.subhead .btn-group-sm>.btn [class*=" icon-"],.subhead .btn-group-sm>.btn [class^="fa-"],.subhead .btn-group-sm>.btn [class^="icon-"],.subhead .btn-sm [class*=" fa-"],.subhead .btn-sm [class*=" icon-"],.subhead .btn-sm [class^="fa-"],.subhead .btn-sm [class^="icon-"]{margin:0 -10px 0 6px;border-right:0;border-left:1px solid #ccc;border-radius:0 3px 3px 0}.com_cpanel .card .list-group>.published{border-right:5px solid #438243;border-left:0}.com_cpanel .card .list-group>.unpublished{border-right:5px solid #d9534f;border-left:0}.com_cpanel .card .module-dropdown{right:auto;left:0}.com_cpanel .card .module-dropdown>a{border-right:1px solid #ccc;border-left:0;border-top-left-radius:.25rem;border-top-right-radius:0} \ No newline at end of file +#flying-focus{position:absolute;margin:0;background:transparent;-webkit-transition-property:left,top,width,height;transition-property:left,top,width,height;-webkit-transition-timing-function:cubic-bezier(0,1,0,1);transition-timing-function:cubic-bezier(0,1,0,1);visibility:hidden;pointer-events:none;-webkit-box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;border-radius:2px}#flying-focus.flying-focus_visible{visibility:visible;z-index:9999}@media screen and (-webkit-min-device-pixel-ratio:0){#flying-focus{-webkit-box-shadow:none;box-shadow:none;outline:5px auto -webkit-focus-ring-color;outline-offset:-3px}}.flying-focus_target{outline:none !important}.flying-focus_target::-moz-focus-inner{border:0 !important}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#006898}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#4cc6ff}.custom-control-input:disabled ~ .custom-control-label{color:#868e96}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#19b6ff;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.7rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#19b6ff;-webkit-box-shadow:0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 .2rem rgba(0,104,152,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#19b6ff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.alert-message{background-color:#438243;border-color:#438243;border-left:10px solid #438243;color:#e9ecef}.alert-message hr{border-top-color:#3a713a}.alert-message .alert-link{color:#326032}html,body{height:100%;font-size:14px}body{padding:0;margin:0}h1,h2,h3,h4,h5,h6{font-weight:bold}h1{font-weight:normal}small,.small{font-size:.8rem}.j-main-container .alert{margin:10px}.notify-alerts{position:fixed;top:15px;left:50%;z-index:1031;margin-left:125px;-webkit-transition:all .5s ease;transition:all .5s ease;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.notify-alerts .alert{width:100%;min-width:280px;max-width:400px;margin-bottom:.5rem;opacity:0;-webkit-animation:fadeIn ease-in 1;animation:fadeIn ease-in 1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.notify-alerts .alert:first-of-type{-webkit-animation-delay:.3s;animation-delay:.3s}.notify-alerts.fullWidth{left:265px}.notify-alerts.fullWidth .alert{width:auto;min-width:none;max-width:none;margin-left:0}.notify-alerts .close{position:relative;right:-.5rem;padding:.5rem;line-height:1rem;color:#000;opacity:1}.closed .notify-alerts{margin-left:0}.closed+.notify-alerts.fullWidth{left:70px}.wrapper0 .notify-alerts{margin-left:0}@-webkit-keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.form-control{max-width:240px;background-color:#fefefe}.form-control.input-xlarge{max-width:350px}.form-control.input-xxlarge{max-width:550px}.form-control.input-full{max-width:100%}.control-group{margin-bottom:18px}.control-group>.form-check{display:inline-block}.control-group::after{display:table;clear:both;content:""}.control-group .control-label{float:left;width:220px;padding-top:5px;padding-right:5px;text-align:left}.control-group .controls{margin-left:220px}.form-no-margin .control-group .controls{margin-left:0}.form-no-margin .control-group .control-label{float:none}.custom-select{max-width:240px}.spacer hr{width:380px}td .form-control{display:inline-block;width:auto}legend{margin-bottom:1.1rem}.checkboxes{padding-top:5px}.checkboxes .checkbox input{position:static;margin-left:0}.form-check{padding-top:5px;margin-bottom:0}.modal label{width:100%}.invalid{color:#d9534f;border-color:#d9534f}.valid{border-color:#438243}.form-control-feedback{display:block}.header{position:relative;z-index:5;height:48px;background:#1c3d5c}.header::after{position:absolute;top:100%;width:100%;height:3px;content:"";background-color:#006898;background-image:-webkit-gradient(linear,left top,right top,from(#59afff),to(#59daff));background-image:linear-gradient(to right,#59afff 0,#59daff 100%)}.header .page-title{display:inline-block;margin:0 5px;font-size:1.3rem;font-weight:normal;line-height:48px;color:#fefefe}.header .page-title [class^="icon-"]{margin-right:15px;font-size:1.857rem 1.857rem;vertical-align:middle}.header .navbar-brand{padding:0;font-size:1.1rem;color:#fefefe}.header .navbar-brand:hover,.header .navbar-brand:focus{color:#efefef}@media(min-width:576px) and (max-width:767.98px){.header .navbar-brand{margin-right:0;margin-left:10px}}.header .navbar-brand span{margin-left:.4rem}.header .nav-item{background-color:#2e5a84;border-left:1px solid #1c3d5c}.header .nav-link{position:relative;padding:0;line-height:48px}.header .nav-link .fa{width:50px;font-size:1.2rem;color:#fefefe;vertical-align:middle;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .nav-link .fa-external-link{position:relative;left:2px}.header .nav-link .badge{position:absolute;top:4px;right:2px}.header .nav-link.dropdown-toggle::after{display:none}.header .nav-link:hover .fa{font-size:1.3rem;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .dropdown-notifications{min-width:280px;padding:0;border:0}.header .dropdown-notifications h2{font-size:.9286rem}.header .dropdown-menu::after{left:.65rem}.header .dropdown-menu-right::after{right:.65rem;left:auto}.header .header-profile .dropdown-menu{padding-top:0}.header .header-profile .dropdown-menu::after{color:#f2f2f2}.header .header-profile-user{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:.3rem;background-color:#f2f2f2;border-bottom:1px solid rgba(0,0,0,0.1);border-radius:.25rem .25rem 0 0}.header .list-group-item-text:last-child{margin-bottom:0}.header .joomla-version{margin-right:.9rem;margin-bottom:0;font-size:.9286rem;color:#fefefe}@media(max-width:991.98px){.header{position:fixed;top:0;width:100%}.header+.container-title{margin-top:48px}}.menu-collapse{font-size:2rem;text-align:center}.menu-collapse a{display:block;width:48px;line-height:48px;color:#fff;background-color:#2e5a84}.icon-back::before{content:"\e008"}.icon-crop::before{content:"\f125"}.icon-white{color:#fefefe}.icon-publish{color:#438243}.icon-unpublish{color:#d9534f}.tbody-icon{padding:0 3px;text-align:center;background-color:transparent;border:0}.tbody-icon span{width:26px;height:26px;font-size:1rem;line-height:22px;color:#ccc;border:2px solid #ccc;border-radius:50%}.tbody-icon .icon-publish{color:#438243;border-color:#438243}.tbody-icon .icon-featured{color:#f0ad4e;border-color:#f0ad4e}.tbody-icon .icon-unpublish{color:#d9534f;border-color:#d9534f}.tbody-icon .icon-archive{color:#495057;border-color:#495057}.tbody-icon .icon-checkedout{width:auto;height:auto;font-size:1.2rem;line-height:1rem;color:#495057;border:0}iframe{border:0}.modal iframe{width:100%}.view-login{background:#1c3d5c}.view-login .login-initial{display:none}.view-login .login{width:320px}@media(max-width:767.98px){.view-login .login{padding:0 15px}}.view-login .login-logo{margin:0 0 2rem;text-align:center}@media(max-width:767.98px){.view-login .login-logo{margin:1rem 0}}.view-login h2{font-size:1.9rem;font-weight:300}.view-login .card-img-top{max-width:100%}.view-login .nav p,.view-login .nav a{margin-bottom:0;color:#fff}@media(max-width:575.98px){.view-login .btn{padding:8px 10px;font-size:14px}}.modal .btn{margin-right:.5rem}.modal .btn-primary:not([href]),.modal .btn-success:not([href]){color:#fff}.modal .btn-primary:not([href]):hover,.modal .btn-success:not([href]):hover{color:#fff}.modal-header{padding:0 15px}.modal-header .close{width:46px;height:46px;margin-top:0;margin-right:-15px;font-size:2rem;line-height:1rem;border-left:1px solid #ccc}.modal-body{padding:0;overflow-y:auto}.modal-title{font-weight:normal;line-height:46px}.contentpane{padding:15px}.quick-icons a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:120px;height:120px;margin-right:15px;margin-bottom:15px;color:#fff;text-align:center;background:#1c3d5c;border-radius:3px;-webkit-box-shadow:0 0 5px 0 #1c3d5c;box-shadow:0 0 5px 0 #1c3d5c;-webkit-transition:background .25s ease;transition:background .25s ease}.quick-icons a>div{-webkit-box-flex:1;-ms-flex:1 0 0;flex:1 0 0}@media(max-width:575.98px){.quick-icons a.pulse{-webkit-box-shadow:0 0 0 0 rgba(28,61,92,0.7);box-shadow:0 0 0 0 rgba(28,61,92,0.7);-webkit-animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1);animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1)}}@media(max-width:575.98px){.quick-icons a.pulse.danger,.quick-icons a.pulse.success{-webkit-animation:none;animation:none}}.quick-icons a:hover,.quick-icons a:focus{text-decoration:none;background:#2e5a84}.quick-icons a .j-links-link{display:block;width:100%;padding:0 1rem;font-size:1rem;line-height:1.1}.quick-icons a .fa{margin:5px auto;font-size:2.5rem;font-weight:normal;line-height:3rem}.quick-icons a.danger{background-color:#df706c;-webkit-box-shadow:0 0 5px 0 #df706c;box-shadow:0 0 5px 0 #df706c}.quick-icons a.success{background-color:#4f9a4f;-webkit-box-shadow:0 0 5px 0 #4f9a4f;box-shadow:0 0 5px 0 #4f9a4f}.quick-icons [id*="plg_quickicon"] a,.quick-icons [id*="plg_quickicon"] a::before{-webkit-transition-delay:.4s;transition-delay:.4s}@-webkit-keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}@keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}.js-stools{position:relative;width:100%;padding:8px 10px 0;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15)}.js-stools .btn-wrapper{display:inline-block;margin-right:5px}.js-stools .js-stools-container-filters{position:absolute;right:-1px;z-index:1;display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:10px;margin:0;background-color:#fff;border:1px solid #ccc;border-radius:0 0 0 .25rem;-webkit-box-shadow:-1px 1px 4px rgba(0,0,0,0.05);box-shadow:-1px 1px 4px rgba(0,0,0,0.05)}.js-stools .js-stools-container-filters .js-stools-field-list:last-of-type .custom-select{min-width:auto}.js-stools .js-stools-container-filters .custom-select{width:100%}.js-stools .js-stools-container-filters.js-filters-show{display:-webkit-box;display:-ms-flexbox;display:flex}.js-stools .js-stools-container-filters .chzn-container-single{display:block}.js-stools .js-stools-container-filters .chzn-container-single .chzn-single{display:block;font-size:1rem}.js-stools .js-stools-field-filter .custom-select.active{color:#fff;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23fff' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat scroll right .75rem center/8px 10px;background-color:#006898}.js-stools .js-stools-field-filter .custom-select option{color:#495057;background-color:#fff}.js-stools .js-stools-container-selector{float:left}.js-stools .js-stools-container-bar{float:right}.js-stools .js-stools-container-bar .btn-toolbar{float:left;margin-bottom:8px}.js-stools .js-stools-container-bar .btn-toolbar .btn-group:first-child{margin-left:0}.js-stools .js-stools-container-bar .input-append{margin-bottom:0}.js-stools .js-stools-container-list{float:left;text-align:left}.js-stools .js-stools-container-list .js-stools-field-list:last-child{margin-right:0}.js-stools-column-order [class*=" icon-"],.js-stools-column-order [class^="icon-"]{text-align:center}.wrapper{padding-left:250px;-webkit-transition:all .3s ease;transition:all .3s ease}@media(max-width:991.98px){.wrapper{padding-left:0}}.sidebar-wrapper{position:fixed;left:0;z-index:10;width:250px;height:100%;margin-left:0;background-color:#1c3d5c;-webkit-box-shadow:0 3px 10px rgba(0,0,0,0.5);box-shadow:0 3px 10px rgba(0,0,0,0.5);-webkit-transition:all .3s ease;transition:all .3s ease}.sidebar-wrapper .sidebar-brand{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;overflow:hidden}@media(max-width:991.98px){.sidebar-wrapper{margin-top:3px}.sidebar-wrapper .main-nav{max-height:calc(100vh - 147px)}}.sidebar-wrapper .main-brand{margin-left:5px;font-size:30px;line-height:96px;text-align:center;text-indent:0;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a{display:block;margin-right:5px;overflow:hidden;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a:hover{background:0}.sidebar-wrapper .main-brand img{width:190px}.menu-toggle-icon{width:48px;font-size:1.7rem}.main-nav{position:relative;z-index:1;width:250px;height:calc(100vh - 96px);list-style:none;background-color:#1c3d5c;opacity:1}.main-nav::after{position:absolute;top:0;right:0;bottom:0;width:0;content:"";background-color:#0f2131;-webkit-transition:all .3s ease;transition:all .3s ease}.main-nav>li{background-color:#1c3d5c;border-bottom:1px solid rgba(0,0,0,0.15)}.main-nav>li:first-of-type{border-top:1px solid rgba(0,0,0,0.15)}.main-nav li{max-height:40px;line-height:40px}.main-nav li a{position:relative;display:block;max-height:40px;overflow:hidden;color:#fff;text-decoration:none;cursor:pointer;opacity:1}.main-nav li a:hover{color:#fff;text-decoration:none;background-color:rgba(0,0,0,0.2)}.main-nav li a:active,.main-nav li a:focus{text-decoration:none;outline:0;-webkit-box-shadow:inset 0 0 0 1px #78aeda;box-shadow:inset 0 0 0 1px #78aeda}.main-nav li.menuitem-group a:hover{cursor:text;background:0}.main-nav li ul{position:absolute;top:0;left:50px;z-index:-3;display:block;width:200px;height:100%;padding:0;opacity:0;-webkit-transition:left .2s ease,opacity .2s ease;transition:left .2s ease,opacity .2s ease;-webkit-transition-delay:0;transition-delay:0}.main-nav li ul ul{display:none;opacity:1}.main-nav li ul li{text-indent:15px}.main-nav .close{padding:2px 10px;font-size:1.7rem;color:rgba(255,255,255,0.8);text-indent:0;text-shadow:none}.main-nav .close:hover{background-color:transparent}.main-nav .open>a+ul{left:50px;z-index:1;opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.main-nav li li{line-height:2.2rem;border:0;-webkit-box-shadow:none;box-shadow:none}.main-nav li li a{-webkit-box-shadow:none;box-shadow:none}.main-nav li li a:hover{background-color:#2e5a84;-webkit-box-shadow:inset 2px 0 2px rgba(0,0,0,0.1);box-shadow:inset 2px 0 2px rgba(0,0,0,0.1)}.main-nav li li>span{color:rgba(255,255,255,0.4)}.main-nav li li:last-of-type>a{border-bottom:0}.main-nav .fa{position:relative;top:-2px;display:inline-block;margin:0 12px;font-size:20px;text-align:center;vertical-align:middle}.main-nav .collapse-level-1 a::before{display:none}.main-nav .collapse-level-1 .menuitem-group,.main-nav .collapse-level-1>li:first-of-type{margin:6px 0 0;color:rgba(255,255,255,0.7);text-transform:uppercase;letter-spacing:1px}.main-nav .collapse-level-1 li{position:relative}.main-nav .collapse-level-1 li:hover ul{display:block !important}.main-nav .collapse-level-2{position:absolute;top:0;left:100% !important;height:auto;padding:2px 0;background-color:#152d45;border-radius:0 .25rem .25rem 0;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.2);box-shadow:0 0 8px rgba(0,0,0,0.2)}.main-nav .collapse-level-2>li>a{color:#fff;text-indent:15px}.main-nav .parent .collapse-arrow::after{position:absolute;top:0;right:15px;font-family:FontAwesome;font-size:.75rem;color:#fff;visibility:visible;content:"\f0da";-webkit-transition-delay:.25s;transition-delay:.25s}.closed .main-nav{overflow-x:hidden}.child-open{overflow:visible}.child-open::after{width:200px}.child-open>li.parent>.collapse-arrow::after{visibility:hidden;opacity:0;-webkit-transition-delay:0s;transition-delay:0s}.child-open>li.open>a::before{position:absolute;top:1px;bottom:1px;left:0;width:3px;content:"";background-color:#59afff}.child-open .open>ul{display:block}@media(min-width:992px){.closed{padding-left:50px}}.closed .child-open::after{display:none}.closed .sidebar-wrapper{width:50px;overflow:hidden}.closed .parent .collapse-arrow::after{visibility:hidden;-webkit-transition-delay:0s !important;transition-delay:0s !important}.closed .menu-toggle-icon::before{content:"\f054"}.layout-edit .sidebar-wrapper .no-dropdown:hover{color:#fff;cursor:not-allowed;background:0}.sidebar-item-title{visibility:visible !important;opacity:1 !important}.sidebar-nav ul{padding-left:.5rem}.sidebar-nav li{padding-bottom:3px;font-size:.9rem;font-weight:bold}.sidebar-nav li.nav-header{padding:.5rem 0 .2rem;margin-bottom:.2rem;font-size:.9rem;color:#495057;border-bottom:1px solid #ced4da}.sidebar-nav li.divider{margin:.3rem 0}.sidebar-nav li a{color:#003e5b}.status{z-index:9;padding:5px 10px;margin-left:250px;color:#626262;background:#ebebeb;border-top:1px solid #d4d4d4;-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;-webkit-transition:all .3s ease;transition:all .3s ease;-webkit-transition-delay:0s;transition-delay:0s}.status p{margin:0}.status li,.status a{font-size:14px;color:#555}.closed .status{margin-left:50px}.sidebar-wrapper[data-hidden="1"] ~ .status{margin-left:0}.subhead{position:absolute;top:0;right:0;left:0;width:auto;min-height:43px;padding:15px 0;color:#0c192e;background:#f2f2f2}.subhead .row{margin-right:0;margin-left:0}.subhead .btn-toolbar{margin-bottom:0}.subhead .btn-toolbar>*{margin-left:.5rem}.subhead .btn-group{margin-right:.25rem}.subhead .btn-group .btn{margin-left:0}.subhead a:first-child,.subhead button:first-child,.subhead div:first-child{margin:0}.subhead .btn-group-sm>.btn,.subhead .btn-sm{padding:0 .8rem;line-height:24px}.subhead .btn-sm{padding:0 10px;font-size:.875rem;line-height:1.8rem;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.subhead .btn-sm [class^="icon-"],.subhead .btn-sm [class*=" icon-"],.subhead .btn-sm [class^="fa-"],.subhead .btn-sm [class*=" fa-"]{z-index:-1;display:inline-block;width:28px;height:auto;margin:0 6px 0 -10px;line-height:1.8rem;color:inherit;background-color:#e9ecef;border-right:1px solid #ccc;border-radius:3px 0 0 3px}.subhead .btn-sm:hover{background-color:#e9ecef;border-color:#ccc}.subhead .btn-outline-primary{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-primary [class^="icon-"],.subhead .btn-outline-primary [class*=" icon-"],.subhead .btn-outline-primary [class^="fa-"],.subhead .btn-outline-primary [class*=" fa-"]{color:#006898}.subhead .btn-primary:not(.dropdown-toggle){color:#fefefe;background-color:#006898;border-color:rgba(0,0,0,0.2)}.subhead .btn-primary:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-primary:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-primary:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-primary:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-primary:not(.dropdown-toggle):hover{background-color:#004565}.subhead .btn-primary.dropdown-toggle{background:#003e5b;border-color:#003e5b}.subhead .btn-primary.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-secondary{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-secondary [class^="icon-"],.subhead .btn-outline-secondary [class*=" icon-"],.subhead .btn-outline-secondary [class^="fa-"],.subhead .btn-outline-secondary [class*=" fa-"]{color:#868e96}.subhead .btn-secondary:not(.dropdown-toggle){color:#fefefe;background-color:#868e96;border-color:rgba(0,0,0,0.2)}.subhead .btn-secondary:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-secondary:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-secondary:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-secondary:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-secondary:not(.dropdown-toggle):hover{background-color:#6c757d}.subhead .btn-secondary.dropdown-toggle{background:#686f77;border-color:#686f77}.subhead .btn-secondary.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-success{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-success [class^="icon-"],.subhead .btn-outline-success [class*=" icon-"],.subhead .btn-outline-success [class^="fa-"],.subhead .btn-outline-success [class*=" fa-"]{color:#438243}.subhead .btn-success:not(.dropdown-toggle){color:#fefefe;background-color:#438243;border-color:rgba(0,0,0,0.2)}.subhead .btn-success:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-success:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-success:not(.dropdown-toggle):hover{background-color:#326032}.subhead .btn-success.dropdown-toggle{background:#2e5a2e;border-color:#2e5a2e}.subhead .btn-success.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-info{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-info [class^="icon-"],.subhead .btn-outline-info [class*=" icon-"],.subhead .btn-outline-info [class^="fa-"],.subhead .btn-outline-info [class*=" fa-"]{color:#17a2b8}.subhead .btn-info:not(.dropdown-toggle){color:#fefefe;background-color:#17a2b8;border-color:rgba(0,0,0,0.2)}.subhead .btn-info:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-info:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-info:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-info:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-info:not(.dropdown-toggle):hover{background-color:#117a8b}.subhead .btn-info.dropdown-toggle{background:#107282;border-color:#107282}.subhead .btn-info.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-warning{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-warning [class^="icon-"],.subhead .btn-outline-warning [class*=" icon-"],.subhead .btn-outline-warning [class^="fa-"],.subhead .btn-outline-warning [class*=" fa-"]{color:#f0ad4e}.subhead .btn-warning:not(.dropdown-toggle){color:#fefefe;background-color:#f0ad4e;border-color:rgba(0,0,0,0.2)}.subhead .btn-warning:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-warning:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-warning:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-warning:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-warning:not(.dropdown-toggle):hover{background-color:#ec971f}.subhead .btn-warning.dropdown-toggle{background:#eb9316;border-color:#eb9316}.subhead .btn-warning.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-danger{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-danger [class^="icon-"],.subhead .btn-outline-danger [class*=" icon-"],.subhead .btn-outline-danger [class^="fa-"],.subhead .btn-outline-danger [class*=" fa-"]{color:#d9534f}.subhead .btn-danger:not(.dropdown-toggle){color:#fefefe;background-color:#d9534f;border-color:rgba(0,0,0,0.2)}.subhead .btn-danger:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-danger:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-danger:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-danger:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-danger:not(.dropdown-toggle):hover{background-color:#c9302c}.subhead .btn-danger.dropdown-toggle{background:#c12e2a;border-color:#c12e2a}.subhead .btn-danger.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-light{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-light [class^="icon-"],.subhead .btn-outline-light [class*=" icon-"],.subhead .btn-outline-light [class^="fa-"],.subhead .btn-outline-light [class*=" fa-"]{color:#f8f9fa}.subhead .btn-light:not(.dropdown-toggle){color:#fefefe;background-color:#f8f9fa;border-color:rgba(0,0,0,0.2)}.subhead .btn-light:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-light:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-light:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-light:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-light:not(.dropdown-toggle):hover{background-color:#dae0e5}.subhead .btn-light.dropdown-toggle{background:#d4dae1;border-color:#d4dae1}.subhead .btn-light.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-dark{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-dark [class^="icon-"],.subhead .btn-outline-dark [class*=" icon-"],.subhead .btn-outline-dark [class^="fa-"],.subhead .btn-outline-dark [class*=" fa-"]{color:#343a40}.subhead .btn-dark:not(.dropdown-toggle){color:#fefefe;background-color:#343a40;border-color:rgba(0,0,0,0.2)}.subhead .btn-dark:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-dark:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-dark:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-dark:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-dark:not(.dropdown-toggle):hover{background-color:#1d2124}.subhead .btn-dark.dropdown-toggle{background:#191b1e;border-color:#191b1e}.subhead .btn-dark.dropdown-toggle::after{color:#fefefe}.subhead.button-new,.subhead.button-apply,.subhead.button-wide{width:140px}.subhead>*:first-child:not(.float-sm-right){margin-left:0}.subhead .float-sm-right{margin-left:.8rem}.subhead.subhead-fixed{position:fixed;top:0;left:250px;z-index:9;padding-top:12px;padding-bottom:12px;border-bottom:1px solid #adb5bd}.closed .subhead-fixed{left:55px}.btn-toolbar{margin-bottom:20px;margin-left:0}.treeselect{display:block;padding-left:0;list-style:none}.treeselect .nav-header{font-weight:700;color:#212529}.treeselect li{position:relative;display:block;line-height:2.2rem;list-style:none}.treeselect li::before{position:absolute;top:14px;left:25px;width:10px;height:1px;margin:auto;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li::after{position:absolute;top:0;bottom:0;left:25px;width:1px;height:100%;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li:last-child::after{height:14px}.treeselect li li{padding-left:40px}.treeselect>li::before,.treeselect>li::after{display:none}.treeselect .icon-{display:none}.treeselect .treeselect-toggle{display:inline-block;padding:0;margin-right:.1rem;text-align:center;cursor:pointer}.treeselect .treeselect-menu{display:inline-block}.treeselect .treeselect-item{display:inline-block}.treeselect .treeselect-item input{position:relative;top:1px;margin-right:.2rem}.treeselect .treeselect-item label{margin-bottom:0}.treeselect .dropdown-toggle{padding:0 .5rem .3rem;margin-left:.5rem}.treeselect .dropdown-toggle::after{margin-left:0;font-size:1rem;color:#495057}.treeselect-sub{padding-left:0}.tree-holder ul ul li::before,.tree-holder ul ul li::after{left:8px;display:block}.tree-holder ul ul li::before{top:12px}.tree-holder ul ul li:last-child::after{height:12px}.tree-holder li{line-height:1.8rem}.tree-holder li li{padding-left:20px}.fg-1{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.fg-2{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2}.fg-3{-webkit-box-flex:3;-ms-flex-positive:3;flex-grow:3}.element-invisible{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.hidden{display:none;visibility:hidden}joomla-alert{display:none}.awesomplete{display:block}.btn.btn-xs,.btn-group-xs>.btn{padding:.09rem .4rem;font-size:.7rem;line-height:1.2;border-radius:.2rem}.btn.btn-xs .caret{font-size:16px;line-height:13px}.btn:focus,.btn.focus,.btn:active:focus,.btn.focus:active,.btn.active:focus,.btn.active.focus{text-decoration:none}.btn.group-move{cursor:move}.btn-secondary{color:#343a40;background-color:#fefefe;border-color:#ced4da}.btn-secondary:hover,.btn-secondary:focus{color:#343a40;background-color:#f8f9fa}.card{background-color:#f8f8f8}.card.card-light{background-color:#f8f8f8}.card.card-dark{background-color:#0d1321}.card.card-dark>*,.card.card-dark a:not(.dropdown-item),.card.card-dark .module-dropdown>a{color:#fefefe}.card.card-dark .list-group-item{background:0}.custom-select.custom-select-color-state.custom-select-success{color:#fefefe;background-color:#438243}.custom-select.custom-select-color-state.custom-select-success option{color:#495057;background-color:#fefefe}.custom-select.custom-select-color-state.custom-select-danger{color:#fefefe;background-color:#d9534f}.custom-select.custom-select-color-state.custom-select-danger option{color:#495057;background-color:#fefefe}.accordion .card-header{display:block;font-size:.9286rem;font-weight:bold;line-height:1.2}.accordion .list-group-item{color:#006898}.dropdown-menu{padding:.2rem 0;margin-top:.5rem;background-color:#fefefe;border-color:#ccc}.dropdown-menu::after{position:absolute;top:-1.5rem;left:.9rem;font-family:FontAwesome;font-size:1.6rem;color:#fefefe;text-shadow:0 -1px 0 rgba(0,0,0,0.2);content:"\f0d8"}.dropdown-item{padding:3px .75rem}.dropdown-menu-right::after{right:.9rem;left:auto}.list-group-item{background-color:#fefefe}.list-unstyled .list-unstyled{padding-left:20px}.jviewport-height10{height:10vh}.jviewport-height20{height:20vh}.jviewport-height30{height:30vh}.jviewport-height40{height:40vh}.jviewport-height50{height:50vh}.jviewport-height60{height:60vh}.jviewport-height70{height:70vh}.jviewport-height80{height:80vh}.jviewport-height90{height:90vh}.jviewport-height100{height:100vh}[class*=jviewport-height] iframe{height:100%}.modal-dialog.jviewport-width10{width:10vw;max-width:none}.modal-dialog.jviewport-width20{width:20vw;max-width:none}.modal-dialog.jviewport-width30{width:30vw;max-width:none}.modal-dialog.jviewport-width40{width:40vw;max-width:none}.modal-dialog.jviewport-width50{width:50vw;max-width:none}.modal-dialog.jviewport-width60{width:60vw;max-width:none}.modal-dialog.jviewport-width70{width:70vw;max-width:none}.modal-dialog.jviewport-width80{width:80vw;max-width:none}.modal-dialog.jviewport-width90{width:90vw;max-width:none}.modal-dialog.jviewport-width100{width:100vw;max-width:none}.nav.nav-tabs{padding:0;margin:0;background-color:#f5f5f5;border:1px solid #ccc;border-bottom:0;border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04)}.nav.nav-tabs .nav-item{margin-bottom:0;margin-left:0}.nav.nav-tabs .nav-item:first-of-type .nav-link.active{border-radius:.25rem 0 0;-webkit-box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-item:last-of-type .nav-link{-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-item:last-of-type .nav-link.active{-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link{position:relative;padding:.75em 1em;color:#0d1321;border:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-link.active{background-color:rgba(0,0,0,0.03);background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,0.05)));background-image:linear-gradient(to bottom,transparent,rgba(0,0,0,0.05) 100%);border-right:0;border-left:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link.active::after{position:absolute;right:0;bottom:-1px;left:0;height:5px;content:"";background-color:#006898;opacity:.8}.nav-tabs+.tab-content{padding:15px;background:#fefefe;border:1px solid;border-color:#ccc;border-radius:0 0 .25rem .25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.pagination{margin:1rem}.table thead th{white-space:nowrap;border-bottom-width:1px}.table th,.table td{padding:8px;vertical-align:middle}.table th label,.table td label{margin-bottom:0}.chzn-container.chzn-container-single .chzn-single{display:inline-block;max-width:100%;height:calc(calc(2.25rem + 2px) - 2px);padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem \9;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-image:none \9;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-box-shadow:none;box-shadow:none;-moz-appearance:none;-webkit-appearance:none}.chzn-container.chzn-container-single .chzn-single abbr{top:10px}.chzn-container.chzn-container-single .chzn-single:focus{border-color:#19b6ff;outline:0}.chzn-container.chzn-container-single .chzn-single:disabled{color:#868e96;cursor:not-allowed;background-color:#e9ecef}.chzn-container.chzn-container-single .chzn-single div b{background:0}.chzn-container.chzn-container-single .chzn-drop{background:#fefefe;border:1px solid #ced4da}.chzn-container.chzn-container-single.chzn-container-active .chzn-single{border-bottom-right-radius:0;border-bottom-left-radius:0}.chzn-container-single{width:auto !important}.card .chzn-container.chzn-container-single{width:100% !important}.card .chzn-container.chzn-container-single .chzn-single{width:100% !important}.gu-mirror{position:fixed !important;z-index:9999 !important;margin:0 !important;cursor:move;background-color:#90ee90;opacity:.8}.gu-mirror.table{display:table}.gu-mirror.table td{display:table-cell}.js-draggable .sortable-handler{cursor:move}.minicolors-theme-bootstrap .minicolors-input{width:120px}.minicolors-theme-bootstrap .rgb{width:175px}.minicolors-theme-bootstrap .rgba{width:220px}.editor .toggle-editor{margin-top:1rem}.editor .mce-tinymce{border:1px solid #ccc;border-radius:.25rem}.editor .mce-btn,.editor .mce-panel{background:#f8f8f8}.com_config .content{background-color:transparent}.com_config [class^='col-']>fieldset{margin-bottom:2rem}.com_cpanel .content{margin-top:0}.com_cpanel .card{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.com_cpanel .card p:first-of-type{margin-top:1rem}.com_cpanel .card p:last-child{margin-bottom:0}.com_cpanel .card .list-group{margin-top:0;margin-right:-1.25rem;margin-bottom:-1.25rem;margin-left:-1.25rem}.com_cpanel .card .list-group>li{padding:.6rem 1.25rem;overflow:hidden}.com_cpanel .card .list-group>.published{padding-left:.9rem;border-left:5px solid #438243}.com_cpanel .card .list-group>.unpublished{padding-left:.9rem;border-left:5px solid #d9534f}.com_cpanel .card .list-group:first-of-type{border-top:0}.com_cpanel .card .list-group-item:first-child{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card .list-group-item:last-child{border-bottom:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card-title{position:relative;padding:.9em 1.25rem .75rem;margin-top:-1.25rem;margin-right:-1.25rem;margin-bottom:0;margin-left:-1.25rem;font-size:.9286rem;color:#1c3d5c;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15)}.com_cpanel .module-actions{position:absolute;top:0;right:0;z-index:2}.com_cpanel .module-actions>a{display:inline-block;width:2.6em;height:2.6em;line-height:2.6em;color:#495057;text-align:center;background-color:#f5f5f5;border-left:1px solid #ccc;border-top-right-radius:.25rem;-webkit-box-shadow:1px 0 #fefefe inset;box-shadow:1px 0 #fefefe inset}.com_cpanel .module-actions>a:hover,.com_cpanel .module-actions>a:focus{background-color:#f0f0f0;-webkit-box-shadow:none;box-shadow:none}.admin.com_modules .js-stools-container-bar .btn-toolbar{float:left}.menu-assignment{position:relative}.menu-assignment .menu-links{padding-left:0;margin-top:15px;margin-left:0;-webkit-column-count:3;column-count:3;-webkit-column-gap:15px;column-gap:15px}.menu-assignment .menu-links>li{display:inline-block;width:100%;margin-bottom:15px;vertical-align:top;list-style:none;column-break-inside:avoid;-webkit-backface-visibility:hidden;backface-visibility:hidden}.menu-assignment .menu-links-block{padding:15px;background-color:#fafafa;border:1px solid #ddd;border-radius:3px}.menu-assignment label{display:block}.menu-assignment label input{position:relative;top:2px}@media(max-width:767px){.menu-assignment .menu-links{-webkit-column-count:auto;column-count:auto}}.com_users.view-debuggroup thead th,.com_users.view-debuguser thead th{white-space:normal}.com_users.view-debuggroup .legend,.com_users.view-debuguser .legend{margin:1rem 1rem 0}.container-main,.system-debug{padding-bottom:50px}.container-main{position:relative;min-height:calc(100vh - 50px);padding-top:15px;background-color:#f2f2f2}@media(max-width:991.98px){.container-main{padding-left:50px;margin-top:47px}}.list-view-main .container-main{background-color:#f2f2f2}.content{margin-top:45px;border-radius:.25rem}.content>.row{margin-right:0;margin-left:0}.j-main-container{background-color:#fefefe;border:1px solid rgba(0,0,0,0.17);border-radius:.25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.075);box-shadow:0 0 3px rgba(0,0,0,0.075)}.row-selected{background-color:#d9edf7}.chzn-container-single{width:auto !important}.item-associations{padding:0}.item-associations li{display:inline-block;list-style:none}dl,ol,ul{padding-right:0}th{text-align:right}.close{float:left}.notify-alerts .close{right:auto;left:-.5rem}.control-group .control-label{float:right;text-align:right}.dropdown-menu-right{right:auto;left:0}.dropdown-menu-right::after{right:auto;left:.9rem}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:.25rem;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:.25rem}.switcher-labels{margin-right:10px;margin-left:0}.switcher-labels span{right:0;left:auto}.wrapper{padding-right:250px;padding-left:0}.wrapper.closed{padding-right:50px}.wrapper.closed .main-brand img{position:relative;left:151px}.sidebar-wrapper{right:0;left:auto}.notify-alerts{margin-right:125px;margin-left:0}.closed .notify-alerts{margin-right:0}.header .page-title [class^="icon-"]{margin-right:0;margin-left:15px}.menu-collapse{right:0;left:auto;margin-right:-7.5px;margin-left:0}.menu-toggle-icon::before{content:"\f054"}.closed .menu-toggle-icon::before{content:"\f053"}.quick-icons a::before{right:auto;left:-40px}.quick-icons a [class*=" icon-"],.quick-icons a [class^="icon-"]{border-right:0;border-left:1px solid rgba(255,255,255,0.15)}.main-nav .fa{margin:0 12px 0 8px}.main-nav .open>a+ul{right:50px;left:auto}.main-nav .collapse-level-2{right:100%;left:auto;border-radius:.25rem 0 0 .25rem}.main-nav .close{float:left}.main-nav .parent .collapse-arrow::after{right:auto;left:15px;content:"\f0d9"}.child-open>.open>a::before{right:0;left:auto}.status{margin-right:250px;margin-left:0}.closed .status{margin-right:50px;margin-left:0}.sidebar-wrapper[data-hidden="1"] ~ .status{margin-right:0}.subhead .btn-group-sm>.btn [class^="icon-"],.subhead .btn-group-sm>.btn [class*=" icon-"],.subhead .btn-group-sm>.btn [class^="fa-"],.subhead .btn-group-sm>.btn [class*=" fa-"]{margin:0 -10px 0 6px;border-right:0;border-left:1px solid #ccc;border-radius:0 3px 3px 0}.subhead .btn-toolbar>*:first-of-type{margin-right:0}.subhead .btn-group-sm>.btn [class*=" fa-"],.subhead .btn-group-sm>.btn [class*=" icon-"],.subhead .btn-group-sm>.btn [class^="fa-"],.subhead .btn-group-sm>.btn [class^="icon-"],.subhead .btn-sm [class*=" fa-"],.subhead .btn-sm [class*=" icon-"],.subhead .btn-sm [class^="fa-"],.subhead .btn-sm [class^="icon-"]{margin:0 -10px 0 6px;border-right:0;border-left:1px solid #ccc;border-radius:0 3px 3px 0}.com_cpanel .card .list-group>.published{border-right:5px solid #438243;border-left:0}.com_cpanel .card .list-group>.unpublished{border-right:5px solid #d9534f;border-left:0}.com_cpanel .card .module-dropdown{right:auto;left:0}.com_cpanel .card .module-dropdown>a{border-right:1px solid #ccc;border-left:0;border-top-left-radius:.25rem;border-top-right-radius:0} \ No newline at end of file diff --git a/administrator/templates/atum/css/template.css b/administrator/templates/atum/css/template.css index 56db8e72cab56..098a4c5800b9e 100644 --- a/administrator/templates/atum/css/template.css +++ b/administrator/templates/atum/css/template.css @@ -1073,7 +1073,7 @@ iframe { margin-right: .25rem; } .subhead .btn-group .btn { margin-left: 0; } - .subhead button:first-of-type { + .subhead a:first-child, .subhead button:first-child, .subhead div:first-child { margin: 0; } .subhead .btn-group-sm > .btn, .subhead .btn-sm { @@ -1083,9 +1083,6 @@ iframe { padding: 0 10px; font-size: .875rem; line-height: 1.8rem; - color: #212529; - background-color: #fefefe; - border-color: #ccc; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .subhead .btn-sm [class^="icon-"], @@ -1105,53 +1102,78 @@ iframe { .subhead .btn-sm:hover { background-color: #e9ecef; border-color: #ccc; } - .subhead .btn-primary [class^="icon-"], - .subhead .btn-primary [class*=" icon-"], - .subhead .btn-primary [class^="fa-"], - .subhead .btn-primary [class*=" fa-"], - .subhead .btn-outline-primary [class^="icon-"], - .subhead .btn-outline-primary [class*=" icon-"], - .subhead .btn-outline-primary [class^="fa-"], - .subhead .btn-outline-primary [class*=" fa-"] { - color: #006898; } - .subhead .btn-success [class^="icon-"], - .subhead .btn-success [class*=" icon-"], - .subhead .btn-success [class^="fa-"], - .subhead .btn-success [class*=" fa-"], - .subhead .btn-outline-success [class^="icon-"], - .subhead .btn-outline-success [class*=" icon-"], - .subhead .btn-outline-success [class^="fa-"], - .subhead .btn-outline-success [class*=" fa-"] { - color: #438243; } - .subhead .btn-info [class^="icon-"], - .subhead .btn-info [class*=" icon-"], - .subhead .btn-info [class^="fa-"], - .subhead .btn-info [class*=" fa-"], - .subhead .btn-outline-info [class^="icon-"], - .subhead .btn-outline-info [class*=" icon-"], - .subhead .btn-outline-info [class^="fa-"], - .subhead .btn-outline-info [class*=" fa-"] { - color: #17a2b8; } - .subhead .btn-danger [class^="icon-"], - .subhead .btn-danger [class*=" icon-"], - .subhead .btn-danger [class^="fa-"], - .subhead .btn-danger [class*=" fa-"], - .subhead .btn-outline-danger [class^="icon-"], - .subhead .btn-outline-danger [class*=" icon-"], - .subhead .btn-outline-danger [class^="fa-"], - .subhead .btn-outline-danger [class*=" fa-"] { - color: #d9534f; } - .subhead .btn-warning [class^="icon-"], - .subhead .btn-warning [class*=" icon-"], - .subhead .btn-warning [class^="fa-"], - .subhead .btn-warning [class*=" fa-"], - .subhead .btn-outline-warning [class^="icon-"], - .subhead .btn-outline-warning [class*=" icon-"], - .subhead .btn-outline-warning [class^="fa-"], - .subhead .btn-outline-warning [class*=" fa-"] { - color: #f0ad4e; } + .subhead .btn-outline-primary { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-primary [class^="icon-"], + .subhead .btn-outline-primary [class*=" icon-"], + .subhead .btn-outline-primary [class^="fa-"], + .subhead .btn-outline-primary [class*=" fa-"] { + color: #006898; } + .subhead .btn-primary:not(.dropdown-toggle) { + color: #fefefe; + background-color: #006898; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-primary:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-primary:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-primary:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-primary:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-primary:not(.dropdown-toggle):hover { + background-color: #004565; } + .subhead .btn-primary.dropdown-toggle { + background: #003e5b; + border-color: #003e5b; } + .subhead .btn-primary.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-secondary { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-secondary [class^="icon-"], + .subhead .btn-outline-secondary [class*=" icon-"], + .subhead .btn-outline-secondary [class^="fa-"], + .subhead .btn-outline-secondary [class*=" fa-"] { + color: #868e96; } + .subhead .btn-secondary:not(.dropdown-toggle) { + color: #fefefe; + background-color: #868e96; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-secondary:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-secondary:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-secondary:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-secondary:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-secondary:not(.dropdown-toggle):hover { + background-color: #6c757d; } + .subhead .btn-secondary.dropdown-toggle { + background: #686f77; + border-color: #686f77; } + .subhead .btn-secondary.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-success { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-success [class^="icon-"], + .subhead .btn-outline-success [class*=" icon-"], + .subhead .btn-outline-success [class^="fa-"], + .subhead .btn-outline-success [class*=" fa-"] { + color: #438243; } .subhead .btn-success:not(.dropdown-toggle) { - width: 140px; color: #fefefe; background-color: #438243; border-color: rgba(0, 0, 0, 0.2); } @@ -1173,6 +1195,163 @@ iframe { border-color: #2e5a2e; } .subhead .btn-success.dropdown-toggle::after { color: #fefefe; } + .subhead .btn-outline-info { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-info [class^="icon-"], + .subhead .btn-outline-info [class*=" icon-"], + .subhead .btn-outline-info [class^="fa-"], + .subhead .btn-outline-info [class*=" fa-"] { + color: #17a2b8; } + .subhead .btn-info:not(.dropdown-toggle) { + color: #fefefe; + background-color: #17a2b8; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-info:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-info:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-info:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-info:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-info:not(.dropdown-toggle):hover { + background-color: #117a8b; } + .subhead .btn-info.dropdown-toggle { + background: #107282; + border-color: #107282; } + .subhead .btn-info.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-warning { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-warning [class^="icon-"], + .subhead .btn-outline-warning [class*=" icon-"], + .subhead .btn-outline-warning [class^="fa-"], + .subhead .btn-outline-warning [class*=" fa-"] { + color: #f0ad4e; } + .subhead .btn-warning:not(.dropdown-toggle) { + color: #fefefe; + background-color: #f0ad4e; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-warning:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-warning:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-warning:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-warning:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-warning:not(.dropdown-toggle):hover { + background-color: #ec971f; } + .subhead .btn-warning.dropdown-toggle { + background: #eb9316; + border-color: #eb9316; } + .subhead .btn-warning.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-danger { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-danger [class^="icon-"], + .subhead .btn-outline-danger [class*=" icon-"], + .subhead .btn-outline-danger [class^="fa-"], + .subhead .btn-outline-danger [class*=" fa-"] { + color: #d9534f; } + .subhead .btn-danger:not(.dropdown-toggle) { + color: #fefefe; + background-color: #d9534f; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-danger:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-danger:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-danger:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-danger:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-danger:not(.dropdown-toggle):hover { + background-color: #c9302c; } + .subhead .btn-danger.dropdown-toggle { + background: #c12e2a; + border-color: #c12e2a; } + .subhead .btn-danger.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-light { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-light [class^="icon-"], + .subhead .btn-outline-light [class*=" icon-"], + .subhead .btn-outline-light [class^="fa-"], + .subhead .btn-outline-light [class*=" fa-"] { + color: #f8f9fa; } + .subhead .btn-light:not(.dropdown-toggle) { + color: #fefefe; + background-color: #f8f9fa; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-light:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-light:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-light:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-light:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-light:not(.dropdown-toggle):hover { + background-color: #dae0e5; } + .subhead .btn-light.dropdown-toggle { + background: #d4dae1; + border-color: #d4dae1; } + .subhead .btn-light.dropdown-toggle::after { + color: #fefefe; } + .subhead .btn-outline-dark { + color: #212529; + background-color: #fefefe; + border-color: #ccc; } + .subhead .btn-outline-dark [class^="icon-"], + .subhead .btn-outline-dark [class*=" icon-"], + .subhead .btn-outline-dark [class^="fa-"], + .subhead .btn-outline-dark [class*=" fa-"] { + color: #343a40; } + .subhead .btn-dark:not(.dropdown-toggle) { + color: #fefefe; + background-color: #343a40; + border-color: rgba(0, 0, 0, 0.2); } + .subhead .btn-dark:not(.dropdown-toggle) [class^="icon-"], + .subhead .btn-dark:not(.dropdown-toggle) [class*=" icon-"], + .subhead .btn-dark:not(.dropdown-toggle) [class^="fa-"], + .subhead .btn-dark:not(.dropdown-toggle) [class*=" fa-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: #fefefe; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; } + .subhead .btn-dark:not(.dropdown-toggle):hover { + background-color: #1d2124; } + .subhead .btn-dark.dropdown-toggle { + background: #191b1e; + border-color: #191b1e; } + .subhead .btn-dark.dropdown-toggle::after { + color: #fefefe; } + .subhead .button-new, .subhead .button-apply, .subhead .button-wide { + width: 140px; } .subhead > *:first-child:not(.float-sm-right) { margin-left: 0; } .subhead .float-sm-right { diff --git a/administrator/templates/atum/css/template.min.css b/administrator/templates/atum/css/template.min.css index 2309ff7c323a8..07cb4e191f1d7 100644 --- a/administrator/templates/atum/css/template.min.css +++ b/administrator/templates/atum/css/template.min.css @@ -1 +1 @@ -#flying-focus{position:absolute;margin:0;background:transparent;-webkit-transition-property:left,top,width,height;transition-property:left,top,width,height;-webkit-transition-timing-function:cubic-bezier(0,1,0,1);transition-timing-function:cubic-bezier(0,1,0,1);visibility:hidden;pointer-events:none;-webkit-box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;border-radius:2px}#flying-focus.flying-focus_visible{visibility:visible;z-index:9999}@media screen and (-webkit-min-device-pixel-ratio:0){#flying-focus{-webkit-box-shadow:none;box-shadow:none;outline:5px auto -webkit-focus-ring-color;outline-offset:-3px}}.flying-focus_target{outline:none !important}.flying-focus_target::-moz-focus-inner{border:0 !important}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#006898}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#4cc6ff}.custom-control-input:disabled ~ .custom-control-label{color:#868e96}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#19b6ff;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.7rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#19b6ff;-webkit-box-shadow:0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 .2rem rgba(0,104,152,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#19b6ff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.alert-message{background-color:#438243;border-color:#438243;border-left:10px solid #438243;color:#e9ecef}.alert-message hr{border-top-color:#3a713a}.alert-message .alert-link{color:#326032}html,body{height:100%;font-size:14px}body{padding:0;margin:0}h1,h2,h3,h4,h5,h6{font-weight:bold}h1{font-weight:normal}small,.small{font-size:.8rem}.j-main-container .alert{margin:10px}.notify-alerts{position:fixed;top:15px;left:50%;z-index:1031;margin-left:125px;-webkit-transition:all .5s ease;transition:all .5s ease;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.notify-alerts .alert{width:100%;min-width:280px;max-width:400px;margin-bottom:.5rem;opacity:0;-webkit-animation:fadeIn ease-in 1;animation:fadeIn ease-in 1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.notify-alerts .alert:first-of-type{-webkit-animation-delay:.3s;animation-delay:.3s}.notify-alerts.fullWidth{left:265px}.notify-alerts.fullWidth .alert{width:auto;min-width:none;max-width:none;margin-left:0}.notify-alerts .close{position:relative;right:-.5rem;padding:.5rem;line-height:1rem;color:#000;opacity:1}.closed .notify-alerts{margin-left:0}.closed+.notify-alerts.fullWidth{left:70px}.wrapper0 .notify-alerts{margin-left:0}@-webkit-keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.form-control{max-width:240px;background-color:#fefefe}.form-control.input-xlarge{max-width:350px}.form-control.input-xxlarge{max-width:550px}.form-control.input-full{max-width:100%}.control-group{margin-bottom:18px}.control-group>.form-check{display:inline-block}.control-group::after{display:table;clear:both;content:""}.control-group .control-label{float:left;width:220px;padding-top:5px;padding-right:5px;text-align:left}.control-group .controls{margin-left:220px}.form-no-margin .control-group .controls{margin-left:0}.form-no-margin .control-group .control-label{float:none}.custom-select{max-width:240px}.spacer hr{width:380px}td .form-control{display:inline-block;width:auto}legend{margin-bottom:1.1rem}.checkboxes{padding-top:5px}.checkboxes .checkbox input{position:static;margin-left:0}.form-check{padding-top:5px;margin-bottom:0}.modal label{width:100%}.invalid{color:#d9534f;border-color:#d9534f}.valid{border-color:#438243}.form-control-feedback{display:block}.header{position:relative;z-index:5;height:48px;background:#1c3d5c}.header::after{position:absolute;top:100%;width:100%;height:3px;content:"";background-color:#006898;background-image:-webkit-gradient(linear,left top,right top,from(#59afff),to(#59daff));background-image:linear-gradient(to right,#59afff 0,#59daff 100%)}.header .page-title{display:inline-block;margin:0 5px;font-size:1.3rem;font-weight:normal;line-height:48px;color:#fefefe}.header .page-title [class^="icon-"]{margin-right:15px;font-size:1.857rem 1.857rem;vertical-align:middle}.header .navbar-brand{padding:0;font-size:1.1rem;color:#fefefe}.header .navbar-brand:hover,.header .navbar-brand:focus{color:#efefef}@media(min-width:576px) and (max-width:767.98px){.header .navbar-brand{margin-right:0;margin-left:10px}}.header .navbar-brand span{margin-left:.4rem}.header .nav-item{background-color:#2e5a84;border-left:1px solid #1c3d5c}.header .nav-link{position:relative;padding:0;line-height:48px}.header .nav-link .fa{width:50px;font-size:1.2rem;color:#fefefe;vertical-align:middle;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .nav-link .fa-external-link{position:relative;left:2px}.header .nav-link .badge{position:absolute;top:4px;right:2px}.header .nav-link.dropdown-toggle::after{display:none}.header .nav-link:hover .fa{font-size:1.3rem;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .dropdown-notifications{min-width:280px;padding:0;border:0}.header .dropdown-notifications h2{font-size:.9286rem}.header .dropdown-menu::after{left:.65rem}.header .dropdown-menu-right::after{right:.65rem;left:auto}.header .header-profile .dropdown-menu{padding-top:0}.header .header-profile .dropdown-menu::after{color:#f2f2f2}.header .header-profile-user{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:.3rem;background-color:#f2f2f2;border-bottom:1px solid rgba(0,0,0,0.1);border-radius:.25rem .25rem 0 0}.header .list-group-item-text:last-child{margin-bottom:0}.header .joomla-version{margin-right:.9rem;margin-bottom:0;font-size:.9286rem;color:#fefefe}@media(max-width:991.98px){.header{position:fixed;top:0;width:100%}.header+.container-title{margin-top:48px}}.menu-collapse{font-size:2rem;text-align:center}.menu-collapse a{display:block;width:48px;line-height:48px;color:#fff;background-color:#2e5a84}.icon-back::before{content:"\e008"}.icon-crop::before{content:"\f125"}.icon-white{color:#fefefe}.icon-publish{color:#438243}.icon-unpublish{color:#d9534f}.tbody-icon{padding:0 3px;text-align:center;background-color:transparent;border:0}.tbody-icon span{width:26px;height:26px;font-size:1rem;line-height:22px;color:#ccc;border:2px solid #ccc;border-radius:50%}.tbody-icon .icon-publish{color:#438243;border-color:#438243}.tbody-icon .icon-featured{color:#f0ad4e;border-color:#f0ad4e}.tbody-icon .icon-unpublish{color:#d9534f;border-color:#d9534f}.tbody-icon .icon-archive{color:#495057;border-color:#495057}.tbody-icon .icon-checkedout{width:auto;height:auto;font-size:1.2rem;line-height:1rem;color:#495057;border:0}iframe{border:0}.modal iframe{width:100%}.view-login{background:#1c3d5c}.view-login .login-initial{display:none}.view-login .login{width:320px}@media(max-width:767.98px){.view-login .login{padding:0 15px}}.view-login .login-logo{margin:0 0 2rem;text-align:center}@media(max-width:767.98px){.view-login .login-logo{margin:1rem 0}}.view-login h2{font-size:1.9rem;font-weight:300}.view-login .card-img-top{max-width:100%}.view-login .nav p,.view-login .nav a{margin-bottom:0;color:#fff}@media(max-width:575.98px){.view-login .btn{padding:8px 10px;font-size:14px}}.modal .btn{margin-right:.5rem}.modal .btn-primary:not([href]),.modal .btn-success:not([href]){color:#fff}.modal .btn-primary:not([href]):hover,.modal .btn-success:not([href]):hover{color:#fff}.modal-header{padding:0 15px}.modal-header .close{width:46px;height:46px;margin-top:0;margin-right:-15px;font-size:2rem;line-height:1rem;border-left:1px solid #ccc}.modal-body{padding:0;overflow-y:auto}.modal-title{font-weight:normal;line-height:46px}.contentpane{padding:15px}.quick-icons a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:120px;height:120px;margin-right:15px;margin-bottom:15px;color:#fff;text-align:center;background:#1c3d5c;border-radius:3px;-webkit-box-shadow:0 0 5px 0 #1c3d5c;box-shadow:0 0 5px 0 #1c3d5c;-webkit-transition:background .25s ease;transition:background .25s ease}.quick-icons a>div{-webkit-box-flex:1;-ms-flex:1 0 0;flex:1 0 0}@media(max-width:575.98px){.quick-icons a.pulse{-webkit-box-shadow:0 0 0 0 rgba(28,61,92,0.7);box-shadow:0 0 0 0 rgba(28,61,92,0.7);-webkit-animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1);animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1)}}@media(max-width:575.98px){.quick-icons a.pulse.danger,.quick-icons a.pulse.success{-webkit-animation:none;animation:none}}.quick-icons a:hover,.quick-icons a:focus{text-decoration:none;background:#2e5a84}.quick-icons a .j-links-link{display:block;width:100%;padding:0 1rem;font-size:1rem;line-height:1.1}.quick-icons a .fa{margin:5px auto;font-size:2.5rem;font-weight:normal;line-height:3rem}.quick-icons a.danger{background-color:#df706c;-webkit-box-shadow:0 0 5px 0 #df706c;box-shadow:0 0 5px 0 #df706c}.quick-icons a.success{background-color:#4f9a4f;-webkit-box-shadow:0 0 5px 0 #4f9a4f;box-shadow:0 0 5px 0 #4f9a4f}.quick-icons [id*="plg_quickicon"] a,.quick-icons [id*="plg_quickicon"] a::before{-webkit-transition-delay:.4s;transition-delay:.4s}@-webkit-keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}@keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}.js-stools{position:relative;width:100%;padding:8px 10px 0;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15)}.js-stools .btn-wrapper{display:inline-block;margin-right:5px}.js-stools .js-stools-container-filters{position:absolute;right:-1px;z-index:1;display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:10px;margin:0;background-color:#fff;border:1px solid #ccc;border-radius:0 0 0 .25rem;-webkit-box-shadow:-1px 1px 4px rgba(0,0,0,0.05);box-shadow:-1px 1px 4px rgba(0,0,0,0.05)}.js-stools .js-stools-container-filters .js-stools-field-list:last-of-type .custom-select{min-width:auto}.js-stools .js-stools-container-filters .custom-select{width:100%}.js-stools .js-stools-container-filters.js-filters-show{display:-webkit-box;display:-ms-flexbox;display:flex}.js-stools .js-stools-container-filters .chzn-container-single{display:block}.js-stools .js-stools-container-filters .chzn-container-single .chzn-single{display:block;font-size:1rem}.js-stools .js-stools-field-filter .custom-select.active{color:#fff;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23fff' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat scroll right .75rem center/8px 10px;background-color:#006898}.js-stools .js-stools-field-filter .custom-select option{color:#495057;background-color:#fff}.js-stools .js-stools-container-selector{float:left}.js-stools .js-stools-container-bar{float:right}.js-stools .js-stools-container-bar .btn-toolbar{float:left;margin-bottom:8px}.js-stools .js-stools-container-bar .btn-toolbar .btn-group:first-child{margin-left:0}.js-stools .js-stools-container-bar .input-append{margin-bottom:0}.js-stools .js-stools-container-list{float:left;text-align:left}.js-stools .js-stools-container-list .js-stools-field-list:last-child{margin-right:0}.js-stools-column-order [class*=" icon-"],.js-stools-column-order [class^="icon-"]{text-align:center}.wrapper{padding-left:250px;-webkit-transition:all .3s ease;transition:all .3s ease}@media(max-width:991.98px){.wrapper{padding-left:0}}.sidebar-wrapper{position:fixed;left:0;z-index:10;width:250px;height:100%;margin-left:0;background-color:#1c3d5c;-webkit-box-shadow:0 3px 10px rgba(0,0,0,0.5);box-shadow:0 3px 10px rgba(0,0,0,0.5);-webkit-transition:all .3s ease;transition:all .3s ease}.sidebar-wrapper .sidebar-brand{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;overflow:hidden}@media(max-width:991.98px){.sidebar-wrapper{margin-top:3px}.sidebar-wrapper .main-nav{max-height:calc(100vh - 147px)}}.sidebar-wrapper .main-brand{margin-left:5px;font-size:30px;line-height:96px;text-align:center;text-indent:0;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a{display:block;margin-right:5px;overflow:hidden;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a:hover{background:0}.sidebar-wrapper .main-brand img{width:190px}.menu-toggle-icon{width:48px;font-size:1.7rem}.main-nav{position:relative;z-index:1;width:250px;height:calc(100vh - 96px);list-style:none;background-color:#1c3d5c;opacity:1}.main-nav::after{position:absolute;top:0;right:0;bottom:0;width:0;content:"";background-color:#0f2131;-webkit-transition:all .3s ease;transition:all .3s ease}.main-nav>li{background-color:#1c3d5c;border-bottom:1px solid rgba(0,0,0,0.15)}.main-nav>li:first-of-type{border-top:1px solid rgba(0,0,0,0.15)}.main-nav li{max-height:40px;line-height:40px}.main-nav li a{position:relative;display:block;max-height:40px;overflow:hidden;color:#fff;text-decoration:none;cursor:pointer;opacity:1}.main-nav li a:hover{color:#fff;text-decoration:none;background-color:rgba(0,0,0,0.2)}.main-nav li a:active,.main-nav li a:focus{text-decoration:none;outline:0;-webkit-box-shadow:inset 0 0 0 1px #78aeda;box-shadow:inset 0 0 0 1px #78aeda}.main-nav li.menuitem-group a:hover{cursor:text;background:0}.main-nav li ul{position:absolute;top:0;left:50px;z-index:-3;display:block;width:200px;height:100%;padding:0;opacity:0;-webkit-transition:left .2s ease,opacity .2s ease;transition:left .2s ease,opacity .2s ease;-webkit-transition-delay:0;transition-delay:0}.main-nav li ul ul{display:none;opacity:1}.main-nav li ul li{text-indent:15px}.main-nav .close{padding:2px 10px;font-size:1.7rem;color:rgba(255,255,255,0.8);text-indent:0;text-shadow:none}.main-nav .close:hover{background-color:transparent}.main-nav .open>a+ul{left:50px;z-index:1;opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.main-nav li li{line-height:2.2rem;border:0;-webkit-box-shadow:none;box-shadow:none}.main-nav li li a{-webkit-box-shadow:none;box-shadow:none}.main-nav li li a:hover{background-color:#2e5a84;-webkit-box-shadow:inset 2px 0 2px rgba(0,0,0,0.1);box-shadow:inset 2px 0 2px rgba(0,0,0,0.1)}.main-nav li li>span{color:rgba(255,255,255,0.4)}.main-nav li li:last-of-type>a{border-bottom:0}.main-nav .fa{position:relative;top:-2px;display:inline-block;margin:0 12px;font-size:20px;text-align:center;vertical-align:middle}.main-nav .collapse-level-1 a::before{display:none}.main-nav .collapse-level-1 .menuitem-group,.main-nav .collapse-level-1>li:first-of-type{margin:6px 0 0;color:rgba(255,255,255,0.7);text-transform:uppercase;letter-spacing:1px}.main-nav .collapse-level-1 li{position:relative}.main-nav .collapse-level-1 li:hover ul{display:block !important}.main-nav .collapse-level-2{position:absolute;top:0;left:100% !important;height:auto;padding:2px 0;background-color:#152d45;border-radius:0 .25rem .25rem 0;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.2);box-shadow:0 0 8px rgba(0,0,0,0.2)}.main-nav .collapse-level-2>li>a{color:#fff;text-indent:15px}.main-nav .parent .collapse-arrow::after{position:absolute;top:0;right:15px;font-family:FontAwesome;font-size:.75rem;color:#fff;visibility:visible;content:"\f0da";-webkit-transition-delay:.25s;transition-delay:.25s}.closed .main-nav{overflow-x:hidden}.child-open{overflow:visible}.child-open::after{width:200px}.child-open>li.parent>.collapse-arrow::after{visibility:hidden;opacity:0;-webkit-transition-delay:0s;transition-delay:0s}.child-open>li.open>a::before{position:absolute;top:1px;bottom:1px;left:0;width:3px;content:"";background-color:#59afff}.child-open .open>ul{display:block}@media(min-width:992px){.closed{padding-left:50px}}.closed .child-open::after{display:none}.closed .sidebar-wrapper{width:50px;overflow:hidden}.closed .parent .collapse-arrow::after{visibility:hidden;-webkit-transition-delay:0s !important;transition-delay:0s !important}.closed .menu-toggle-icon::before{content:"\f054"}.layout-edit .sidebar-wrapper .no-dropdown:hover{color:#fff;cursor:not-allowed;background:0}.sidebar-item-title{visibility:visible !important;opacity:1 !important}.sidebar-nav ul{padding-left:.5rem}.sidebar-nav li{padding-bottom:3px;font-size:.9rem;font-weight:bold}.sidebar-nav li.nav-header{padding:.5rem 0 .2rem;margin-bottom:.2rem;font-size:.9rem;color:#495057;border-bottom:1px solid #ced4da}.sidebar-nav li.divider{margin:.3rem 0}.sidebar-nav li a{color:#003e5b}.status{z-index:9;padding:5px 10px;margin-left:250px;color:#626262;background:#ebebeb;border-top:1px solid #d4d4d4;-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;-webkit-transition:all .3s ease;transition:all .3s ease;-webkit-transition-delay:0s;transition-delay:0s}.status p{margin:0}.status li,.status a{font-size:14px;color:#555}.closed .status{margin-left:50px}.sidebar-wrapper[data-hidden="1"] ~ .status{margin-left:0}.subhead{position:absolute;top:0;right:0;left:0;width:auto;min-height:43px;padding:15px 0;color:#0c192e;background:#f2f2f2}.subhead .row{margin-right:0;margin-left:0}.subhead .btn-toolbar{margin-bottom:0}.subhead .btn-toolbar>*{margin-left:.5rem}.subhead .btn-group{margin-right:.25rem}.subhead .btn-group .btn{margin-left:0}.subhead button:first-of-type{margin:0}.subhead .btn-group-sm>.btn,.subhead .btn-sm{padding:0 .8rem;line-height:24px}.subhead .btn-sm{padding:0 10px;font-size:.875rem;line-height:1.8rem;color:#212529;background-color:#fefefe;border-color:#ccc;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.subhead .btn-sm [class^="icon-"],.subhead .btn-sm [class*=" icon-"],.subhead .btn-sm [class^="fa-"],.subhead .btn-sm [class*=" fa-"]{z-index:-1;display:inline-block;width:28px;height:auto;margin:0 6px 0 -10px;line-height:1.8rem;color:inherit;background-color:#e9ecef;border-right:1px solid #ccc;border-radius:3px 0 0 3px}.subhead .btn-sm:hover{background-color:#e9ecef;border-color:#ccc}.subhead .btn-primary [class^="icon-"],.subhead .btn-primary [class*=" icon-"],.subhead .btn-primary [class^="fa-"],.subhead .btn-primary [class*=" fa-"],.subhead .btn-outline-primary [class^="icon-"],.subhead .btn-outline-primary [class*=" icon-"],.subhead .btn-outline-primary [class^="fa-"],.subhead .btn-outline-primary [class*=" fa-"]{color:#006898}.subhead .btn-success [class^="icon-"],.subhead .btn-success [class*=" icon-"],.subhead .btn-success [class^="fa-"],.subhead .btn-success [class*=" fa-"],.subhead .btn-outline-success [class^="icon-"],.subhead .btn-outline-success [class*=" icon-"],.subhead .btn-outline-success [class^="fa-"],.subhead .btn-outline-success [class*=" fa-"]{color:#438243}.subhead .btn-info [class^="icon-"],.subhead .btn-info [class*=" icon-"],.subhead .btn-info [class^="fa-"],.subhead .btn-info [class*=" fa-"],.subhead .btn-outline-info [class^="icon-"],.subhead .btn-outline-info [class*=" icon-"],.subhead .btn-outline-info [class^="fa-"],.subhead .btn-outline-info [class*=" fa-"]{color:#17a2b8}.subhead .btn-danger [class^="icon-"],.subhead .btn-danger [class*=" icon-"],.subhead .btn-danger [class^="fa-"],.subhead .btn-danger [class*=" fa-"],.subhead .btn-outline-danger [class^="icon-"],.subhead .btn-outline-danger [class*=" icon-"],.subhead .btn-outline-danger [class^="fa-"],.subhead .btn-outline-danger [class*=" fa-"]{color:#d9534f}.subhead .btn-warning [class^="icon-"],.subhead .btn-warning [class*=" icon-"],.subhead .btn-warning [class^="fa-"],.subhead .btn-warning [class*=" fa-"],.subhead .btn-outline-warning [class^="icon-"],.subhead .btn-outline-warning [class*=" icon-"],.subhead .btn-outline-warning [class^="fa-"],.subhead .btn-outline-warning [class*=" fa-"]{color:#f0ad4e}.subhead .btn-success:not(.dropdown-toggle){width:140px;color:#fefefe;background-color:#438243;border-color:rgba(0,0,0,0.2)}.subhead .btn-success:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-success:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-success:not(.dropdown-toggle):hover{background-color:#326032}.subhead .btn-success.dropdown-toggle{background:#2e5a2e;border-color:#2e5a2e}.subhead .btn-success.dropdown-toggle::after{color:#fefefe}.subhead>*:first-child:not(.float-sm-right){margin-left:0}.subhead .float-sm-right{margin-left:.8rem}.subhead.subhead-fixed{position:fixed;top:0;left:250px;z-index:9;padding-top:12px;padding-bottom:12px;border-bottom:1px solid #adb5bd}.closed .subhead-fixed{left:55px}.btn-toolbar{margin-bottom:20px;margin-left:0}.treeselect{display:block;padding-left:0;list-style:none}.treeselect .nav-header{font-weight:700;color:#212529}.treeselect li{position:relative;display:block;line-height:2.2rem;list-style:none}.treeselect li::before{position:absolute;top:14px;left:25px;width:10px;height:1px;margin:auto;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li::after{position:absolute;top:0;bottom:0;left:25px;width:1px;height:100%;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li:last-child::after{height:14px}.treeselect li li{padding-left:40px}.treeselect>li::before,.treeselect>li::after{display:none}.treeselect .icon-{display:none}.treeselect .treeselect-toggle{display:inline-block;padding:0;margin-right:.1rem;text-align:center;cursor:pointer}.treeselect .treeselect-menu{display:inline-block}.treeselect .treeselect-item{display:inline-block}.treeselect .treeselect-item input{position:relative;top:1px;margin-right:.2rem}.treeselect .treeselect-item label{margin-bottom:0}.treeselect .dropdown-toggle{padding:0 .5rem .3rem;margin-left:.5rem}.treeselect .dropdown-toggle::after{margin-left:0;font-size:1rem;color:#495057}.treeselect-sub{padding-left:0}.tree-holder ul ul li::before,.tree-holder ul ul li::after{left:8px;display:block}.tree-holder ul ul li::before{top:12px}.tree-holder ul ul li:last-child::after{height:12px}.tree-holder li{line-height:1.8rem}.tree-holder li li{padding-left:20px}.fg-1{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.fg-2{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2}.fg-3{-webkit-box-flex:3;-ms-flex-positive:3;flex-grow:3}.element-invisible{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.hidden{display:none;visibility:hidden}joomla-alert{display:none}.awesomplete{display:block}.btn.btn-xs,.btn-group-xs>.btn{padding:.09rem .4rem;font-size:.7rem;line-height:1.2;border-radius:.2rem}.btn.btn-xs .caret{font-size:16px;line-height:13px}.btn:focus,.btn.focus,.btn:active:focus,.btn.focus:active,.btn.active:focus,.btn.active.focus{text-decoration:none}.btn.group-move{cursor:move}.btn-secondary{color:#343a40;background-color:#fefefe;border-color:#ced4da}.btn-secondary:hover,.btn-secondary:focus{color:#343a40;background-color:#f8f9fa}.card{background-color:#f8f8f8}.card.card-light{background-color:#f8f8f8}.card.card-dark{background-color:#0d1321}.card.card-dark>*,.card.card-dark a:not(.dropdown-item),.card.card-dark .module-dropdown>a{color:#fefefe}.card.card-dark .list-group-item{background:0}.custom-select.custom-select-color-state.custom-select-success{color:#fefefe;background-color:#438243}.custom-select.custom-select-color-state.custom-select-success option{color:#495057;background-color:#fefefe}.custom-select.custom-select-color-state.custom-select-danger{color:#fefefe;background-color:#d9534f}.custom-select.custom-select-color-state.custom-select-danger option{color:#495057;background-color:#fefefe}.accordion .card-header{display:block;font-size:.9286rem;font-weight:bold;line-height:1.2}.accordion .list-group-item{color:#006898}.dropdown-menu{padding:.2rem 0;margin-top:.5rem;background-color:#fefefe;border-color:#ccc}.dropdown-menu::after{position:absolute;top:-1.5rem;left:.9rem;font-family:FontAwesome;font-size:1.6rem;color:#fefefe;text-shadow:0 -1px 0 rgba(0,0,0,0.2);content:"\f0d8"}.dropdown-item{padding:3px .75rem}.dropdown-menu-right::after{right:.9rem;left:auto}.list-group-item{background-color:#fefefe}.list-unstyled .list-unstyled{padding-left:20px}.jviewport-height10{height:10vh}.jviewport-height20{height:20vh}.jviewport-height30{height:30vh}.jviewport-height40{height:40vh}.jviewport-height50{height:50vh}.jviewport-height60{height:60vh}.jviewport-height70{height:70vh}.jviewport-height80{height:80vh}.jviewport-height90{height:90vh}.jviewport-height100{height:100vh}[class*=jviewport-height] iframe{height:100%}.modal-dialog.jviewport-width10{width:10vw;max-width:none}.modal-dialog.jviewport-width20{width:20vw;max-width:none}.modal-dialog.jviewport-width30{width:30vw;max-width:none}.modal-dialog.jviewport-width40{width:40vw;max-width:none}.modal-dialog.jviewport-width50{width:50vw;max-width:none}.modal-dialog.jviewport-width60{width:60vw;max-width:none}.modal-dialog.jviewport-width70{width:70vw;max-width:none}.modal-dialog.jviewport-width80{width:80vw;max-width:none}.modal-dialog.jviewport-width90{width:90vw;max-width:none}.modal-dialog.jviewport-width100{width:100vw;max-width:none}.nav.nav-tabs{padding:0;margin:0;background-color:#f5f5f5;border:1px solid #ccc;border-bottom:0;border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04)}.nav.nav-tabs .nav-item{margin-bottom:0;margin-left:0}.nav.nav-tabs .nav-item:first-of-type .nav-link.active{border-radius:.25rem 0 0;-webkit-box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-item:last-of-type .nav-link{-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-item:last-of-type .nav-link.active{-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link{position:relative;padding:.75em 1em;color:#0d1321;border:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-link.active{background-color:rgba(0,0,0,0.03);background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,0.05)));background-image:linear-gradient(to bottom,transparent,rgba(0,0,0,0.05) 100%);border-right:0;border-left:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link.active::after{position:absolute;right:0;bottom:-1px;left:0;height:5px;content:"";background-color:#006898;opacity:.8}.nav-tabs+.tab-content{padding:15px;background:#fefefe;border:1px solid;border-color:#ccc;border-radius:0 0 .25rem .25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.pagination{margin:1rem}.table thead th{white-space:nowrap;border-bottom-width:1px}.table th,.table td{padding:8px;vertical-align:middle}.table th label,.table td label{margin-bottom:0}.chzn-container.chzn-container-single .chzn-single{display:inline-block;max-width:100%;height:calc(calc(2.25rem + 2px) - 2px);padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem \9;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-image:none \9;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-box-shadow:none;box-shadow:none;-moz-appearance:none;-webkit-appearance:none}.chzn-container.chzn-container-single .chzn-single abbr{top:10px}.chzn-container.chzn-container-single .chzn-single:focus{border-color:#19b6ff;outline:0}.chzn-container.chzn-container-single .chzn-single:disabled{color:#868e96;cursor:not-allowed;background-color:#e9ecef}.chzn-container.chzn-container-single .chzn-single div b{background:0}.chzn-container.chzn-container-single .chzn-drop{background:#fefefe;border:1px solid #ced4da}.chzn-container.chzn-container-single.chzn-container-active .chzn-single{border-bottom-right-radius:0;border-bottom-left-radius:0}.chzn-container-single{width:auto !important}.card .chzn-container.chzn-container-single{width:100% !important}.card .chzn-container.chzn-container-single .chzn-single{width:100% !important}.gu-mirror{position:fixed !important;z-index:9999 !important;margin:0 !important;cursor:move;background-color:#90ee90;opacity:.8}.gu-mirror.table{display:table}.gu-mirror.table td{display:table-cell}.js-draggable .sortable-handler{cursor:move}.minicolors-theme-bootstrap .minicolors-input{width:120px}.minicolors-theme-bootstrap .rgb{width:175px}.minicolors-theme-bootstrap .rgba{width:220px}.editor .toggle-editor{margin-top:1rem}.editor .mce-tinymce{border:1px solid #ccc;border-radius:.25rem}.editor .mce-btn,.editor .mce-panel{background:#f8f8f8}.com_config .content{background-color:transparent}.com_config [class^='col-']>fieldset{margin-bottom:2rem}.com_cpanel .content{margin-top:0}.com_cpanel .card{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.com_cpanel .card p:first-of-type{margin-top:1rem}.com_cpanel .card p:last-child{margin-bottom:0}.com_cpanel .card .list-group{margin-top:0;margin-right:-1.25rem;margin-bottom:-1.25rem;margin-left:-1.25rem}.com_cpanel .card .list-group>li{padding:.6rem 1.25rem;overflow:hidden}.com_cpanel .card .list-group>.published{padding-left:.9rem;border-left:5px solid #438243}.com_cpanel .card .list-group>.unpublished{padding-left:.9rem;border-left:5px solid #d9534f}.com_cpanel .card .list-group:first-of-type{border-top:0}.com_cpanel .card .list-group-item:first-child{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card .list-group-item:last-child{border-bottom:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card-title{position:relative;padding:.9em 1.25rem .75rem;margin-top:-1.25rem;margin-right:-1.25rem;margin-bottom:0;margin-left:-1.25rem;font-size:.9286rem;color:#1c3d5c;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15)}.com_cpanel .module-actions{position:absolute;top:0;right:0;z-index:2}.com_cpanel .module-actions>a{display:inline-block;width:2.6em;height:2.6em;line-height:2.6em;color:#495057;text-align:center;background-color:#f5f5f5;border-left:1px solid #ccc;border-top-right-radius:.25rem;-webkit-box-shadow:1px 0 #fefefe inset;box-shadow:1px 0 #fefefe inset}.com_cpanel .module-actions>a:hover,.com_cpanel .module-actions>a:focus{background-color:#f0f0f0;-webkit-box-shadow:none;box-shadow:none}.admin.com_modules .js-stools-container-bar .btn-toolbar{float:left}.menu-assignment{position:relative}.menu-assignment .menu-links{padding-left:0;margin-top:15px;margin-left:0;-webkit-column-count:3;column-count:3;-webkit-column-gap:15px;column-gap:15px}.menu-assignment .menu-links>li{display:inline-block;width:100%;margin-bottom:15px;vertical-align:top;list-style:none;column-break-inside:avoid;-webkit-backface-visibility:hidden;backface-visibility:hidden}.menu-assignment .menu-links-block{padding:15px;background-color:#fafafa;border:1px solid #ddd;border-radius:3px}.menu-assignment label{display:block}.menu-assignment label input{position:relative;top:2px}@media(max-width:767px){.menu-assignment .menu-links{-webkit-column-count:auto;column-count:auto}}.com_users.view-debuggroup thead th,.com_users.view-debuguser thead th{white-space:normal}.com_users.view-debuggroup .legend,.com_users.view-debuguser .legend{margin:1rem 1rem 0}.container-main,.system-debug{padding-bottom:50px}.container-main{position:relative;min-height:calc(100vh - 50px);padding-top:15px;background-color:#f2f2f2}@media(max-width:991.98px){.container-main{padding-left:50px;margin-top:47px}}.list-view-main .container-main{background-color:#f2f2f2}.content{margin-top:45px;border-radius:.25rem}.content>.row{margin-right:0;margin-left:0}.j-main-container{background-color:#fefefe;border:1px solid rgba(0,0,0,0.17);border-radius:.25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.075);box-shadow:0 0 3px rgba(0,0,0,0.075)}.row-selected{background-color:#d9edf7}.chzn-container-single{width:auto !important}.item-associations{padding:0}.item-associations li{display:inline-block;list-style:none} \ No newline at end of file +#flying-focus{position:absolute;margin:0;background:transparent;-webkit-transition-property:left,top,width,height;transition-property:left,top,width,height;-webkit-transition-timing-function:cubic-bezier(0,1,0,1);transition-timing-function:cubic-bezier(0,1,0,1);visibility:hidden;pointer-events:none;-webkit-box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;box-shadow:0 0 2px 3px #78aeda,0 0 2px #78aeda inset;border-radius:2px}#flying-focus.flying-focus_visible{visibility:visible;z-index:9999}@media screen and (-webkit-min-device-pixel-ratio:0){#flying-focus{-webkit-box-shadow:none;box-shadow:none;outline:5px auto -webkit-focus-ring-color;outline-offset:-3px}}.flying-focus_target{outline:none !important}.flying-focus_target::-moz-focus-inner{border:0 !important}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#006898}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,104,152,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#4cc6ff}.custom-control-input:disabled ~ .custom-control-label{color:#868e96}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#006898}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#006898}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,104,152,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#19b6ff;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(25,182,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.7rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#19b6ff;-webkit-box-shadow:0 0 0 .2rem rgba(0,104,152,0.25);box-shadow:0 0 0 .2rem rgba(0,104,152,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#19b6ff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.alert-message{background-color:#438243;border-color:#438243;border-left:10px solid #438243;color:#e9ecef}.alert-message hr{border-top-color:#3a713a}.alert-message .alert-link{color:#326032}html,body{height:100%;font-size:14px}body{padding:0;margin:0}h1,h2,h3,h4,h5,h6{font-weight:bold}h1{font-weight:normal}small,.small{font-size:.8rem}.j-main-container .alert{margin:10px}.notify-alerts{position:fixed;top:15px;left:50%;z-index:1031;margin-left:125px;-webkit-transition:all .5s ease;transition:all .5s ease;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.notify-alerts .alert{width:100%;min-width:280px;max-width:400px;margin-bottom:.5rem;opacity:0;-webkit-animation:fadeIn ease-in 1;animation:fadeIn ease-in 1;-webkit-animation-duration:.35s;animation-duration:.35s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.notify-alerts .alert:first-of-type{-webkit-animation-delay:.3s;animation-delay:.3s}.notify-alerts.fullWidth{left:265px}.notify-alerts.fullWidth .alert{width:auto;min-width:none;max-width:none;margin-left:0}.notify-alerts .close{position:relative;right:-.5rem;padding:.5rem;line-height:1rem;color:#000;opacity:1}.closed .notify-alerts{margin-left:0}.closed+.notify-alerts.fullWidth{left:70px}.wrapper0 .notify-alerts{margin-left:0}@-webkit-keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeIn{from{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.form-control{max-width:240px;background-color:#fefefe}.form-control.input-xlarge{max-width:350px}.form-control.input-xxlarge{max-width:550px}.form-control.input-full{max-width:100%}.control-group{margin-bottom:18px}.control-group>.form-check{display:inline-block}.control-group::after{display:table;clear:both;content:""}.control-group .control-label{float:left;width:220px;padding-top:5px;padding-right:5px;text-align:left}.control-group .controls{margin-left:220px}.form-no-margin .control-group .controls{margin-left:0}.form-no-margin .control-group .control-label{float:none}.custom-select{max-width:240px}.spacer hr{width:380px}td .form-control{display:inline-block;width:auto}legend{margin-bottom:1.1rem}.checkboxes{padding-top:5px}.checkboxes .checkbox input{position:static;margin-left:0}.form-check{padding-top:5px;margin-bottom:0}.modal label{width:100%}.invalid{color:#d9534f;border-color:#d9534f}.valid{border-color:#438243}.form-control-feedback{display:block}.header{position:relative;z-index:5;height:48px;background:#1c3d5c}.header::after{position:absolute;top:100%;width:100%;height:3px;content:"";background-color:#006898;background-image:-webkit-gradient(linear,left top,right top,from(#59afff),to(#59daff));background-image:linear-gradient(to right,#59afff 0,#59daff 100%)}.header .page-title{display:inline-block;margin:0 5px;font-size:1.3rem;font-weight:normal;line-height:48px;color:#fefefe}.header .page-title [class^="icon-"]{margin-right:15px;font-size:1.857rem 1.857rem;vertical-align:middle}.header .navbar-brand{padding:0;font-size:1.1rem;color:#fefefe}.header .navbar-brand:hover,.header .navbar-brand:focus{color:#efefef}@media(min-width:576px) and (max-width:767.98px){.header .navbar-brand{margin-right:0;margin-left:10px}}.header .navbar-brand span{margin-left:.4rem}.header .nav-item{background-color:#2e5a84;border-left:1px solid #1c3d5c}.header .nav-link{position:relative;padding:0;line-height:48px}.header .nav-link .fa{width:50px;font-size:1.2rem;color:#fefefe;vertical-align:middle;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .nav-link .fa-external-link{position:relative;left:2px}.header .nav-link .badge{position:absolute;top:4px;right:2px}.header .nav-link.dropdown-toggle::after{display:none}.header .nav-link:hover .fa{font-size:1.3rem;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.header .dropdown-notifications{min-width:280px;padding:0;border:0}.header .dropdown-notifications h2{font-size:.9286rem}.header .dropdown-menu::after{left:.65rem}.header .dropdown-menu-right::after{right:.65rem;left:auto}.header .header-profile .dropdown-menu{padding-top:0}.header .header-profile .dropdown-menu::after{color:#f2f2f2}.header .header-profile-user{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:.3rem;background-color:#f2f2f2;border-bottom:1px solid rgba(0,0,0,0.1);border-radius:.25rem .25rem 0 0}.header .list-group-item-text:last-child{margin-bottom:0}.header .joomla-version{margin-right:.9rem;margin-bottom:0;font-size:.9286rem;color:#fefefe}@media(max-width:991.98px){.header{position:fixed;top:0;width:100%}.header+.container-title{margin-top:48px}}.menu-collapse{font-size:2rem;text-align:center}.menu-collapse a{display:block;width:48px;line-height:48px;color:#fff;background-color:#2e5a84}.icon-back::before{content:"\e008"}.icon-crop::before{content:"\f125"}.icon-white{color:#fefefe}.icon-publish{color:#438243}.icon-unpublish{color:#d9534f}.tbody-icon{padding:0 3px;text-align:center;background-color:transparent;border:0}.tbody-icon span{width:26px;height:26px;font-size:1rem;line-height:22px;color:#ccc;border:2px solid #ccc;border-radius:50%}.tbody-icon .icon-publish{color:#438243;border-color:#438243}.tbody-icon .icon-featured{color:#f0ad4e;border-color:#f0ad4e}.tbody-icon .icon-unpublish{color:#d9534f;border-color:#d9534f}.tbody-icon .icon-archive{color:#495057;border-color:#495057}.tbody-icon .icon-checkedout{width:auto;height:auto;font-size:1.2rem;line-height:1rem;color:#495057;border:0}iframe{border:0}.modal iframe{width:100%}.view-login{background:#1c3d5c}.view-login .login-initial{display:none}.view-login .login{width:320px}@media(max-width:767.98px){.view-login .login{padding:0 15px}}.view-login .login-logo{margin:0 0 2rem;text-align:center}@media(max-width:767.98px){.view-login .login-logo{margin:1rem 0}}.view-login h2{font-size:1.9rem;font-weight:300}.view-login .card-img-top{max-width:100%}.view-login .nav p,.view-login .nav a{margin-bottom:0;color:#fff}@media(max-width:575.98px){.view-login .btn{padding:8px 10px;font-size:14px}}.modal .btn{margin-right:.5rem}.modal .btn-primary:not([href]),.modal .btn-success:not([href]){color:#fff}.modal .btn-primary:not([href]):hover,.modal .btn-success:not([href]):hover{color:#fff}.modal-header{padding:0 15px}.modal-header .close{width:46px;height:46px;margin-top:0;margin-right:-15px;font-size:2rem;line-height:1rem;border-left:1px solid #ccc}.modal-body{padding:0;overflow-y:auto}.modal-title{font-weight:normal;line-height:46px}.contentpane{padding:15px}.quick-icons a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:120px;height:120px;margin-right:15px;margin-bottom:15px;color:#fff;text-align:center;background:#1c3d5c;border-radius:3px;-webkit-box-shadow:0 0 5px 0 #1c3d5c;box-shadow:0 0 5px 0 #1c3d5c;-webkit-transition:background .25s ease;transition:background .25s ease}.quick-icons a>div{-webkit-box-flex:1;-ms-flex:1 0 0;flex:1 0 0}@media(max-width:575.98px){.quick-icons a.pulse{-webkit-box-shadow:0 0 0 0 rgba(28,61,92,0.7);box-shadow:0 0 0 0 rgba(28,61,92,0.7);-webkit-animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1);animation:pulse 1.25s infinite cubic-bezier(0.66,0,0,1)}}@media(max-width:575.98px){.quick-icons a.pulse.danger,.quick-icons a.pulse.success{-webkit-animation:none;animation:none}}.quick-icons a:hover,.quick-icons a:focus{text-decoration:none;background:#2e5a84}.quick-icons a .j-links-link{display:block;width:100%;padding:0 1rem;font-size:1rem;line-height:1.1}.quick-icons a .fa{margin:5px auto;font-size:2.5rem;font-weight:normal;line-height:3rem}.quick-icons a.danger{background-color:#df706c;-webkit-box-shadow:0 0 5px 0 #df706c;box-shadow:0 0 5px 0 #df706c}.quick-icons a.success{background-color:#4f9a4f;-webkit-box-shadow:0 0 5px 0 #4f9a4f;box-shadow:0 0 5px 0 #4f9a4f}.quick-icons [id*="plg_quickicon"] a,.quick-icons [id*="plg_quickicon"] a::before{-webkit-transition-delay:.4s;transition-delay:.4s}@-webkit-keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}@keyframes pulse{to{-webkit-box-shadow:0 0 0 15px rgba(232,76,61,0);box-shadow:0 0 0 15px rgba(232,76,61,0)}}.js-stools{position:relative;width:100%;padding:8px 10px 0;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15)}.js-stools .btn-wrapper{display:inline-block;margin-right:5px}.js-stools .js-stools-container-filters{position:absolute;right:-1px;z-index:1;display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:10px;margin:0;background-color:#fff;border:1px solid #ccc;border-radius:0 0 0 .25rem;-webkit-box-shadow:-1px 1px 4px rgba(0,0,0,0.05);box-shadow:-1px 1px 4px rgba(0,0,0,0.05)}.js-stools .js-stools-container-filters .js-stools-field-list:last-of-type .custom-select{min-width:auto}.js-stools .js-stools-container-filters .custom-select{width:100%}.js-stools .js-stools-container-filters.js-filters-show{display:-webkit-box;display:-ms-flexbox;display:flex}.js-stools .js-stools-container-filters .chzn-container-single{display:block}.js-stools .js-stools-container-filters .chzn-container-single .chzn-single{display:block;font-size:1rem}.js-stools .js-stools-field-filter .custom-select.active{color:#fff;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23fff' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat scroll right .75rem center/8px 10px;background-color:#006898}.js-stools .js-stools-field-filter .custom-select option{color:#495057;background-color:#fff}.js-stools .js-stools-container-selector{float:left}.js-stools .js-stools-container-bar{float:right}.js-stools .js-stools-container-bar .btn-toolbar{float:left;margin-bottom:8px}.js-stools .js-stools-container-bar .btn-toolbar .btn-group:first-child{margin-left:0}.js-stools .js-stools-container-bar .input-append{margin-bottom:0}.js-stools .js-stools-container-list{float:left;text-align:left}.js-stools .js-stools-container-list .js-stools-field-list:last-child{margin-right:0}.js-stools-column-order [class*=" icon-"],.js-stools-column-order [class^="icon-"]{text-align:center}.wrapper{padding-left:250px;-webkit-transition:all .3s ease;transition:all .3s ease}@media(max-width:991.98px){.wrapper{padding-left:0}}.sidebar-wrapper{position:fixed;left:0;z-index:10;width:250px;height:100%;margin-left:0;background-color:#1c3d5c;-webkit-box-shadow:0 3px 10px rgba(0,0,0,0.5);box-shadow:0 3px 10px rgba(0,0,0,0.5);-webkit-transition:all .3s ease;transition:all .3s ease}.sidebar-wrapper .sidebar-brand{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;overflow:hidden}@media(max-width:991.98px){.sidebar-wrapper{margin-top:3px}.sidebar-wrapper .main-nav{max-height:calc(100vh - 147px)}}.sidebar-wrapper .main-brand{margin-left:5px;font-size:30px;line-height:96px;text-align:center;text-indent:0;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a{display:block;margin-right:5px;overflow:hidden;border:0;-webkit-box-shadow:none;box-shadow:none}.sidebar-wrapper .main-brand a:hover{background:0}.sidebar-wrapper .main-brand img{width:190px}.menu-toggle-icon{width:48px;font-size:1.7rem}.main-nav{position:relative;z-index:1;width:250px;height:calc(100vh - 96px);list-style:none;background-color:#1c3d5c;opacity:1}.main-nav::after{position:absolute;top:0;right:0;bottom:0;width:0;content:"";background-color:#0f2131;-webkit-transition:all .3s ease;transition:all .3s ease}.main-nav>li{background-color:#1c3d5c;border-bottom:1px solid rgba(0,0,0,0.15)}.main-nav>li:first-of-type{border-top:1px solid rgba(0,0,0,0.15)}.main-nav li{max-height:40px;line-height:40px}.main-nav li a{position:relative;display:block;max-height:40px;overflow:hidden;color:#fff;text-decoration:none;cursor:pointer;opacity:1}.main-nav li a:hover{color:#fff;text-decoration:none;background-color:rgba(0,0,0,0.2)}.main-nav li a:active,.main-nav li a:focus{text-decoration:none;outline:0;-webkit-box-shadow:inset 0 0 0 1px #78aeda;box-shadow:inset 0 0 0 1px #78aeda}.main-nav li.menuitem-group a:hover{cursor:text;background:0}.main-nav li ul{position:absolute;top:0;left:50px;z-index:-3;display:block;width:200px;height:100%;padding:0;opacity:0;-webkit-transition:left .2s ease,opacity .2s ease;transition:left .2s ease,opacity .2s ease;-webkit-transition-delay:0;transition-delay:0}.main-nav li ul ul{display:none;opacity:1}.main-nav li ul li{text-indent:15px}.main-nav .close{padding:2px 10px;font-size:1.7rem;color:rgba(255,255,255,0.8);text-indent:0;text-shadow:none}.main-nav .close:hover{background-color:transparent}.main-nav .open>a+ul{left:50px;z-index:1;opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.main-nav li li{line-height:2.2rem;border:0;-webkit-box-shadow:none;box-shadow:none}.main-nav li li a{-webkit-box-shadow:none;box-shadow:none}.main-nav li li a:hover{background-color:#2e5a84;-webkit-box-shadow:inset 2px 0 2px rgba(0,0,0,0.1);box-shadow:inset 2px 0 2px rgba(0,0,0,0.1)}.main-nav li li>span{color:rgba(255,255,255,0.4)}.main-nav li li:last-of-type>a{border-bottom:0}.main-nav .fa{position:relative;top:-2px;display:inline-block;margin:0 12px;font-size:20px;text-align:center;vertical-align:middle}.main-nav .collapse-level-1 a::before{display:none}.main-nav .collapse-level-1 .menuitem-group,.main-nav .collapse-level-1>li:first-of-type{margin:6px 0 0;color:rgba(255,255,255,0.7);text-transform:uppercase;letter-spacing:1px}.main-nav .collapse-level-1 li{position:relative}.main-nav .collapse-level-1 li:hover ul{display:block !important}.main-nav .collapse-level-2{position:absolute;top:0;left:100% !important;height:auto;padding:2px 0;background-color:#152d45;border-radius:0 .25rem .25rem 0;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.2);box-shadow:0 0 8px rgba(0,0,0,0.2)}.main-nav .collapse-level-2>li>a{color:#fff;text-indent:15px}.main-nav .parent .collapse-arrow::after{position:absolute;top:0;right:15px;font-family:FontAwesome;font-size:.75rem;color:#fff;visibility:visible;content:"\f0da";-webkit-transition-delay:.25s;transition-delay:.25s}.closed .main-nav{overflow-x:hidden}.child-open{overflow:visible}.child-open::after{width:200px}.child-open>li.parent>.collapse-arrow::after{visibility:hidden;opacity:0;-webkit-transition-delay:0s;transition-delay:0s}.child-open>li.open>a::before{position:absolute;top:1px;bottom:1px;left:0;width:3px;content:"";background-color:#59afff}.child-open .open>ul{display:block}@media(min-width:992px){.closed{padding-left:50px}}.closed .child-open::after{display:none}.closed .sidebar-wrapper{width:50px;overflow:hidden}.closed .parent .collapse-arrow::after{visibility:hidden;-webkit-transition-delay:0s !important;transition-delay:0s !important}.closed .menu-toggle-icon::before{content:"\f054"}.layout-edit .sidebar-wrapper .no-dropdown:hover{color:#fff;cursor:not-allowed;background:0}.sidebar-item-title{visibility:visible !important;opacity:1 !important}.sidebar-nav ul{padding-left:.5rem}.sidebar-nav li{padding-bottom:3px;font-size:.9rem;font-weight:bold}.sidebar-nav li.nav-header{padding:.5rem 0 .2rem;margin-bottom:.2rem;font-size:.9rem;color:#495057;border-bottom:1px solid #ced4da}.sidebar-nav li.divider{margin:.3rem 0}.sidebar-nav li a{color:#003e5b}.status{z-index:9;padding:5px 10px;margin-left:250px;color:#626262;background:#ebebeb;border-top:1px solid #d4d4d4;-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;box-shadow:0 1px 0 rgba(255,255,255,0.8) inset;-webkit-transition:all .3s ease;transition:all .3s ease;-webkit-transition-delay:0s;transition-delay:0s}.status p{margin:0}.status li,.status a{font-size:14px;color:#555}.closed .status{margin-left:50px}.sidebar-wrapper[data-hidden="1"] ~ .status{margin-left:0}.subhead{position:absolute;top:0;right:0;left:0;width:auto;min-height:43px;padding:15px 0;color:#0c192e;background:#f2f2f2}.subhead .row{margin-right:0;margin-left:0}.subhead .btn-toolbar{margin-bottom:0}.subhead .btn-toolbar>*{margin-left:.5rem}.subhead .btn-group{margin-right:.25rem}.subhead .btn-group .btn{margin-left:0}.subhead a:first-child,.subhead button:first-child,.subhead div:first-child{margin:0}.subhead .btn-group-sm>.btn,.subhead .btn-sm{padding:0 .8rem;line-height:24px}.subhead .btn-sm{padding:0 10px;font-size:.875rem;line-height:1.8rem;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.subhead .btn-sm [class^="icon-"],.subhead .btn-sm [class*=" icon-"],.subhead .btn-sm [class^="fa-"],.subhead .btn-sm [class*=" fa-"]{z-index:-1;display:inline-block;width:28px;height:auto;margin:0 6px 0 -10px;line-height:1.8rem;color:inherit;background-color:#e9ecef;border-right:1px solid #ccc;border-radius:3px 0 0 3px}.subhead .btn-sm:hover{background-color:#e9ecef;border-color:#ccc}.subhead .btn-outline-primary{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-primary [class^="icon-"],.subhead .btn-outline-primary [class*=" icon-"],.subhead .btn-outline-primary [class^="fa-"],.subhead .btn-outline-primary [class*=" fa-"]{color:#006898}.subhead .btn-primary:not(.dropdown-toggle){color:#fefefe;background-color:#006898;border-color:rgba(0,0,0,0.2)}.subhead .btn-primary:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-primary:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-primary:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-primary:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-primary:not(.dropdown-toggle):hover{background-color:#004565}.subhead .btn-primary.dropdown-toggle{background:#003e5b;border-color:#003e5b}.subhead .btn-primary.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-secondary{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-secondary [class^="icon-"],.subhead .btn-outline-secondary [class*=" icon-"],.subhead .btn-outline-secondary [class^="fa-"],.subhead .btn-outline-secondary [class*=" fa-"]{color:#868e96}.subhead .btn-secondary:not(.dropdown-toggle){color:#fefefe;background-color:#868e96;border-color:rgba(0,0,0,0.2)}.subhead .btn-secondary:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-secondary:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-secondary:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-secondary:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-secondary:not(.dropdown-toggle):hover{background-color:#6c757d}.subhead .btn-secondary.dropdown-toggle{background:#686f77;border-color:#686f77}.subhead .btn-secondary.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-success{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-success [class^="icon-"],.subhead .btn-outline-success [class*=" icon-"],.subhead .btn-outline-success [class^="fa-"],.subhead .btn-outline-success [class*=" fa-"]{color:#438243}.subhead .btn-success:not(.dropdown-toggle){color:#fefefe;background-color:#438243;border-color:rgba(0,0,0,0.2)}.subhead .btn-success:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-success:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-success:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-success:not(.dropdown-toggle):hover{background-color:#326032}.subhead .btn-success.dropdown-toggle{background:#2e5a2e;border-color:#2e5a2e}.subhead .btn-success.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-info{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-info [class^="icon-"],.subhead .btn-outline-info [class*=" icon-"],.subhead .btn-outline-info [class^="fa-"],.subhead .btn-outline-info [class*=" fa-"]{color:#17a2b8}.subhead .btn-info:not(.dropdown-toggle){color:#fefefe;background-color:#17a2b8;border-color:rgba(0,0,0,0.2)}.subhead .btn-info:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-info:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-info:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-info:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-info:not(.dropdown-toggle):hover{background-color:#117a8b}.subhead .btn-info.dropdown-toggle{background:#107282;border-color:#107282}.subhead .btn-info.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-warning{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-warning [class^="icon-"],.subhead .btn-outline-warning [class*=" icon-"],.subhead .btn-outline-warning [class^="fa-"],.subhead .btn-outline-warning [class*=" fa-"]{color:#f0ad4e}.subhead .btn-warning:not(.dropdown-toggle){color:#fefefe;background-color:#f0ad4e;border-color:rgba(0,0,0,0.2)}.subhead .btn-warning:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-warning:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-warning:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-warning:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-warning:not(.dropdown-toggle):hover{background-color:#ec971f}.subhead .btn-warning.dropdown-toggle{background:#eb9316;border-color:#eb9316}.subhead .btn-warning.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-danger{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-danger [class^="icon-"],.subhead .btn-outline-danger [class*=" icon-"],.subhead .btn-outline-danger [class^="fa-"],.subhead .btn-outline-danger [class*=" fa-"]{color:#d9534f}.subhead .btn-danger:not(.dropdown-toggle){color:#fefefe;background-color:#d9534f;border-color:rgba(0,0,0,0.2)}.subhead .btn-danger:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-danger:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-danger:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-danger:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-danger:not(.dropdown-toggle):hover{background-color:#c9302c}.subhead .btn-danger.dropdown-toggle{background:#c12e2a;border-color:#c12e2a}.subhead .btn-danger.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-light{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-light [class^="icon-"],.subhead .btn-outline-light [class*=" icon-"],.subhead .btn-outline-light [class^="fa-"],.subhead .btn-outline-light [class*=" fa-"]{color:#f8f9fa}.subhead .btn-light:not(.dropdown-toggle){color:#fefefe;background-color:#f8f9fa;border-color:rgba(0,0,0,0.2)}.subhead .btn-light:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-light:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-light:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-light:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-light:not(.dropdown-toggle):hover{background-color:#dae0e5}.subhead .btn-light.dropdown-toggle{background:#d4dae1;border-color:#d4dae1}.subhead .btn-light.dropdown-toggle::after{color:#fefefe}.subhead .btn-outline-dark{color:#212529;background-color:#fefefe;border-color:#ccc}.subhead .btn-outline-dark [class^="icon-"],.subhead .btn-outline-dark [class*=" icon-"],.subhead .btn-outline-dark [class^="fa-"],.subhead .btn-outline-dark [class*=" fa-"]{color:#343a40}.subhead .btn-dark:not(.dropdown-toggle){color:#fefefe;background-color:#343a40;border-color:rgba(0,0,0,0.2)}.subhead .btn-dark:not(.dropdown-toggle) [class^="icon-"],.subhead .btn-dark:not(.dropdown-toggle) [class*=" icon-"],.subhead .btn-dark:not(.dropdown-toggle) [class^="fa-"],.subhead .btn-dark:not(.dropdown-toggle) [class*=" fa-"]{width:16px;margin-right:0;margin-left:0;color:#fefefe;background-color:transparent;border-right:0 none;border-left:0 none}.subhead .btn-dark:not(.dropdown-toggle):hover{background-color:#1d2124}.subhead .btn-dark.dropdown-toggle{background:#191b1e;border-color:#191b1e}.subhead .btn-dark.dropdown-toggle::after{color:#fefefe}.subhead.button-new,.subhead.button-apply,.subhead.button-wide{width:140px}.subhead>*:first-child:not(.float-sm-right){margin-left:0}.subhead .float-sm-right{margin-left:.8rem}.subhead.subhead-fixed{position:fixed;top:0;left:250px;z-index:9;padding-top:12px;padding-bottom:12px;border-bottom:1px solid #adb5bd}.closed .subhead-fixed{left:55px}.btn-toolbar{margin-bottom:20px;margin-left:0}.treeselect{display:block;padding-left:0;list-style:none}.treeselect .nav-header{font-weight:700;color:#212529}.treeselect li{position:relative;display:block;line-height:2.2rem;list-style:none}.treeselect li::before{position:absolute;top:14px;left:25px;width:10px;height:1px;margin:auto;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li::after{position:absolute;top:0;bottom:0;left:25px;width:1px;height:100%;content:"";background-color:rgba(0,0,0,0.2)}.treeselect li:last-child::after{height:14px}.treeselect li li{padding-left:40px}.treeselect>li::before,.treeselect>li::after{display:none}.treeselect .icon-{display:none}.treeselect .treeselect-toggle{display:inline-block;padding:0;margin-right:.1rem;text-align:center;cursor:pointer}.treeselect .treeselect-menu{display:inline-block}.treeselect .treeselect-item{display:inline-block}.treeselect .treeselect-item input{position:relative;top:1px;margin-right:.2rem}.treeselect .treeselect-item label{margin-bottom:0}.treeselect .dropdown-toggle{padding:0 .5rem .3rem;margin-left:.5rem}.treeselect .dropdown-toggle::after{margin-left:0;font-size:1rem;color:#495057}.treeselect-sub{padding-left:0}.tree-holder ul ul li::before,.tree-holder ul ul li::after{left:8px;display:block}.tree-holder ul ul li::before{top:12px}.tree-holder ul ul li:last-child::after{height:12px}.tree-holder li{line-height:1.8rem}.tree-holder li li{padding-left:20px}.fg-1{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.fg-2{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2}.fg-3{-webkit-box-flex:3;-ms-flex-positive:3;flex-grow:3}.element-invisible{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.hidden{display:none;visibility:hidden}joomla-alert{display:none}.awesomplete{display:block}.btn.btn-xs,.btn-group-xs>.btn{padding:.09rem .4rem;font-size:.7rem;line-height:1.2;border-radius:.2rem}.btn.btn-xs .caret{font-size:16px;line-height:13px}.btn:focus,.btn.focus,.btn:active:focus,.btn.focus:active,.btn.active:focus,.btn.active.focus{text-decoration:none}.btn.group-move{cursor:move}.btn-secondary{color:#343a40;background-color:#fefefe;border-color:#ced4da}.btn-secondary:hover,.btn-secondary:focus{color:#343a40;background-color:#f8f9fa}.card{background-color:#f8f8f8}.card.card-light{background-color:#f8f8f8}.card.card-dark{background-color:#0d1321}.card.card-dark>*,.card.card-dark a:not(.dropdown-item),.card.card-dark .module-dropdown>a{color:#fefefe}.card.card-dark .list-group-item{background:0}.custom-select.custom-select-color-state.custom-select-success{color:#fefefe;background-color:#438243}.custom-select.custom-select-color-state.custom-select-success option{color:#495057;background-color:#fefefe}.custom-select.custom-select-color-state.custom-select-danger{color:#fefefe;background-color:#d9534f}.custom-select.custom-select-color-state.custom-select-danger option{color:#495057;background-color:#fefefe}.accordion .card-header{display:block;font-size:.9286rem;font-weight:bold;line-height:1.2}.accordion .list-group-item{color:#006898}.dropdown-menu{padding:.2rem 0;margin-top:.5rem;background-color:#fefefe;border-color:#ccc}.dropdown-menu::after{position:absolute;top:-1.5rem;left:.9rem;font-family:FontAwesome;font-size:1.6rem;color:#fefefe;text-shadow:0 -1px 0 rgba(0,0,0,0.2);content:"\f0d8"}.dropdown-item{padding:3px .75rem}.dropdown-menu-right::after{right:.9rem;left:auto}.list-group-item{background-color:#fefefe}.list-unstyled .list-unstyled{padding-left:20px}.jviewport-height10{height:10vh}.jviewport-height20{height:20vh}.jviewport-height30{height:30vh}.jviewport-height40{height:40vh}.jviewport-height50{height:50vh}.jviewport-height60{height:60vh}.jviewport-height70{height:70vh}.jviewport-height80{height:80vh}.jviewport-height90{height:90vh}.jviewport-height100{height:100vh}[class*=jviewport-height] iframe{height:100%}.modal-dialog.jviewport-width10{width:10vw;max-width:none}.modal-dialog.jviewport-width20{width:20vw;max-width:none}.modal-dialog.jviewport-width30{width:30vw;max-width:none}.modal-dialog.jviewport-width40{width:40vw;max-width:none}.modal-dialog.jviewport-width50{width:50vw;max-width:none}.modal-dialog.jviewport-width60{width:60vw;max-width:none}.modal-dialog.jviewport-width70{width:70vw;max-width:none}.modal-dialog.jviewport-width80{width:80vw;max-width:none}.modal-dialog.jviewport-width90{width:90vw;max-width:none}.modal-dialog.jviewport-width100{width:100vw;max-width:none}.nav.nav-tabs{padding:0;margin:0;background-color:#f5f5f5;border:1px solid #ccc;border-bottom:0;border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04);box-shadow:0 1px #fff inset,0 2px 3px -3px rgba(0,0,0,0.15),0 -4px 0 rgba(0,0,0,0.05) inset,0 0 3px rgba(0,0,0,0.04)}.nav.nav-tabs .nav-item{margin-bottom:0;margin-left:0}.nav.nav-tabs .nav-item:first-of-type .nav-link.active{border-radius:.25rem 0 0;-webkit-box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:-1px 0 1px -1px rgba(0,0,0,0.06),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-item:last-of-type .nav-link{-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05),1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-item:last-of-type .nav-link.active{-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link{position:relative;padding:.75em 1em;color:#0d1321;border:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:-1px 0 0 rgba(0,0,0,0.05);box-shadow:-1px 0 0 rgba(0,0,0,0.05)}.nav.nav-tabs .nav-link.active{background-color:rgba(0,0,0,0.03);background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,0.05)));background-image:linear-gradient(to bottom,transparent,rgba(0,0,0,0.05) 100%);border-right:0;border-left:0;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02);box-shadow:inset 2px 0 1px -1px rgba(0,0,0,0.08),inset -2px 0 1px -1px rgba(0,0,0,0.08),inset 0 1px 0 rgba(0,0,0,0.02)}.nav.nav-tabs .nav-link.active::after{position:absolute;right:0;bottom:-1px;left:0;height:5px;content:"";background-color:#006898;opacity:.8}.nav-tabs+.tab-content{padding:15px;background:#fefefe;border:1px solid;border-color:#ccc;border-radius:0 0 .25rem .25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.pagination{margin:1rem}.table thead th{white-space:nowrap;border-bottom-width:1px}.table th,.table td{padding:8px;vertical-align:middle}.table th label,.table td label{margin-bottom:0}.chzn-container.chzn-container-single .chzn-single{display:inline-block;max-width:100%;height:calc(calc(2.25rem + 2px) - 2px);padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem \9;line-height:1.5;color:#495057;vertical-align:middle;background:#fefefe url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-image:none \9;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-box-shadow:none;box-shadow:none;-moz-appearance:none;-webkit-appearance:none}.chzn-container.chzn-container-single .chzn-single abbr{top:10px}.chzn-container.chzn-container-single .chzn-single:focus{border-color:#19b6ff;outline:0}.chzn-container.chzn-container-single .chzn-single:disabled{color:#868e96;cursor:not-allowed;background-color:#e9ecef}.chzn-container.chzn-container-single .chzn-single div b{background:0}.chzn-container.chzn-container-single .chzn-drop{background:#fefefe;border:1px solid #ced4da}.chzn-container.chzn-container-single.chzn-container-active .chzn-single{border-bottom-right-radius:0;border-bottom-left-radius:0}.chzn-container-single{width:auto !important}.card .chzn-container.chzn-container-single{width:100% !important}.card .chzn-container.chzn-container-single .chzn-single{width:100% !important}.gu-mirror{position:fixed !important;z-index:9999 !important;margin:0 !important;cursor:move;background-color:#90ee90;opacity:.8}.gu-mirror.table{display:table}.gu-mirror.table td{display:table-cell}.js-draggable .sortable-handler{cursor:move}.minicolors-theme-bootstrap .minicolors-input{width:120px}.minicolors-theme-bootstrap .rgb{width:175px}.minicolors-theme-bootstrap .rgba{width:220px}.editor .toggle-editor{margin-top:1rem}.editor .mce-tinymce{border:1px solid #ccc;border-radius:.25rem}.editor .mce-btn,.editor .mce-panel{background:#f8f8f8}.com_config .content{background-color:transparent}.com_config [class^='col-']>fieldset{margin-bottom:2rem}.com_cpanel .content{margin-top:0}.com_cpanel .card{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.04);box-shadow:0 0 3px rgba(0,0,0,0.04)}.com_cpanel .card p:first-of-type{margin-top:1rem}.com_cpanel .card p:last-child{margin-bottom:0}.com_cpanel .card .list-group{margin-top:0;margin-right:-1.25rem;margin-bottom:-1.25rem;margin-left:-1.25rem}.com_cpanel .card .list-group>li{padding:.6rem 1.25rem;overflow:hidden}.com_cpanel .card .list-group>.published{padding-left:.9rem;border-left:5px solid #438243}.com_cpanel .card .list-group>.unpublished{padding-left:.9rem;border-left:5px solid #d9534f}.com_cpanel .card .list-group:first-of-type{border-top:0}.com_cpanel .card .list-group-item:first-child{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card .list-group-item:last-child{border-bottom:0;border-top-left-radius:0;border-top-right-radius:0}.com_cpanel .card-title{position:relative;padding:.9em 1.25rem .75rem;margin-top:-1.25rem;margin-right:-1.25rem;margin-bottom:0;margin-left:-1.25rem;font-size:.9286rem;color:#1c3d5c;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,0.125);border-radius:.25rem .25rem 0 0;-webkit-box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15);box-shadow:0 1px #fefefe inset,0 2px 3px -3px rgba(0,0,0,0.15)}.com_cpanel .module-actions{position:absolute;top:0;right:0;z-index:2}.com_cpanel .module-actions>a{display:inline-block;width:2.6em;height:2.6em;line-height:2.6em;color:#495057;text-align:center;background-color:#f5f5f5;border-left:1px solid #ccc;border-top-right-radius:.25rem;-webkit-box-shadow:1px 0 #fefefe inset;box-shadow:1px 0 #fefefe inset}.com_cpanel .module-actions>a:hover,.com_cpanel .module-actions>a:focus{background-color:#f0f0f0;-webkit-box-shadow:none;box-shadow:none}.admin.com_modules .js-stools-container-bar .btn-toolbar{float:left}.menu-assignment{position:relative}.menu-assignment .menu-links{padding-left:0;margin-top:15px;margin-left:0;-webkit-column-count:3;column-count:3;-webkit-column-gap:15px;column-gap:15px}.menu-assignment .menu-links>li{display:inline-block;width:100%;margin-bottom:15px;vertical-align:top;list-style:none;column-break-inside:avoid;-webkit-backface-visibility:hidden;backface-visibility:hidden}.menu-assignment .menu-links-block{padding:15px;background-color:#fafafa;border:1px solid #ddd;border-radius:3px}.menu-assignment label{display:block}.menu-assignment label input{position:relative;top:2px}@media(max-width:767px){.menu-assignment .menu-links{-webkit-column-count:auto;column-count:auto}}.com_users.view-debuggroup thead th,.com_users.view-debuguser thead th{white-space:normal}.com_users.view-debuggroup .legend,.com_users.view-debuguser .legend{margin:1rem 1rem 0}.container-main,.system-debug{padding-bottom:50px}.container-main{position:relative;min-height:calc(100vh - 50px);padding-top:15px;background-color:#f2f2f2}@media(max-width:991.98px){.container-main{padding-left:50px;margin-top:47px}}.list-view-main .container-main{background-color:#f2f2f2}.content{margin-top:45px;border-radius:.25rem}.content>.row{margin-right:0;margin-left:0}.j-main-container{background-color:#fefefe;border:1px solid rgba(0,0,0,0.17);border-radius:.25rem;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.075);box-shadow:0 0 3px rgba(0,0,0,0.075)}.row-selected{background-color:#d9edf7}.chzn-container-single{width:auto !important}.item-associations{padding:0}.item-associations li{display:inline-block;list-style:none} \ No newline at end of file diff --git a/administrator/templates/atum/scss/blocks/_toolbar.scss b/administrator/templates/atum/scss/blocks/_toolbar.scss index 83f8ed0c83372..47f3f3db3e859 100644 --- a/administrator/templates/atum/scss/blocks/_toolbar.scss +++ b/administrator/templates/atum/scss/blocks/_toolbar.scss @@ -33,8 +33,10 @@ } - button:first-of-type { - margin: 0; + a, button, div { + &:first-child { + margin: 0; + } } .btn-group-sm > .btn, @@ -47,9 +49,7 @@ padding: 0 10px; font-size: .875rem; line-height: $atum-toolbar-line-height; - color: $body-color; - background-color: $white-offset; - border-color: $atum-border-color; + box-shadow: 0 1px 2px rgba(0,0,0,.05); [class^="icon-"], @@ -75,99 +75,57 @@ } - .btn-primary, - .btn-outline-primary { - - [class^="icon-"], - [class*=" icon-"], - [class^="#{$fa-css-prefix}-"], - [class*=" #{$fa-css-prefix}-"] { - color: theme-color("primary"); - } - - } - - .btn-success, - .btn-outline-success { - - [class^="icon-"], - [class*=" icon-"], - [class^="#{$fa-css-prefix}-"], - [class*=" #{$fa-css-prefix}-"] { - color: theme-color("success"); - } - - } - - .btn-info, - .btn-outline-info { + @each $color, $value in $theme-colors { + .btn-outline-#{$color} { + color: $body-color; + background-color: $white-offset; + border-color: $atum-border-color; - [class^="icon-"], - [class*=" icon-"], - [class^="#{$fa-css-prefix}-"], - [class*=" #{$fa-css-prefix}-"] { - color: theme-color("info"); + [class^="icon-"], + [class*=" icon-"], + [class^="#{$fa-css-prefix}-"], + [class*=" #{$fa-css-prefix}-"] { + color: theme-color($color); + } } - } - - .btn-danger, - .btn-outline-danger { + .btn-#{$color}:not(.dropdown-toggle) { + color: $white-offset; + background-color: theme-color($color); + border-color: rgba(0,0,0,.2); + + [class^="icon-"], + [class*=" icon-"], + [class^="#{$fa-css-prefix}-"], + [class*=" #{$fa-css-prefix}-"] { + width: 16px; + margin-right: 0; + margin-left: 0; + color: $white-offset; + background-color: transparent; + border-right: 0 none; + border-left: 0 none; + } + + &:hover { + background-color: darken(theme-color($color), 10%); + } - [class^="icon-"], - [class*=" icon-"], - [class^="#{$fa-css-prefix}-"], - [class*=" #{$fa-css-prefix}-"] { - color: theme-color("danger"); } - } + .btn-#{$color}.dropdown-toggle { + background: darken(theme-color($color), 12%); + border-color: darken(theme-color($color), 12%); - .btn-warning, - .btn-outline-warning { + &::after { + color: $white-offset; + } - [class^="icon-"], - [class*=" icon-"], - [class^="#{$fa-css-prefix}-"], - [class*=" #{$fa-css-prefix}-"] { - color: theme-color("warning"); } - } - .btn-success:not(.dropdown-toggle) { + .button-new, .button-apply, .button-wide { width: 140px; - color: $white-offset; - background-color: theme-color("success"); - border-color: rgba(0,0,0,.2); - - [class^="icon-"], - [class*=" icon-"], - [class^="#{$fa-css-prefix}-"], - [class*=" #{$fa-css-prefix}-"] { - width: 16px; - margin-right: 0; - margin-left: 0; - color: $white-offset; - background-color: transparent; - border-right: 0 none; - border-left: 0 none; - } - - &:hover { - background-color: darken(theme-color("success"), 10%); - } - - } - - .btn-success.dropdown-toggle { - background: darken(theme-color("success"), 12%); - border-color: darken(theme-color("success"), 12%); - - &::after { - color: $white-offset; - } - } > *:first-child:not(.float-sm-right) { diff --git a/layouts/joomla/toolbar/link.php b/layouts/joomla/toolbar/link.php index f6e705d3945e6..5cd2cca42479b 100644 --- a/layouts/joomla/toolbar/link.php +++ b/layouts/joomla/toolbar/link.php @@ -25,7 +25,7 @@ ?> > diff --git a/libraries/src/Toolbar/Button/StandardButton.php b/libraries/src/Toolbar/Button/StandardButton.php index ee7550ff27276..20f45c4ebbfab 100644 --- a/libraries/src/Toolbar/Button/StandardButton.php +++ b/libraries/src/Toolbar/Button/StandardButton.php @@ -108,7 +108,7 @@ public function getButtonClass(string $name): string return ' btn btn-sm btn-outline-warning'; case 'cancel': - return ' btn btn-sm btn-danger'; + return ' btn btn-sm btn-outline-danger'; case 'trash': return ' btn btn-sm btn-outline-danger'; diff --git a/libraries/src/Toolbar/CoreButtonsTrait.php b/libraries/src/Toolbar/CoreButtonsTrait.php index 09c365854650f..866e0678e3090 100644 --- a/libraries/src/Toolbar/CoreButtonsTrait.php +++ b/libraries/src/Toolbar/CoreButtonsTrait.php @@ -215,7 +215,7 @@ public function versions($typeAlias, $itemId, $height = 800, $width = 500, strin public function customHtml(string $html, string $name = 'custom'): CustomButton { - $this->customButton($name) + return $this->customButton($name) ->html($html); } } diff --git a/libraries/src/Toolbar/ToolbarButton.php b/libraries/src/Toolbar/ToolbarButton.php index 41feab961ae7c..6b94be13709ce 100644 --- a/libraries/src/Toolbar/ToolbarButton.php +++ b/libraries/src/Toolbar/ToolbarButton.php @@ -207,6 +207,7 @@ protected function renderButton(array &$options): string ); $options['htmlAttributes'] = ArrayHelper::toString($options['attributes']); + $options['btnClass'] = 'button-' . $this->getName() . ' ' . ($options['btnClass'] ?? ''); // Instantiate a new JLayoutFile instance and render the layout $layout = new FileLayout($this->layout); From 3ce77f3aa9e50d8e5c549a2561d7c57a732ffaa6 Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Wed, 14 Feb 2018 01:29:21 +0800 Subject: [PATCH 14/31] group class --- layouts/joomla/toolbar/base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/joomla/toolbar/base.php b/layouts/joomla/toolbar/base.php index 0436fdd64d323..84cb4bda935a7 100644 --- a/layouts/joomla/toolbar/base.php +++ b/layouts/joomla/toolbar/base.php @@ -19,7 +19,7 @@ ?> -
+
diff --git a/layouts/joomla/toolbar/base.php b/layouts/joomla/toolbar/base.php index 84cb4bda935a7..3c2a03fd2bc58 100644 --- a/layouts/joomla/toolbar/base.php +++ b/layouts/joomla/toolbar/base.php @@ -19,7 +19,7 @@ ?> -
+
-
diff --git a/layouts/joomla/toolbar/group/groupmid.php b/layouts/joomla/toolbar/group/groupmid.php deleted file mode 100644 index ce704708147cd..0000000000000 --- a/layouts/joomla/toolbar/group/groupmid.php +++ /dev/null @@ -1,19 +0,0 @@ - - -