Showing preview only (1,300K chars total). Download the full file or copy to clipboard to get everything.
Repository: kevinpapst/AdminLTEBundle
Branch: master
Commit: 8cf62553c390
Files: 160
Total size: 1.2 MB
Directory structure:
gitextract_6dcvqnm8/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ └── linting.yaml
├── .gitignore
├── .php_cs
├── AdminLTEBundle.php
├── CONTRIBUTING.md
├── Controller/
│ ├── BreadcrumbController.php
│ ├── EmitterController.php
│ ├── NavbarController.php
│ └── SidebarController.php
├── DependencyInjection/
│ ├── AdminLTEExtension.php
│ ├── Compiler/
│ │ └── TwigPass.php
│ └── Configuration.php
├── Event/
│ ├── BreadcrumbMenuEvent.php
│ ├── KnpMenuEvent.php
│ ├── MenuEvent.php
│ ├── MessageListEvent.php
│ ├── NavbarUserEvent.php
│ ├── NotificationListEvent.php
│ ├── ShowUserEvent.php
│ ├── SidebarMenuEvent.php
│ ├── SidebarUserEvent.php
│ ├── TaskListEvent.php
│ ├── ThemeEvent.php
│ └── ThemeEvents.php
├── Helper/
│ ├── Constants.php
│ └── ContextHelper.php
├── LICENSE
├── Menu/
│ └── MenuBuilder.php
├── Model/
│ ├── MenuItemInterface.php
│ ├── MenuItemModel.php
│ ├── MessageInterface.php
│ ├── MessageModel.php
│ ├── NavBarUserLink.php
│ ├── NotificationInterface.php
│ ├── NotificationModel.php
│ ├── TaskInterface.php
│ ├── TaskModel.php
│ ├── UserDetailsInterface.php
│ ├── UserInterface.php
│ └── UserModel.php
├── README.md
├── Repository/
│ ├── MessageRepositoryInterface.php
│ ├── NotificationRepositoryInterface.php
│ └── TaskRepositoryInterface.php
├── Resources/
│ ├── assets/
│ │ ├── admin-lte-extensions.scss
│ │ ├── admin-lte.js
│ │ └── admin-lte.scss
│ ├── config/
│ │ ├── container/
│ │ │ └── knp-menu.yml
│ │ └── services.yml
│ ├── docs/
│ │ ├── README.md
│ │ ├── breadcrumbs.md
│ │ ├── bundle_options.md
│ │ ├── component_events.md
│ │ ├── configurations.md
│ │ ├── control_sidebar.md
│ │ ├── extend_webpack_encore.md
│ │ ├── form_theme.md
│ │ ├── fos_userbundle.md
│ │ ├── frontend_assets.md
│ │ ├── knp_menu.md
│ │ ├── layout.md
│ │ ├── migration_guide.md
│ │ ├── navbar_messages.md
│ │ ├── navbar_notifications.md
│ │ ├── navbar_tasks.md
│ │ ├── navbar_user.md
│ │ ├── sidebar_navigation.md
│ │ ├── sidebar_user.md
│ │ └── twig_widgets.md
│ ├── public/
│ │ ├── adminlte.css
│ │ ├── adminlte.js
│ │ ├── adminlte.js.LICENSE.txt
│ │ ├── entrypoints.json
│ │ └── manifest.json
│ ├── translations/
│ │ ├── AdminLTEBundle.ar.xliff
│ │ ├── AdminLTEBundle.cs.xliff
│ │ ├── AdminLTEBundle.da.xliff
│ │ ├── AdminLTEBundle.de.xliff
│ │ ├── AdminLTEBundle.el.xliff
│ │ ├── AdminLTEBundle.en.xliff
│ │ ├── AdminLTEBundle.eo.xliff
│ │ ├── AdminLTEBundle.es.xliff
│ │ ├── AdminLTEBundle.eu.xliff
│ │ ├── AdminLTEBundle.fi.xliff
│ │ ├── AdminLTEBundle.fr.xliff
│ │ ├── AdminLTEBundle.he.xliff
│ │ ├── AdminLTEBundle.hr.xliff
│ │ ├── AdminLTEBundle.it.xliff
│ │ ├── AdminLTEBundle.ja.xliff
│ │ ├── AdminLTEBundle.nl.xliff
│ │ ├── AdminLTEBundle.pl.xliff
│ │ ├── AdminLTEBundle.pt_BR.xliff
│ │ ├── AdminLTEBundle.ro.xliff
│ │ ├── AdminLTEBundle.ru.xliff
│ │ ├── AdminLTEBundle.sk.xliff
│ │ ├── AdminLTEBundle.sv.xliff
│ │ ├── AdminLTEBundle.tr.xliff
│ │ └── AdminLTEBundle.zh_CN.xliff
│ └── views/
│ ├── Breadcrumb/
│ │ ├── breadcrumb.html.twig
│ │ └── knp-breadcrumb.html.twig
│ ├── Exception/
│ │ └── exception_full.html.twig
│ ├── FOSUserBundle/
│ │ ├── Registration/
│ │ │ ├── confirmed.html.twig
│ │ │ └── register.html.twig
│ │ ├── Resetting/
│ │ │ └── request.html.twig
│ │ ├── Security/
│ │ │ └── login.html.twig
│ │ └── layout.html.twig
│ ├── Macros/
│ │ ├── buttons.html.twig
│ │ ├── default.html.twig
│ │ └── menu.html.twig
│ ├── Navbar/
│ │ ├── messages.html.twig
│ │ ├── notifications.html.twig
│ │ ├── tasks.html.twig
│ │ └── user.html.twig
│ ├── Partials/
│ │ ├── _control-sidebar.html.twig
│ │ ├── _flash_messages.html.twig
│ │ ├── _footer.html.twig
│ │ └── _menu.html.twig
│ ├── Sidebar/
│ │ ├── knp-menu.html.twig
│ │ ├── menu.html.twig
│ │ ├── search-form.html.twig
│ │ └── user-panel.html.twig
│ ├── Widgets/
│ │ ├── box-widget.html.twig
│ │ └── infobox-widget.html.twig
│ └── layout/
│ ├── default-layout-avanzu.html.twig
│ ├── default-layout.html.twig
│ ├── form-theme-base.html.twig
│ ├── form-theme-horizontal.html.twig
│ ├── form-theme-security.html.twig
│ ├── form-theme.html.twig
│ ├── login-layout-avanzu.html.twig
│ └── security-layout.html.twig
├── Tests/
│ ├── Controller/
│ │ └── NavbarControllerTest.php
│ ├── DependencyInjection/
│ │ └── ConfigurationTest.php
│ ├── Event/
│ │ ├── MessageListEventTest.php
│ │ ├── NotificationListEventTest.php
│ │ └── TaskListEventTest.php
│ ├── Helper/
│ │ └── ContextHelperTest.php
│ ├── Model/
│ │ ├── MessageModelTest.php
│ │ ├── NotificationModelTest.php
│ │ ├── TaskModelTest.php
│ │ └── UserModelTest.php
│ ├── Twig/
│ │ ├── AdminExtensionTest.php
│ │ └── RuntimeExtensionTest.php
│ └── phpstan.neon
├── Twig/
│ ├── AdminExtension.php
│ ├── EventsExtension.php
│ └── RuntimeExtension.php
├── UPGRADING.md
├── composer.json
├── config/
│ └── packages/
│ └── admin_lte.yaml
├── package.json
├── phpstan.neon
├── phpunit.xml.dist
└── webpack.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
[*.php]
insert_final_newline = true
trim_trailing_whitespace = true
================================================
FILE: .gitattributes
================================================
.github export-ignore
Tests export-ignore
.gitattributes export-ignore
.gitignore export-ignore
.php_cs export-ignore
.travis.yml export-ignore
phpstan.neon export-ignore
phpunit.xml.dist export-ignore
yarn.lock export-ignore
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contribution Guidelines
Thank you for considering contributing to this bundle. We welcome any kind of
contribution, no matter if its huge or small, about documentation or code. We
also welcome any kind of developers, from experts to people who just started
working on Open-Source projects.
## Requirements
Before your first contribution, make sure you'll meet these requirements:
* You have a user account on [GitHub](https://github.com/).
* You have installed in your computer a working environment to develop PHP
applications.
* You have a basic level of English (code, docs and discussions are in English).
All submitted contributions (both code and documentation) adhere implicitly to
the [Open-Source MIT License][mit-license].
## Proposing New Features
We are determined to maintain the original simple and pragmatic philosophy of
the bundle. This means that we routinely reject any feature that complicates the
code too much or which doesn't fit in the bundle's philosophy.
That's why **we strongly recommend you** to propose new features by
[opening a new issue][create-issue] in the repository to discuss about them
instead of submitting a pull request with the code of the proposed feature.
## Reporting Bugs
1. Go to [the list of issues][adminthemebundle-issues] and look for any
existing bug similar to yours.
2. If the bug hasn't been reported yet, [create a new issue][create-issue] and
fill in the given issue template.
## Sending Pull Requests
This project follows the same contribution workflow used by the Symfony project.
First you must clone the repository, then create a feature branch and finally,
submit a pull request via GitHub.
Read the [Symfony contribution guide][sf-contribution] for more details and replace
`symfony/symfony-docs` by `kevinpapst/adminlte-bundle` in every example.
## Code styles
Run `/vendor/bin/php-cs-fixer fix` before submitting any code.
## Further information
* [General GitHub documentation][gh-help]
* [GitHub pull request documentation][gh-pr]
[mit-license]: https://opensource.org/licenses/MIT
[gh-help]: https://help.github.com
[gh-pr]: https://help.github.com/send-pull-requests
[adminthemebundle-issues]: https://github.com/kevinpapst/AdminLTEBundle/issues?utf8=%E2%9C%93&q=is%3Aissue
[create-issue]: https://github.com/kevinpapst/AdminLTEBundle/issues/new
[symfony-standard]: https://github.com/symfony/symfony-standard
[sf-contribution]: http://symfony.com/doc/current/contributing/documentation/overview.html#your-first-documentation-contribution
================================================
FILE: .github/FUNDING.yml
================================================
github: [kevinpapst]
custom: https://paypal.me/kevinpapst
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
Please write here a description of your problem. Don't hesitate and add enough
information to fix your problem properly - you can even use images!
If this is a BUG REPORT:
* Describe what you wanted to do and the wrong result you got.
* Fill the Debug info table below
* (Optional) If they are useful, include logs, code samples, screenshots, etc.
If this is a FEATURE REQUEST:
* Describe the new feature briefly.
* If you consider or have knowledge submit a Pull Request.
### Debug info
| Component | Version |
| ------------- | ------------- |
| Symfony version | Your current symfony version |
| AdminLTEBundle | 0.9/dev-master/commit/tag |
| Operating System | Windows or GNU/Linux or other |
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Description
A clear and concise description of what this pull request adds or changes.
## Types of changes
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
## Checklist
- [ ] I updated the documentation (see [here](https://github.com/kevinpapst/AdminLTEBundle/tree/master/Resources/docs))
- [ ] I agree that this code is used in AdminLTEBundle and will be published under the [MIT license](https://github.com/kevinpapst/AdminLTEBundle/blob/master/LICENSE)
================================================
FILE: .github/workflows/linting.yaml
================================================
name: CI
on:
pull_request: null
push:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
strategy:
matrix:
php: ['7.2', '7.3', '7.4']
name: Linting - PHP ${{ matrix.php }}
steps:
- uses: actions/checkout@v2
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: intl
- run: composer install --no-progress
- run: composer codestyle
- run: composer phpstan
- run: composer tests
================================================
FILE: .gitignore
================================================
nbproject/*
.idea
vendor
composer.lock
package-lock.json
# Ignore Eclipse IDE config files
.buildpath
.project
.settings
# Ignore cache files from php cs fixer
.php_cs.cache
node_modules
================================================
FILE: .php_cs
================================================
<?php
$fileHeaderComment = <<<COMMENT
This file is part of the AdminLTE bundle.
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
COMMENT;
return PhpCsFixer\Config::create()
->setRiskyAllowed(true)
->setRules([
'encoding' => true,
'full_opening_tag' => true,
'blank_line_after_namespace' => true,
'braces' => true,
'class_definition' => true,
'elseif' => true,
'function_declaration' => true,
'indentation_type' => true,
'line_ending' => true,
'lowercase_constants' => true,
'lowercase_keywords' => true,
'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'],
'header_comment' => ['header' => $fileHeaderComment, 'separate' => 'both'],
'no_php4_constructor' => true,
'ordered_imports' => true,
'no_break_comment' => true,
'no_closing_tag' => true,
'no_spaces_after_function_name' => true,
'no_spaces_inside_parenthesis' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'single_blank_line_at_eof' => true,
'single_class_element_per_statement' => ['elements' => ['property']],
'single_import_per_statement' => true,
'single_line_after_imports' => true,
'switch_case_semicolon_to_colon' => true,
'switch_case_space' => true,
'array_syntax' => [
'syntax' => 'short'
],
'binary_operator_spaces' => true,
'blank_line_after_opening_tag' => true,
'blank_line_before_statement' => [
'statements' => ['return'],
],
'cast_spaces' => true,
'class_attributes_separation' => ['elements' => ['method']],
'concat_space' => ['spacing' => 'one'],
'declare_equal_normalize' => true,
'function_typehint_space' => true,
'include' => true,
'lowercase_cast' => true,
'lowercase_static_reference' => true,
'magic_constant_casing' => true,
'native_function_casing' => true,
'new_with_braces' => true,
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => ['tokens' => [
'curly_brace_block',
'extra',
'parenthesis_brace_block',
'square_brace_block',
'throw',
'use',
]],
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => ['use' => 'echo'],
'no_multiline_whitespace_around_double_arrow' => true,
'no_short_bool_cast' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_spaces_around_offset' => true,
'no_trailing_comma_in_list_call' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_unneeded_curly_braces' => true,
'no_unneeded_final_method' => true,
'no_unused_imports' => true,
'no_whitespace_before_comma_in_array' => true,
'no_whitespace_in_blank_line' => true,
'normalize_index_brace' => true,
'object_operator_without_whitespace' => true,
'php_unit_fqcn_annotation' => true,
'phpdoc_align' => [
'align' => 'left',
'tags' => [
'method',
'param',
'property',
'return',
'throws',
'type',
'var',
],
],
'phpdoc_annotation_without_dot' => true,
'phpdoc_indent' => true,
'phpdoc_inline_tag' => true,
'phpdoc_no_access' => true,
'phpdoc_no_alias_tag' => true,
'phpdoc_no_empty_return' => true,
'phpdoc_no_package' => true,
'phpdoc_no_useless_inheritdoc' => true,
'phpdoc_return_self_reference' => true,
'phpdoc_scalar' => true,
'phpdoc_separation' => false,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_summary' => false,
'phpdoc_to_comment' => true,
'phpdoc_trim' => true,
'phpdoc_types' => true,
'phpdoc_var_without_name' => true,
'protected_to_private' => true,
'return_type_declaration' => true,
'semicolon_after_instruction' => true,
'short_scalar_cast' => true,
'single_blank_line_before_namespace' => true,
'single_line_comment_style' => [
'comment_types' => ['hash'],
],
'single_quote' => true,
'space_after_semicolon' => [
'remove_in_empty_for_expressions' => true,
],
'standardize_increment' => true,
'standardize_not_equals' => true,
'ternary_operator_spaces' => true,
'trailing_comma_in_multiline_array' => false,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
'whitespace_after_comma_in_array' => true,
'yoda_style' => false,
'ternary_to_null_coalescing' => true,
'visibility_required' => ['elements' => [
'const',
'method',
'property',
]],
])
->setFinder(
PhpCsFixer\Finder::create()
->in([
__DIR__
])
->name('*.php')
->exclude([
'.github/',
'node_modules/',
'Resources/',
'vendor/',
])
)
->setFormat('checkstyle')
;
================================================
FILE: AdminLTEBundle.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle;
use KevinPapst\AdminLTEBundle\DependencyInjection\Compiler\TwigPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AdminLTEBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new TwigPass());
}
}
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
The AdminLTEBundle is an open source project and contributions made by the community are welcome.
Send your ideas, code reviews, pull requests and feature requests to help me improve this project.
To make my and your live easier, here are the simple rules for PRs.
## Pull request rules
- Fix your codestyles before pushing with `composer codestyle-fix`
- Fix static code analysis errors, use `composer phpstan`
- Add PHPUnit tests for your changes and execute all tests with `composer tests`
- Travis fails if you do not verify the above points: fix the errors :-)
- Verify everything still works, e.g. using a branch inside the [demo apps](https://github.com/kevinpapst/AdminLTEBundle-Demo) with composer.json pointing to your AdminLTEBundle branch
- the app is not well tested (old codebase) so you have to do this manually
- With sending in a PR, you accept that your contributions/code will be published under MIT license (see [LICENSE](LICENSE))
## Code styles
As this project is a fork, the code is written in different flavours and the code base
is not yet upgraded to be fully consistent. But for all new changes I'd like to stick to the following rules:
- use strict typing wherever possible (function params, returns types ...)
- camelCase variables and function names
================================================
FILE: Controller/BreadcrumbController.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Controller;
use KevinPapst\AdminLTEBundle\Event\BreadcrumbMenuEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use KevinPapst\AdminLTEBundle\Model\MenuItemInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Controller to handle breadcrumb display inside the layout
*/
class BreadcrumbController extends EmitterController
{
/**
* Controller Reference action to be called inside the layout.
*
* Triggers the {@link BreadcrumbMenuEvent} to receive the currently active menu chain.
*
* If there are no listeners attached for this event, the return value is an empty response.
*
* @param Request $request
* @return Response
*/
public function breadcrumbAction(Request $request): Response
{
@trigger_error('BreadcrumbController::breadcrumbAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(BreadcrumbMenuEvent::class)) {
return new Response();
}
/** @var SidebarMenuEvent $event */
$event = $this->dispatch(new BreadcrumbMenuEvent($request));
/** @var MenuItemInterface $active */
$active = $event->getActive();
$list = [];
if (null !== $active) {
$list[] = $active;
while (null !== ($item = $active->getActiveChild())) {
$list[] = $item;
$active = $item;
}
}
return $this->render('@AdminLTE/Breadcrumb/breadcrumb.html.twig', [
'active' => $list,
]);
}
}
================================================
FILE: Controller/EmitterController.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\EventDispatcher\Event;
class EmitterController extends AbstractController
{
/**
* @var EventDispatcherInterface
*/
protected $eventDispatcher;
public function __construct(EventDispatcherInterface $dispatcher)
{
$this->eventDispatcher = $dispatcher;
}
protected function dispatch(Event $event): Event
{
/** @var Event $event */
$event = $this->eventDispatcher->dispatch($event);
return $event;
}
protected function hasListener(string $eventName): bool
{
return $this->eventDispatcher->hasListeners($eventName);
}
}
================================================
FILE: Controller/NavbarController.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Controller;
use KevinPapst\AdminLTEBundle\Event\MessageListEvent;
use KevinPapst\AdminLTEBundle\Event\NavbarUserEvent;
use KevinPapst\AdminLTEBundle\Event\NotificationListEvent;
use KevinPapst\AdminLTEBundle\Event\ShowUserEvent;
use KevinPapst\AdminLTEBundle\Event\TaskListEvent;
use KevinPapst\AdminLTEBundle\Helper\ContextHelper;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Response;
class NavbarController extends EmitterController
{
/**
* @var ContextHelper
*/
private $helper;
public function __construct(EventDispatcherInterface $dispatcher, ContextHelper $helper)
{
parent::__construct($dispatcher);
$this->helper = $helper;
}
/**
* @param int|null $max
* @return Response
*/
public function notificationsAction($max = null): Response
{
@trigger_error('NavbarController::notificationsAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(NotificationListEvent::class)) {
return new Response();
}
if (null === $max) {
$max = (int) $this->helper->getOption('max_navbar_notifications');
}
/** @var NotificationListEvent $listEvent */
$listEvent = $this->dispatch(new NotificationListEvent($max));
return $this->render(
'@AdminLTE/Navbar/notifications.html.twig',
[
'notifications' => $listEvent->getNotifications(),
'total' => $listEvent->getTotal(),
]
);
}
/**
* @param int|null $max
* @return Response
*/
public function messagesAction($max = null): Response
{
@trigger_error('NavbarController::messagesAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(MessageListEvent::class)) {
return new Response();
}
if (null === $max) {
$max = (int) $this->helper->getOption('max_navbar_messages');
}
/** @var MessageListEvent $listEvent */
$listEvent = $this->dispatch(new MessageListEvent($max));
return $this->render(
'@AdminLTE/Navbar/messages.html.twig',
[
'messages' => $listEvent->getMessages(),
'total' => $listEvent->getTotal(),
]
);
}
/**
* @param int|null $max
* @return Response
*/
public function tasksAction($max = null): Response
{
@trigger_error('NavbarController::tasksAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(TaskListEvent::class)) {
return new Response();
}
if (null === $max) {
$max = (int) $this->helper->getOption('max_navbar_tasks');
}
/** @var TaskListEvent $listEvent */
$listEvent = $this->dispatch(new TaskListEvent($max));
return $this->render(
'@AdminLTE/Navbar/tasks.html.twig',
[
'tasks' => $listEvent->getTasks(),
'total' => $listEvent->getTotal(),
]
);
}
/**
* @return Response
*/
public function userAction(): Response
{
@trigger_error('NavbarController::userAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(NavbarUserEvent::class)) {
return new Response();
}
/** @var ShowUserEvent $userEvent */
$userEvent = $this->dispatch(new NavbarUserEvent());
if ($userEvent instanceof ShowUserEvent && null !== $userEvent->getUser()) {
return $this->render(
'@AdminLTE/Navbar/user.html.twig',
[
'user' => $userEvent->getUser(),
'links' => $userEvent->getLinks(),
'showProfileLink' => $userEvent->isShowProfileLink(),
'showLogoutLink' => $userEvent->isShowLogoutLink(),
]
);
}
return new Response();
}
}
================================================
FILE: Controller/SidebarController.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Controller;
use KevinPapst\AdminLTEBundle\Event\ShowUserEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarUserEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
final class SidebarController extends EmitterController
{
public function userPanelAction(): Response
{
@trigger_error('SidebarController::userPanelAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(SidebarUserEvent::class)) {
return new Response();
}
/** @var ShowUserEvent $userEvent */
$userEvent = $this->dispatch(new SidebarUserEvent());
return $this->render(
'@AdminLTE/Sidebar/user-panel.html.twig',
[
'user' => $userEvent->getUser(),
]
);
}
public function searchFormAction(): Response
{
@trigger_error('SidebarController::searchFormAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
return $this->render('@AdminLTE/Sidebar/search-form.html.twig', []);
}
public function menuAction(Request $request): Response
{
@trigger_error('SidebarController::menuAction() is deprecated and will be removed with 4.0', E_USER_DEPRECATED);
if (!$this->hasListener(SidebarMenuEvent::class)) {
return new Response();
}
/** @var SidebarMenuEvent $event */
$event = $this->dispatch(new SidebarMenuEvent($request));
return $this->render(
'@AdminLTE/Sidebar/menu.html.twig',
[
'menu' => $event->getItems(),
]
);
}
}
================================================
FILE: DependencyInjection/AdminLTEExtension.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
/**
* Loads AdminLTEBundle configuration
*
* @see http://symfony.com/doc/current/cookbook/bundles/extension.html
*/
class AdminLTEExtension extends Extension implements PrependExtensionInterface
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$options = $this->getContextOptions($config);
if (!empty($config)) {
$container->setParameter('admin_lte_theme.options', $options);
}
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.yml');
if ($options['knp_menu']['enable'] === true) {
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config/container'));
$loader->load('knp-menu.yml');
}
}
/**
* Merge available configuration options, so they are all available for the ContextHelper.
*
* @param array $config
* @return array
*/
protected function getContextOptions(array $config = [])
{
$sidebar = [];
if (isset($config['control_sidebar']) && !empty($config['control_sidebar'])) {
$sidebar = $config['control_sidebar'];
}
$contextOptions = (array) ($config['options'] ?? []);
$contextOptions['control_sidebar'] = $sidebar;
$contextOptions['knp_menu'] = (array) $config['knp_menu'];
$contextOptions = array_merge($contextOptions, $config['theme']);
return $contextOptions;
}
/**
* @see https://symfony.com/doc/current/bundles/prepend_extension.html
*
* @param ContainerBuilder $container
*/
public function prepend(ContainerBuilder $container)
{
$configuration = new Configuration();
$configs = $container->getExtensionConfig($this->getAlias());
$config = $this->processConfiguration($configuration, $configs);
$options = (array) ($config['options'] ?? []);
$routes = (array) ($config['routes'] ?? []);
$container->setParameter('admin_lte_theme.options', $options);
$container->setParameter('admin_lte_theme.routes', $routes);
if (!array_key_exists('form_theme', $options) || null === ($theme = $options['form_theme'])) {
return;
}
$themes = [
'default' => '@AdminLTE/layout/form-theme.html.twig',
'horizontal' => '@AdminLTE/layout/form-theme-horizontal.html.twig',
];
if (!array_key_exists($theme, $themes)) {
return;
}
$bundles = $container->getParameter('kernel.bundles');
// register the form theme
if (isset($bundles['TwigBundle'])) {
$container->prependExtensionConfig('twig', ['form_theme' => [$themes[$theme]]]);
}
}
}
================================================
FILE: DependencyInjection/Compiler/TwigPass.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
/**
* Class TwigPass
*/
class TwigPass implements CompilerPassInterface
{
/**
* You can modify the container here before it is dumped to PHP code.
*
* @param ContainerBuilder $container
*/
public function process(ContainerBuilder $container)
{
$bundles = $container->getParameter('kernel.bundles');
if (!isset($bundles['TwigBundle'])) {
return;
}
$param = $container->getParameter('twig.form.resources');
if (!is_array($param)) {
$param = [];
}
$container->setParameter('twig.form.resources', $param);
$twigDefinition = $container->getDefinition('twig');
$twigDefinition->addMethodCall(
'addGlobal',
[
'admin_lte_context',
new Reference('admin_lte_theme.context_helper'),
]
);
}
}
================================================
FILE: DependencyInjection/Configuration.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/**
* This is the class that validates and merges the AdminLTEBundle configuration
*
* @see http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class
*/
class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder('admin_lte');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->children()
->append($this->getOptionsConfig())
->append($this->getControlSidebarConfig())
->append($this->getThemeConfig())
->append($this->getKnpMenuConfig())
->append($this->getRouteAliasesConfig())
->end()
->end();
return $treeBuilder;
}
private function getRouteAliasesConfig()
{
$treeBuilder = new TreeBuilder('routes');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->scalarNode('adminlte_welcome')
->defaultValue('home')
->info('name of the homepage route')
->end()
->scalarNode('adminlte_login')
->defaultValue('login')
->info('name of the form login route')
->end()
->scalarNode('adminlte_login_check')
->defaultValue('login_check')
->info('name of the form login_check route')
->end()
->scalarNode('adminlte_registration')
->defaultNull()
->info('name of the user registration form route')
->end()
->scalarNode('adminlte_password_reset')
->defaultNull()
->info('name of the forgot-password form route')
->end()
->scalarNode('adminlte_message')
->defaultValue('message')
->info('name of the route to one message')
->end()
->scalarNode('adminlte_messages')
->defaultValue('messages')
->info('name of the route to all messages')
->end()
->scalarNode('adminlte_notification')
->defaultValue('notification')
->info('name of the route to one notification')
->end()
->scalarNode('adminlte_notifications')
->defaultValue('notifications')
->info('name of the route to all notification')
->end()
->scalarNode('adminlte_task')
->defaultValue('task')
->info('name of the route to one task')
->end()
->scalarNode('adminlte_tasks')
->defaultValue('tasks')
->info('name of the route to all tasks')
->end()
->scalarNode('adminlte_profile')
->defaultValue('profile')
->info('name of the route to the users profile')
->end()
->end()
->end();
return $rootNode;
}
private function getKnpMenuConfig()
{
$treeBuilder = new TreeBuilder('knp_menu');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->booleanNode('enable')
->defaultFalse()
->info('')
->end()
->scalarNode('main_menu')
->defaultValue('adminlte_main')
->info('your builder alias')
->end()
->scalarNode('breadcrumb_menu')
->defaultFalse()
->info('Your builder alias or false to disable breadcrumbs')
->end()
->end()
->end();
return $rootNode;
}
private function getWidgetConfig()
{
$treeBuilder = new TreeBuilder('widget');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->scalarNode('collapsible_title')
->defaultValue('Collapse')
->info('')
->end()
->scalarNode('removable_title')
->defaultValue('Remove')
->info('')
->end()
->scalarNode('type')
->defaultValue('primary')
->info('')
->end()
->booleanNode('bordered')
->defaultTrue()
->info('')
->end()
->booleanNode('collapsible')
->defaultFalse()
->info('')
->end()
->booleanNode('removable')
->defaultFalse()
->info('')
->end()
->booleanNode('solid')
->defaultFalse()
->info('')
->end()
->booleanNode('use_footer')
->defaultTrue()
->info('')
->end()
->end()
->end();
return $rootNode;
}
private function getButtonConfig()
{
$treeBuilder = new TreeBuilder('button');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->scalarNode('type')
->defaultValue('primary')
->info('default button type')
->end()
->scalarNode('size')
->defaultFalse()
->info('default button size')
->end()
->end()
->end();
return $rootNode;
}
private function getThemeConfig()
{
$treeBuilder = new TreeBuilder('theme');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->append($this->getWidgetConfig())
->append($this->getButtonConfig())
->end()
->end();
return $rootNode;
}
private function getOptionsConfig()
{
$treeBuilder = new TreeBuilder('options');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->scalarNode('default_avatar')
->defaultValue('bundles/adminlte/images/default_avatar.png')
->end()
->scalarNode('skin')
->defaultValue('skin-blue')
->info('see skin listing for viable options')
->end()
->scalarNode('form_theme')
->defaultValue('default')
->info('the form theme, must be one of: default, horizontal or null')
->validate()
->ifTrue(function ($value) {
if (null === $value) {
return false;
}
return !in_array($value, ['default', 'horizontal']);
})
->thenInvalid('Invalid form_theme. Expected one of: "default", "horizontal" or null')
->end()
->end()
->booleanNode('fixed_layout')
->defaultFalse()
->end()
->booleanNode('boxed_layout')
->defaultFalse()
->info('these settings relate directly to the "Layout Options"')
->end()
->booleanNode('collapsed_sidebar')
->defaultFalse()
->info('described in the documentation')
->end()
->booleanNode('mini_sidebar')
->defaultFalse()
->info('')
->end()
->integerNode('max_navbar_notifications')
->defaultValue(10)
->info('Max number of notifications displayed in the notification bar')
->end()
->integerNode('max_navbar_tasks')
->defaultValue(10)
->info('Max number of tasks displayed in the notification bar')
->end()
->integerNode('max_navbar_messages')
->defaultValue(10)
->info('Max number of messages displayed in the notification bar')
->end()
->end()
->end();
return $rootNode;
}
private function getControlSidebarConfig()
{
$treeBuilder = new TreeBuilder('control_sidebar');
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();
$rootNode
->arrayPrototype()
->children()
->scalarNode('icon')->end()
->scalarNode('controller')->end()
->scalarNode('template')->end()
->end()
->end()
->info('controls all panels in the right control_sidebar')
->end();
return $rootNode;
}
}
================================================
FILE: Event/BreadcrumbMenuEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
/**
* This class SHOULD extend the MenuEvent, but for BC reasons we extend SidebarMenuEvent.
* This can be changed for 4.0.
*/
class BreadcrumbMenuEvent extends SidebarMenuEvent
{
}
================================================
FILE: Event/KnpMenuEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use Knp\Menu\FactoryInterface;
use Knp\Menu\ItemInterface;
/**
* Collect all MenuItemInterface objects that should be rendered in the menu/navigation section.
*/
class KnpMenuEvent extends ThemeEvent
{
/**
* @var ItemInterface
*/
protected $menu;
/**
* @var FactoryInterface
*/
protected $factory;
/**
* @var array
*/
private $options;
/**
* @var array
*/
private $childOptions;
/**
* @param ItemInterface $menu
* @param FactoryInterface $factory
* @param array $options
* @param array $childOptions
*/
public function __construct($menu, $factory, $options = [], $childOptions = [])
{
$this->menu = $menu;
$this->factory = $factory;
$this->options = $options;
$this->childOptions = $childOptions;
}
/**
* @return ItemInterface
*/
public function getMenu()
{
return $this->menu;
}
/**
* @return FactoryInterface
*/
public function getFactory()
{
return $this->factory;
}
/**
* @return array
*/
public function getOptions()
{
return $this->options;
}
/**
* @return array
*/
public function getChildOptions()
{
return $this->childOptions;
}
}
================================================
FILE: Event/MenuEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use KevinPapst\AdminLTEBundle\Model\MenuItemInterface;
use Knp\Menu\MenuItem;
use Symfony\Component\HttpFoundation\Request;
/**
* Collect all MenuItemInterface objects that should be rendered in the menu section.
*/
abstract class MenuEvent extends ThemeEvent
{
/**
* @var array
*/
private $menuRootItems = [];
/**
* @var Request
*/
private $request;
/**
* @param Request $request
*/
public function __construct(Request $request = null)
{
$this->request = $request;
}
/**
* @return Request
*/
public function getRequest(): ?Request
{
return $this->request;
}
/**
* @return MenuItemInterface[]
*/
public function getItems(): array
{
return $this->menuRootItems;
}
/**
* @param MenuItemInterface $item
* @return MenuEvent
*/
public function addItem($item)
{
$this->menuRootItems[$item->getIdentifier()] = $item;
return $this;
}
/**
* @param MenuItemInterface|string $item
* @return MenuEvent
*/
public function removeItem($item): MenuEvent
{
if ($item instanceof MenuItemInterface && isset($this->menuRootItems[$item->getIdentifier()])) {
unset($this->menuRootItems[$item->getIdentifier()]);
} elseif (is_string($item) && isset($this->menuRootItems[$item])) {
unset($this->menuRootItems[$item]);
}
return $this;
}
/**
* @param string $id
* @return MenuItemInterface|MenuItem|null
*/
public function getRootItem($id)
{
return $this->menuRootItems[$id] ?? null;
}
/**
* @return MenuItemInterface|MenuItem|null
*/
public function getActive()
{
foreach ($this->getItems() as $item) {
if ($item->isActive()) {
return $item;
}
}
return null;
}
}
================================================
FILE: Event/MessageListEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use KevinPapst\AdminLTEBundle\Model\MessageInterface;
use KevinPapst\AdminLTEBundle\Repository\MessageRepositoryInterface;
/**
* The MessageListEvent collects all MessageInterface objects that should be rendered in the messages section.
*/
class MessageListEvent extends ThemeEvent implements MessageRepositoryInterface
{
/**
* Stores the list of messages
*
* @var array
*/
protected $messages = [];
/**
* Stores the total amount
*
* @var int
*/
protected $totalMessages = 0;
/**
* @var int
*/
protected $max = null;
/**
* @param int $max Maximun number of messages displayed in panel
*/
public function __construct($max = null)
{
$this->max = $max;
}
/**
* Get the maximun number of notifications displayed in panel
*
* @return int
*/
public function getMax()
{
return $this->max;
}
/**
* Returns the message list
*
* @return array
*/
public function getMessages()
{
if (null !== $this->max) {
return array_slice($this->messages, 0, $this->max);
}
return $this->messages;
}
/**
* Pushes the given message to the list of messages.
*
* @param MessageInterface $messageInterface
*
* @return $this
*/
public function addMessage(MessageInterface $messageInterface)
{
$this->messages[] = $messageInterface;
return $this;
}
/**
* Returns the message count
*
* @return int
*/
public function getTotal()
{
return $this->totalMessages === 0 ? count($this->messages) : $this->totalMessages;
}
/**
* @param int $totalMessages
*/
public function setTotal($totalMessages)
{
$this->totalMessages = $totalMessages;
}
}
================================================
FILE: Event/NavbarUserEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
class NavbarUserEvent extends ShowUserEvent
{
}
================================================
FILE: Event/NotificationListEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use KevinPapst\AdminLTEBundle\Model\NotificationInterface;
use KevinPapst\AdminLTEBundle\Repository\NotificationRepositoryInterface;
/**
* The NotificationListEvent collects all NotificationInterface objects that should be rendered in the notification section.
*/
class NotificationListEvent extends ThemeEvent implements NotificationRepositoryInterface
{
/**
* @var array
*/
protected $notifications = [];
/**
* @var int
*/
protected $total = 0;
/**
* @var int
*/
protected $max = null;
/**
* @param int $max Maximun number of notifications displayed in panel
*/
public function __construct($max = null)
{
$this->max = $max;
}
/**
* Get the maximun number of notifications displayed in panel
*
* @return int
*/
public function getMax()
{
return $this->max;
}
/**
* @return array
*/
public function getNotifications()
{
if (null !== $this->max) {
return array_slice($this->notifications, 0, $this->max);
}
return $this->notifications;
}
/**
* @param NotificationInterface $notificationInterface
*
* @return $this
*/
public function addNotification(NotificationInterface $notificationInterface)
{
$this->notifications[] = $notificationInterface;
return $this;
}
/**
* @param int $total
*/
public function setTotal($total)
{
$this->total = $total;
}
/**
* @return int
*/
public function getTotal()
{
return $this->total === 0 ? count($this->notifications) : $this->total;
}
}
================================================
FILE: Event/ShowUserEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use KevinPapst\AdminLTEBundle\Model\NavBarUserLink;
use KevinPapst\AdminLTEBundle\Model\UserDetailsInterface;
use KevinPapst\AdminLTEBundle\Model\UserInterface;
/**
* Collect the UserInterface object that should be rendered in the user section.
*/
abstract class ShowUserEvent extends ThemeEvent implements UserDetailsInterface
{
/**
* @var UserInterface
*/
private $user;
/**
* @var bool
*/
private $showProfileLink = true;
/**
* @var bool
*/
private $showLogoutLink = true;
/**
* @var NavBarUserLink[]
*/
private $links = [];
/**
* @param UserInterface $user
* @return ShowUserEvent
*/
public function setUser($user)
{
$this->user = $user;
return $this;
}
/**
* @return UserInterface|null
*/
public function getUser(): ?UserInterface
{
return $this->user;
}
/**
* @return NavBarUserLink[]
*/
public function getLinks(): array
{
return $this->links;
}
/**
* @param NavBarUserLink $link
* @return ShowUserEvent
*/
public function addLink(NavBarUserLink $link)
{
$this->links[] = $link;
return $this;
}
/**
* @return bool
*/
public function isShowProfileLink(): bool
{
return $this->showProfileLink;
}
/**
* @param bool $showProfileLink
* @return ShowUserEvent
*/
public function setShowProfileLink(bool $showProfileLink)
{
$this->showProfileLink = $showProfileLink;
return $this;
}
/**
* @return bool
*/
public function isShowLogoutLink(): bool
{
return $this->showLogoutLink;
}
/**
* @param bool $showLogoutLink
* @return ShowUserEvent
*/
public function setShowLogoutLink(bool $showLogoutLink)
{
$this->showLogoutLink = $showLogoutLink;
return $this;
}
}
================================================
FILE: Event/SidebarMenuEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
class SidebarMenuEvent extends MenuEvent
{
}
================================================
FILE: Event/SidebarUserEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
class SidebarUserEvent extends ShowUserEvent
{
}
================================================
FILE: Event/TaskListEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use KevinPapst\AdminLTEBundle\Model\TaskInterface;
use KevinPapst\AdminLTEBundle\Repository\TaskRepositoryInterface;
/**
* The TaskListEvent collects all TaskInterface objects that should be rendered in the tasks section.
*/
class TaskListEvent extends ThemeEvent implements TaskRepositoryInterface
{
/**
* @var TaskInterface[]
*/
protected $tasks = [];
/**
* @var int
*/
protected $max;
/**
* @var int
*/
protected $total = 0;
/**
* @param int|null $max Maximum number of tasks displayed in panel
*/
public function __construct($max = null)
{
$this->max = $max;
}
/**
* Get the maximun number of notifications displayed in panel
*
* @return int
*/
public function getMax()
{
return $this->max;
}
/**
* @return TaskInterface[]
*/
public function getTasks()
{
if (null !== $this->max) {
return array_slice($this->tasks, 0, $this->max);
}
return $this->tasks;
}
/**
* @param TaskInterface $taskInterface
*
* @return $this
*/
public function addTask(TaskInterface $taskInterface)
{
$this->tasks[] = $taskInterface;
return $this;
}
/**
* @param int $total
*
* @return $this
*/
public function setTotal($total)
{
$this->total = $total;
return $this;
}
/**
* @return int
*/
public function getTotal()
{
return $this->total === 0 ? count($this->tasks) : $this->total;
}
}
================================================
FILE: Event/ThemeEvent.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
use Symfony\Contracts\EventDispatcher\Event;
/**
* Base event class to make theme related events easier to detect
*/
class ThemeEvent extends Event
{
}
================================================
FILE: Event/ThemeEvents.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Event;
/**
* Holds all events used by the theme
* @deprecated since 3.0, use new Event classes directly
*/
interface ThemeEvents
{
/**
* Used to receive notification data
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_NOTIFICATIONS = NotificationListEvent::class;
/**
* Used to receive message data
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_MESSAGES = MessageListEvent::class;
/**
* Used to receive task data
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_TASKS = TaskListEvent::class;
/**
* Used to receive the current user for the navbar
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_NAVBAR_USER = NavbarUserEvent::class;
/**
* Used to receive breadcrumb data
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_BREADCRUMB = BreadcrumbMenuEvent::class;
/**
* Used to receive the current user for the sidebar
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_SIDEBAR_USER = SidebarUserEvent::class;
/**
* Used to receive the sidebar menu data
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_SIDEBAR_SETUP_MENU = SidebarMenuEvent::class;
/**
* Used for the knp menu mechanics
*
* @deprecated since 3.0, use new Event classes directly
*/
public const THEME_SIDEBAR_SETUP_KNP_MENU = KnpMenuEvent::class;
}
================================================
FILE: Helper/Constants.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Helper;
interface Constants
{
public const COLOR_AQUA = 'aqua';
public const COLOR_GREEN = 'green';
public const COLOR_RED = 'red';
public const COLOR_YELLOW = 'yellow';
public const COLOR_GREY = 'grey';
public const COLOR_BLACK = 'black';
/**
* Used in:
* - Model\NotificationModel
* - Twig\AdminExtension
*/
public const TYPE_SUCCESS = 'success';
public const TYPE_WARNING = 'warning';
public const TYPE_ERROR = 'error';
public const TYPE_INFO = 'info';
}
================================================
FILE: Helper/ContextHelper.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Helper;
class ContextHelper extends \ArrayObject
{
/**
* @return array
*/
public function getOptions(): array
{
return $this->getArrayCopy();
}
/**
* @param string $name
* @param mixed $value
* @return $this
*/
public function setOption(string $name, $value): ContextHelper
{
$this->offsetSet($name, $value);
return $this;
}
/**
* @param string $name
* @return bool
*/
public function hasOption(string $name): bool
{
return $this->offsetExists($name);
}
/**
* @param string $name
* @param mixed $default
* @return mixed|null
*/
public function getOption(string $name, $default = null)
{
return $this->offsetExists($name) ? $this->offsetGet($name) : $default;
}
}
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2014-2018 Marc Bach, Ángel Guzmán Maeso, Kevin Papst and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
You can find the full list of contributors at:
https://github.com/avanzu/AdminThemeBundle/graphs/contributors
https://github.com/kevinpapst/AdminLTEBundle/graphs/contributors
================================================
FILE: Menu/MenuBuilder.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Menu;
use KevinPapst\AdminLTEBundle\Event\KnpMenuEvent;
use Knp\Menu\FactoryInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class MenuBuilder
{
/**
* @var FactoryInterface
*/
private $factory;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @param FactoryInterface $factory
* @param EventDispatcherInterface $eventDispatcher
*/
public function __construct(FactoryInterface $factory, EventDispatcherInterface $eventDispatcher)
{
$this->factory = $factory;
$this->eventDispatcher = $eventDispatcher;
}
public function createMainMenu(array $options)
{
$menu = $this->factory->createItem('root', [
'childrenAttributes' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'],
]);
$childOptions = [
'attributes' => ['class' => 'treeview'],
'childrenAttributes' => ['class' => 'treeview-menu'],
'labelAttributes' => [],
];
$this->eventDispatcher->dispatch(new KnpMenuEvent($menu, $this->factory, $options, $childOptions));
return $menu;
}
}
================================================
FILE: Model/MenuItemInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
/**
* Interface MenuItemInterface
*/
interface MenuItemInterface
{
/**
* @return string
*/
public function getIdentifier();
/**
* @return string
*/
public function getLabel();
/**
* @return string
*/
public function getRoute();
/**
* @return bool
*/
public function isActive();
/**
* @param bool $isActive
*/
public function setIsActive($isActive);
/**
* @return bool
*/
public function hasChildren();
/**
* @return array
*/
public function getChildren();
/**
* @param MenuItemInterface $child
*/
public function addChild(MenuItemInterface $child);
/**
* @param MenuItemInterface $child
*/
public function removeChild(MenuItemInterface $child);
/**
* @return string
*/
public function getIcon();
/**
* @return string
*/
public function getBadge();
/**
* @return string
*/
public function getBadgeColor();
/**
* @return MenuItemInterface
*/
public function getParent();
/**
* @return bool
*/
public function hasParent();
/**
* @param MenuItemInterface $parent
*/
public function setParent(MenuItemInterface $parent = null);
/**
* @return MenuItemInterface|null
*/
public function getActiveChild();
}
================================================
FILE: Model/MenuItemModel.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
/**
* Class MenuItemModel
*/
class MenuItemModel implements MenuItemInterface
{
/**
* @var string
*/
protected $identifier;
/**
* @var string
*/
protected $label;
/**
* @var string
*/
protected $route;
/**
* @var array
*/
protected $routeArgs = [];
/**
* @var bool
*/
protected $isActive = false;
/**
* @var array
*/
protected $children = [];
/**
* @var mixed
*/
protected $icon = false;
/**
* @var mixed
*/
protected $badge = false;
/**
* @var string
*/
protected $badgeColor = 'green';
/**
* @var MenuItemInterface
*/
protected $parent = null;
/**
* @param string $id
* @param string $label
* @param string $route
* @param array $routeArgs
* @param mixed $icon
* @param mixed $badge
* @param string $badgeColor
*/
public function __construct(
$id,
$label,
$route,
$routeArgs = [],
$icon = false,
$badge = false,
$badgeColor = 'green'
) {
$this->badge = $badge;
$this->icon = $icon;
$this->identifier = $id;
$this->label = $label;
$this->route = $route;
$this->routeArgs = $routeArgs;
$this->badgeColor = $badgeColor;
}
/**
* @return mixed
*/
public function getBadge()
{
return $this->badge;
}
/**
* @param mixed $badge
*
* @return $this
*/
public function setBadge($badge)
{
$this->badge = $badge;
return $this;
}
/**
* @return array
*/
public function getChildren()
{
return $this->children;
}
/**
* @param array $children
*/
public function setChildren($children)
{
$this->children = $children;
}
/**
* @return mixed
*/
public function getIcon()
{
return $this->icon;
}
/**
* @param mixed $icon
*
* @return $this
*/
public function setIcon($icon)
{
$this->icon = $icon;
return $this;
}
/**
* @return string
*/
public function getIdentifier()
{
return $this->identifier;
}
/**
* @param string $identifier
*
* @return $this
*/
public function setIdentifier($identifier)
{
$this->identifier = $identifier;
return $this;
}
/**
* @return bool
*/
public function getIsActive()
{
return $this->isActive;
}
/**
* @param bool $isActive
*
* @return $this
*/
public function setIsActive($isActive)
{
if ($this->hasParent()) {
$this->getParent()->setIsActive($isActive);
}
$this->isActive = $isActive;
return $this;
}
/**
* @return bool
*/
public function hasParent()
{
return $this->parent instanceof MenuItemInterface;
}
/**
* @return MenuItemInterface
*/
public function getParent()
{
return $this->parent;
}
/**
* @param MenuItemInterface $parent
*
* @return $this
*/
public function setParent(MenuItemInterface $parent = null)
{
$this->parent = $parent;
return $this;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @param string $label
*
* @return $this
*/
public function setLabel($label)
{
$this->label = $label;
return $this;
}
/**
* @return string
*/
public function getRoute()
{
return $this->route;
}
/**
* @param string $route
*
* @return $this
*/
public function setRoute($route)
{
$this->route = $route;
return $this;
}
/**
* @return array
*/
public function getRouteArgs()
{
return $this->routeArgs;
}
/**
* @param array $routeArgs
*
* @return $this
*/
public function setRouteArgs($routeArgs)
{
$this->routeArgs = $routeArgs;
return $this;
}
/**
* @return bool
*/
public function hasChildren()
{
return count($this->children) > 0;
}
/**
* @param MenuItemInterface $child
*
* @return $this
*/
public function addChild(MenuItemInterface $child)
{
$child->setParent($this);
$this->children[] = $child;
return $this;
}
/**
* @param MenuItemInterface $child
*
* @return $this
*/
public function removeChild(MenuItemInterface $child)
{
if (false !== ($key = array_search($child, $this->children))) {
unset($this->children[$key]);
}
return $this;
}
/**
* @return string
*/
public function getBadgeColor()
{
return $this->badgeColor;
}
/**
* @param string $badgeColor
*
* @return $this
*/
public function setBadgeColor($badgeColor)
{
$this->badgeColor = $badgeColor;
return $this;
}
/**
* @return MenuItemInterface|null
*/
public function getActiveChild()
{
foreach ($this->children as $child) {
if ($child->isActive()) {
return $child;
}
}
return null;
}
/**
* @return bool
*/
public function isActive()
{
return $this->isActive;
}
}
================================================
FILE: Model/MessageInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
/**
* Representation of a displayable message in the theme's messages section
*/
interface MessageInterface
{
/**
* Returns the sender
*
* @return UserInterface
*/
public function getFrom();
/**
* Returns the sentAt date
*
* @return \DateTime
*/
public function getSentAt();
/**
* Returns the subject
*
* @return string
*/
public function getSubject();
/**
* Returns the unique identifier of this message
*
* @return string
*/
public function getIdentifier();
}
================================================
FILE: Model/MessageModel.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
class MessageModel implements MessageInterface
{
/**
* @var UserInterface
*/
protected $from;
/**
* @var UserInterface
*/
protected $to;
/**
* @var \DateTime
*/
protected $sentAt;
/**
* @var string
*/
protected $subject;
/**
* @var string
*/
protected $id;
/**
* Creates a new MessageModel object with the given values.
*
* SentAt will be set to the current DateTime when null is given.
*
* @param UserInterface $from
* @param string $subject
* @param \DateTime $sentAt
* @param UserInterface $to
*/
public function __construct(UserInterface $from = null, $subject = '', $sentAt = null, UserInterface $to = null)
{
$this->to = $to;
$this->subject = $subject;
$this->sentAt = $sentAt ?: new \DateTime();
$this->from = $from;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param string $id
* @return MessageModel
*/
public function setId($id): MessageModel
{
$this->id = $id;
return $this;
}
/**
* Set the sender
*
* @param UserInterface $from
* @return $this
*/
public function setFrom(UserInterface $from): MessageModel
{
$this->from = $from;
return $this;
}
/**
* Get the Sender
*
* @return UserInterface
*/
public function getFrom()
{
return $this->from;
}
/**
* Set the date sent
*
* @param \DateTime $sentAt
*
* @return $this
*/
public function setSentAt(\DateTime $sentAt): MessageModel
{
$this->sentAt = $sentAt;
return $this;
}
/**
* Get the date sent
*
* @return \DateTime
*/
public function getSentAt(): \DateTime
{
return $this->sentAt;
}
/**
* Set the subject
*
* @param string $subject
* @return $this
*/
public function setSubject($subject): MessageModel
{
$this->subject = $subject;
return $this;
}
/**
* Get the subject
*
* @return string
*/
public function getSubject()
{
return $this->subject;
}
/**
* Set the recipient
*
* @param UserInterface $to
* @return $this
*/
public function setTo(UserInterface $to): MessageModel
{
$this->to = $to;
return $this;
}
/**
* Get the recipient
*
* @return UserInterface
*/
public function getTo()
{
return $this->to;
}
/**
* Get the identifier
*
* @return string
*/
public function getIdentifier()
{
if (!empty($this->id)) {
return $this->id;
}
return $this->getSubject();
}
}
================================================
FILE: Model/NavBarUserLink.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
class NavBarUserLink
{
/**
* @var string
*/
protected $title;
/**
* @var string
*/
protected $path;
/**
* @var array
*/
protected $parameters;
/**
* @param string $title
* @param string $path
* @param array $parameters
*/
public function __construct($title, $path, $parameters = [])
{
$this->title = $title;
$this->path = $path;
$this->parameters = $parameters;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* @param string $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* @return array
*/
public function getParameters()
{
return $this->parameters;
}
/**
* @param array $parameters
*/
public function setParameters($parameters)
{
$this->parameters = $parameters;
}
}
================================================
FILE: Model/NotificationInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
interface NotificationInterface
{
/**
* @return string
*/
public function getMessage();
/**
* @return string
*/
public function getType();
/**
* @return string
*/
public function getIcon();
/**
* @return string
*/
public function getIdentifier();
}
================================================
FILE: Model/NotificationModel.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
use KevinPapst\AdminLTEBundle\Helper\Constants;
class NotificationModel implements NotificationInterface
{
/**
* @var string
*/
protected $type = Constants::TYPE_INFO;
/**
* @var string
*/
protected $message;
/**
* @var string
*/
protected $icon;
/**
* @var string
*/
protected $id;
/**
* @param string|null $message
* @param string $type
* @param string $icon
*/
public function __construct($message = null, $type = Constants::TYPE_INFO, $icon = 'fas fa-exclamation-triangle')
{
$this->message = $message;
$this->type = $type;
$this->icon = $icon;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param string $id
* @return NotificationModel
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @param string $message
*
* @return NotificationModel
*/
public function setMessage($message)
{
$this->message = $message;
return $this;
}
/**
* @return string
*/
public function getMessage()
{
return $this->message;
}
/**
* @param string $type
*
* @return NotificationModel
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* @return string
*/
public function getType()
{
return $this->type;
}
/**
* @param string $icon
*
* @return NotificationModel
*/
public function setIcon($icon)
{
$this->icon = $icon;
return $this;
}
/**
* @return string
*/
public function getIcon()
{
return $this->icon;
}
/**
* @return string
*/
public function getIdentifier()
{
if (!empty($this->id)) {
return $this->id;
}
return $this->message;
}
}
================================================
FILE: Model/TaskInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
interface TaskInterface
{
/**
* @return string
*/
public function getColor();
/**
* @return int
*/
public function getProgress();
/**
* @return string
*/
public function getTitle();
/**
* @return string
*/
public function getIdentifier();
}
================================================
FILE: Model/TaskModel.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
use KevinPapst\AdminLTEBundle\Helper\Constants;
class TaskModel implements TaskInterface
{
/**
* @var int
*/
protected $progress;
/**
* @var string
*/
protected $color = Constants::COLOR_AQUA;
/**
* @var string
*/
protected $title;
/**
* @var string
*/
protected $id;
/**
* @param string $title
* @param int $progress
* @param string $color
*/
public function __construct($title = null, $progress = 0, $color = Constants::COLOR_AQUA)
{
$this->title = $title;
$this->progress = $progress;
$this->color = $color;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param string $id
* @return TaskModel
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @param string $color
*
* @return TaskModel
*/
public function setColor($color)
{
$this->color = $color;
return $this;
}
/**
* @return string
*/
public function getColor()
{
return $this->color;
}
/**
* @param int $progress
*
* @return TaskModel
*/
public function setProgress($progress)
{
$this->progress = $progress;
return $this;
}
/**
* @return int
*/
public function getProgress()
{
return $this->progress;
}
/**
* @param string $title
*
* @return TaskModel
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @return string
*/
public function getIdentifier()
{
if (!empty($this->id)) {
return $this->id;
}
return $this->title;
}
}
================================================
FILE: Model/UserDetailsInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
interface UserDetailsInterface
{
/**
* @return NavBarUserLink[]
*/
public function getLinks(): array;
public function getUser(): ?UserInterface;
public function isShowProfileLink(): bool;
public function isShowLogoutLink(): bool;
}
================================================
FILE: Model/UserInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
interface UserInterface
{
/**
* @return string
*/
public function getAvatar();
/**
* @return string
*/
public function getUsername();
/**
* @return string
*/
public function getName();
/**
* @return \DateTime
*/
public function getMemberSince();
/**
* @return bool
*/
public function isOnline();
/**
* @return string
*/
public function getIdentifier();
/**
* @return string
*/
public function getTitle();
}
================================================
FILE: Model/UserModel.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Model;
class UserModel implements UserInterface
{
/**
* @var string
*/
protected $avatar;
/**
* @var string
*/
protected $username;
/**
* @var string
*/
protected $name;
/**
* @var string
*/
protected $title;
/**
* @var \DateTime
*/
protected $memberSince;
/**
* @var bool
*/
protected $isOnline = false;
/**
* @var string
*/
protected $id;
/**
* @param string $username
* @param string $avatar
* @param \DateTime $memberSince
* @param bool $isOnline
* @param string $name
* @param string $title
*/
public function __construct($username = '', $avatar = '', $memberSince = null, $isOnline = true, $name = '', $title = '')
{
$this->username = $username;
$this->avatar = $avatar;
$this->memberSince = $memberSince ?: new \DateTime();
$this->isOnline = $isOnline;
$this->name = $name;
$this->title = $title;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param string $id
* @return UserModel
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @param string $avatar
*
* @return $this
*/
public function setAvatar($avatar)
{
$this->avatar = $avatar;
return $this;
}
/**
* @return string
*/
public function getAvatar()
{
return $this->avatar;
}
/**
* @param bool $isOnline
*
* @return $this
*/
public function setIsOnline($isOnline)
{
$this->isOnline = $isOnline;
return $this;
}
/**
* @return bool
*/
public function getIsOnline()
{
return $this->isOnline;
}
/**
* @param \DateTime $memberSince
*
* @return $this
*/
public function setMemberSince(\DateTime $memberSince)
{
$this->memberSince = $memberSince;
return $this;
}
/**
* @return \DateTime
*/
public function getMemberSince()
{
return $this->memberSince;
}
/**
* @param string $username
*
* @return $this
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* @return string
*/
public function getUsername()
{
return $this->username;
}
/**
* @param string $name
*
* @return $this
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string $title
*
* @return $this
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @return bool
*/
public function isOnline()
{
return $this->getIsOnline();
}
/**
* @return string
*/
public function getIdentifier()
{
if (!empty($this->id)) {
return $this->id;
}
return str_replace(' ', '-', $this->getUsername());
}
}
================================================
FILE: README.md
================================================
---
# THIS BUNDLE IS NOT MAINTAINED ANYMORE
The used AdminLTE version is old.
Both: supported Symfony and PHP version are EOL.
Issues, bug requests and even pull requests will not neither be answered nor merged.
If you are looking for a modern alternative, check out the Tabler bundle at: https://github.com/kevinpapst/TablerBundle
---
[](https://packagist.org/packages/kevinpapst/adminlte-bundle)
[](https://packagist.org/packages/kevinpapst/adminlte-bundle)
[](LICENSE)
# AdminLTE Bundle for Symfony
This repository contains an upgraded version of the AvanzuAdminThemeBundle, bringing the AdminLTE theme to Symfony 4.
## Introduction
- [Documentation](Resources/docs/) - How to install, use and enjoy this bundle
- [Demo app](https://github.com/kevinpapst/AdminLTEBundle-Demo) - Demo application using this bundle
- [Kimai time-tracking](https://github.com/kimai/kimai) - online time-tracking app using this bundle and Symfony 4
### Minimum requirements
- Symfony 4.3
- PHP > 7.2
- Twig 2.0
**Compatibility:**
Version 3.x should be compatible with Symfony 5 and PHP 8, [please leave your feedback](https://github.com/kevinpapst/AdminLTEBundle/issues/144).
- Version 3.x is only compatible with Symfony >= 4.3
- Version 2.x of this bundle is compatible with Symfony < 4.3
## Features
Some of the main features of this theme bundle:
- Two main layouts for main application and security (login, forgot password, register account...)
- Support for Symfony 4.x
- Support for KNPMenuBundle
- Support for FOSUserBundle
- Webpack-Encore support for building assets
- Event-driven handling of menu entries, tasks and notifications
- Translations for: english, german, italian, czech, spanish, russian, arabic, finnish, japanese, swedish, portuguese (brazilian), dutch, french, turkish, danish, chinese, slovakian, basque, polish, esperanto, hebrew, romanian (please help translating it to more languages)
- Based on AdminLTE 2.4.8
- Using FontAwesome 5
## Installation with Symfony Flex
Installation using Symfony flex:
```bash
composer config extra.symfony.allow-contrib true
composer req "kevinpapst/adminlte-bundle:^3.0"
```
## Installation with Composer
Installation using the "traditional" composer approach:
```bash
composer require kevinpapst/adminlte-bundle ^3.0
```
Afterwards copy the default config to your `config/packages/` directory:
```bash
cp vendor/kevinpapst/adminlte-bundle/config/packages/admin_lte.yaml config/packages/
```
Then, enable the bundle by adding it to the list of registered bundles in the `config/bundles.php` file of your project:
```php
<?php
return [
// ...
KevinPapst\AdminLTEBundle\AdminLTEBundle::class => ['all' => true],
];
```
## Difference between AdminLTEBundle and AvanzuAdminThemeBundle
First and foremost: the original repository has a strong backward compatibility in mind, maintenance is only done if Symfony 2 and 3 compatibility is kept (e.g. [here](https://github.com/avanzu/AdminThemeBundle/pull/216)).
That means you don't get the new shiny stuff for SF4. As I work on a Symfony 4 project, utilizing webpack-encore I needed a solution.
First I tried to sent PRs for the original repository, but those were not always accepted [eg. here](https://github.com/avanzu/AdminThemeBundle/pulls/kevinpapst).
As I really needed an upgraded version, I tried to manage a branch in a fork for a couple of weeks, but that wasn't working well
and I found myself overwriting more and more stuff in my project until there was a point were I had to choose between:
1. doing all the changes in my project
2. doing the changes in my forked repository and having "dev-" entries in my composer.json
3. cleanup the fork, merge it with my project changes and release it for the community
The choice **3** was easy and obvious for me: I am doing the work now in this repository with a fresh start and the chance for backward-compatibility breaks (for the users migrating from the AdminThemeBundle).
### Main differences
This repository was created from the original master, but with a lot of enhancements on top:
- Auto discovery for commands (see [#215](https://github.com/avanzu/AdminThemeBundle/pull/215))
- Symfony4 compatibility (see [#215](https://github.com/avanzu/AdminThemeBundle/pull/216))
- Dynamic config options (see [#217](https://github.com/avanzu/AdminThemeBundle/pull/217))
- Upgraded to AdminLTE 2.4.8
- Added support for [FOSUserBundle](Resources/docs/fos_userbundle.md)
- Added Symfony Flex recipe for easier integration
- Using Webpack-Encore for compiling frontend-assets
- Fixed KNPMenu integration
- Replaced AliasRouting with simpler version
- Changed namespaces to allow co-existence with AdminThemeBundle for migration
- Changed and extended default configuration
- Huge cleanup of the codebase
- Changed all twig block-names (with additional layout shim files for migration)
- Changed control-sidebar, content is now configurable from admin_lte.yaml or the ContextHelper
- A [Demo application](https://github.com/kevinpapst/AdminLTEBundle-Demo) as living documentation for first time users and easier testing
- Updated composer.json to reflect more up-to-date bundle dependencies
- Introduction of unit tests, phpstan and code-style rules (all checked by Travis)
### Migration from AvanzuAdminTheme
Be aware: I decided to change some project internals and got rid of some features from the original AdminThemeBundle.
I found the all-in-one solution to be more problematic then helpful at several places, so I took the chance to update it to my own interpretation of a theme bundle.
If you previously used the `AvanzuAdminTheme` you will not be able to "just replace" the composer package.
Plan ahead, you will need (depending on the size of your project) a couple of hours [for the migration](Resources/docs/migration_guide.md).
I migrated my own project within ~4 hours, but I had to move a lot of the customization to the bundle (e.g. the webpack-encore build) in the same time.
See the PRs [#202](https://github.com/kimai/kimai/pull/202/files) and [#206](https://github.com/kevinpapst/kimai2/pull/206/files) for migration examples.
## License and contributors
Published under the MIT, read the [LICENSE](LICENSE) file for more information.
This repository is based on the work of [AdminThemeBundle](https://github.com/avanzu/AdminThemeBundle), please check their contributor list as well and give them a star!
================================================
FILE: Repository/MessageRepositoryInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Repository;
use KevinPapst\AdminLTEBundle\Model\MessageInterface;
interface MessageRepositoryInterface
{
/**
* @return int
*/
public function getTotal();
/**
* @return iterable<MessageInterface>
*/
public function getMessages();
}
================================================
FILE: Repository/NotificationRepositoryInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Repository;
use KevinPapst\AdminLTEBundle\Model\NotificationInterface;
interface NotificationRepositoryInterface
{
/**
* @return int
*/
public function getTotal();
/**
* @return iterable<NotificationInterface>
*/
public function getNotifications();
}
================================================
FILE: Repository/TaskRepositoryInterface.php
================================================
<?php
/*
* This file is part of the AdminLTE bundle.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace KevinPapst\AdminLTEBundle\Repository;
use KevinPapst\AdminLTEBundle\Model\TaskInterface;
interface TaskRepositoryInterface
{
/**
* @return int
*/
public function getTotal();
/**
* @return iterable<TaskInterface>
*/
public function getTasks();
}
================================================
FILE: Resources/assets/admin-lte-extensions.scss
================================================
@import "~bootstrap-sass/assets/stylesheets/bootstrap/variables";
/*
* This theme was upgraded to FONT AWESOME 5
* which is not supported by the original "AdminLTE" theme yet.
*
* So we have to do add add some additional styles:
*/
.sidebar-menu>li>a>.far,
.sidebar-menu>li>a>.fas,
.sidebar-menu>li>a>.fal,
.sidebar-menu>li>a>.fab {
width: 20px;
}
.sidebar-menu .treeview-menu>li>a>.far,
.sidebar-menu .treeview-menu>li>a>.fas,
.sidebar-menu .treeview-menu>li>a>.fal,
.sidebar-menu .treeview-menu>li>a>.fab {
width: 20px;
}
.main-header .sidebar-toggle {
font-family: "Font Awesome 5 Free";
font-weight: 900;
}
.login-page form label {
padding-left: 5px;
}
.control-label.required:after {
content:" *";
font-size: 110%;
}
.timeline > li > .far,
.timeline > li > .fas,
.timeline > li > .fal,
.timeline > li > .fab {
width: 30px;
height: 30px;
font-size: 15px;
line-height: 30px;
position: absolute;
color: #666;
background: #d2d6de;
border-radius: 50%;
text-align: center;
left: 18px;
top: 0;
}
@media (min-width: $screen-sm-min) {
body.login-page {
.login-logo {
padding-top: 45px;
margin-bottom: 55px;
}
}
}
body.login-page {
.login-box-body {
padding: 20px;
box-shadow: 0px 29px 147.5px 102.5px rgba(0, 0, 0, 0.05), 0px 29px 95px 0px rgba(0, 0, 0, 0.16);
}
label {
font-weight: normal;
}
button.btn.btn-flat, input[type=text], input[type=password] {
border-radius: 3px;
}
}
================================================
FILE: Resources/assets/admin-lte.js
================================================
// ------ jquery and bootstrap basics ------
// create global $ and jQuery variables
const $ = require('jquery');
global.$ = global.jQuery = $;
require('jquery-ui');
require('bootstrap-sass');
require('jquery-slimscroll');
require('bootstrap-select');
const Moment = require('moment');
global.moment = Moment;
require('daterangepicker');
// ------ AdminLTE framework ------
require('./admin-lte.scss');
require('admin-lte/dist/css/AdminLTE.min.css');
require('admin-lte/dist/css/skins/_all-skins.css');
require('./admin-lte-extensions.scss');
global.$.AdminLTE = {};
global.$.AdminLTE.options = {};
require('admin-lte/dist/js/adminlte.min');
// ------ Theme itself ------
require('./default_avatar.png');
// ------ icheck for enhanced radio buttons and checkboxes ------
require('icheck');
require('icheck/skins/square/blue.css');
================================================
FILE: Resources/assets/admin-lte.scss
================================================
$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
$fa-font-path: "~@fortawesome/fontawesome-free/webfonts/";
@import '~bootstrap-sass/assets/stylesheets/bootstrap';
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/brands';
@import '~daterangepicker/daterangepicker.css';
@import '~bootstrap-select/dist/css/bootstrap-select.min.css';
================================================
FILE: Resources/config/container/knp-menu.yml
================================================
services:
KevinPapst\AdminLTEBundle\Menu\MenuBuilder:
class: KevinPapst\AdminLTEBundle\Menu\MenuBuilder
arguments:
- "@knp_menu.factory"
- "@event_dispatcher"
tags:
- { name: knp_menu.menu_builder, method: createMainMenu, alias: adminlte_main }
================================================
FILE: Resources/config/services.yml
================================================
services:
KevinPapst\AdminLTEBundle\Twig\RuntimeExtension:
class: KevinPapst\AdminLTEBundle\Twig\RuntimeExtension
arguments:
- '@admin_lte_theme.context_helper'
- '%admin_lte_theme.routes%'
tags:
- { name: twig.runtime }
KevinPapst\AdminLTEBundle\Twig\EventsExtension:
class: KevinPapst\AdminLTEBundle\Twig\EventsExtension
arguments:
- '@event_dispatcher'
- '@admin_lte_theme.context_helper'
tags:
- { name: twig.runtime }
KevinPapst\AdminLTEBundle\Twig\AdminExtension:
class: KevinPapst\AdminLTEBundle\Twig\AdminExtension
tags:
- { name: twig.extension }
admin_lte_theme.context_helper:
class: KevinPapst\AdminLTEBundle\Helper\ContextHelper
arguments:
- '%admin_lte_theme.options%'
KevinPapst\AdminLTEBundle\Helper\ContextHelper:
alias: admin_lte_theme.context_helper
================================================
FILE: Resources/docs/README.md
================================================
# AdminLTE Bundle documentation
If you cannot find the needed information in this list of topics, please create an [issue](https://github.com/kevinpapst/AdminLTEBundle/issues):
* [Bundle configuration](configurations.md)
* [Configure the theme](bundle_options.md)
* [Using the layout](layout.md)
* [Components](component_events.md)
* [Breadcrumb Menu](breadcrumbs.md)
* [Form theme](form_theme.md)
* [Twig Widgets / Embeds](twig_widgets.md)
* [FOSUserBundle integration](fos_userbundle.md)
Customizing the left menu-sidebar:
* [Sidebar User](sidebar_user.md)
* [Sidebar Navigation](sidebar_navigation.md)
* [KNP Menu integration](knp_menu.md)
Customizing the upper navigation bar:
* [Navbar User](navbar_user.md)
* [Navbar Tasks](navbar_tasks.md)
* [Navbar Messages](navbar_messages.md)
* [Navbar Notifications](navbar_notifications.md)
Customizing the right control sidebar:
* [Control Sidebar](control_sidebar.md)
Extending webpack-encore:
* [Building frontend assets](frontend_assets.md)
* [Extend Webpack Encore](extend_webpack_encore.md)
For the users how come from the original AdminThemeBundle:
* [Migrating from AdminThemeBundle](migration_guide.md)
## Resources
Further resources related to this theme:
* [AdminLTEBundle demo application](https://github.com/kevinpapst/AdminLTEBundle-Demo)
* [AdminLTE 2.3](https://adminlte.io/themes/AdminLTE/documentation/index.html)
* [Bootstrap 3](https://getbootstrap.com/docs/3.3/)
* [FontAwesome 5](https://fontawesome.com)
================================================
FILE: Resources/docs/breadcrumbs.md
================================================
# The Breadcrumb component
The breadcrumb maps a list of route to a list of link.
You don't need to build a new EventListener/EventSubscriber as long as you've already made it with the [Sidebar Navigation](sidebar_navigation.md) component.
If it fits your needs, you can re-use this class to build the Breadcrumb list of links.
## EventSubscriber
Edit the previously made class `MenuBuilderSubscriber` and register it for another event:
```php
<?php
// src/EventSubscriber/MenuBuilderSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\BreadcrumbMenuEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MenuBuilderSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
SidebarMenuEvent::class => ['onSetupMenu', 100],
BreadcrumbMenuEvent::class => ['onSetupNavbar', 100],
];
}
// ... the rest of the class follows here ...
}
```
## EventListener
If you are using an EventListener, you have to register it as new listener to the event system.
```yaml
# config/services.yaml
services:
app.breadcrumb_listener:
class: App\EventListener\MenuBuilderListener
tags:
- { name: kernel.event_listener, event: theme.breadcrumb, method: onSetupMenu }
```
As you can see we are using the menu listener from the [Sidebar Navigation](sidebar_navigation.md)
but attaching to the `theme.breadcrumb` event.
## Translating breadcrumb items
You don't have to care about translating your breadcrumb, each item will be automatically displayed by applying the `|trans` filter.
We apply the same principle as we do in the [Sidebar Navigation](sidebar_navigation.md).
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/bundle_options.md
================================================
# Theme options
The theme options define the basic layout of your side.
If you want to change any default value, define the key in `config/packages/admin_lte.yaml` under the `admin_lte.options` key.
See example below:
```yaml
admin_lte:
options:
default_avatar: 'bundles/adminlte/images/default_avatar.png'
skin: 'skin-blue'
fixed_layout: false
boxed_layout: false
collapsed_sidebar: false
mini_sidebar: false
```
Available AdminLTE skins are:
- skin-blue (default)
- skin-blue-light
- skin-yellow
- skin-yellow-light
- skin-green
- skin-green-light
- skin-purple
- skin-purple-light
- skin-red
- skin-red-light
- skin-black
- skin-black-light
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/component_events.md
================================================
# Accessing components
The contents of the navbar and sidebar are separated into components, following an event driven approach.
The general process to use a particular component is: create an EventListener or EventSubscriber and use the given event object to add UI elements.
Each component has its own event and specific UI data interface.
## Available events
Please see the [event directory](https://github.com/kevinpapst/AdminLTEBundle/blob/master/Event/) for all available events.
| Name | Description |
|:-|-|
| Event-Class | Description | Link |
|---|---|---|
| `NotificationListEvent::class` | Used to receive notification data | [read more](navbar_notifications.md) |
| `MessageListEvent::class` | Used to receive message data | [read more](navbar_messages.md) |
| `TaskListEvent::class` | Used to receive task data | [read more](navbar_tasks.md) |
| `NavbarUserEvent::class` | Used to receive the current user for the navbar | [read more](navbar_user.md) |
| `BreadcrumbMenuEvent::class` | Used to receive breadcrumb data | [read more](breadcrumbs.md) |
| `SidebarUserEvent::class` | Used to receive the current user for the sidebar | [read more](sidebar_user.md) |
| `SidebarMenuEvent::class` | Used to receive the sidebar menu data | [read more](sidebar_navigation.md) |
| `KnpMenuEvent::class` | Used for the knp menu mechanics | [read more](knp_menu.md) |
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/configurations.md
================================================
# Configurations
After installing the theme, you have to adjust a couple of config settings to your application.
The configuration file is located at `config/packages/admin_lte.yaml` and contains these main sections:
```yaml
admin_lte:
options:
control_sidebar:
theme:
knp_menu:
routes:
```
## Theme options (admin_lte.options)
The theme options define the basic layout of your side.
Read more in the [theme options](bundle_options.md) documentation.
## Control Sidebar (admin_lte.control_sidebar)
The control sidebar on the right-hand screen will slide-in over the content area.
It can contain up to 5 tabs, all of them will display an icon in the tab header.
Read more in the [control sidebar](control_sidebar.md) documentation.
## Theme configuration (admin_lte.theme)
Default values for several components can be set in `widget` section, find more information in the [Twig widgets](twig_widgets.md) documentation.
## KNP Menu (admin_lte.knp_menu)
If you use the KNP MenuBundle in your application, you can configure it to be used in the theme.
Please read the [KNP menu docu](knp_menu.md) for more information.
## Route aliases (admin_lte.routes)
Since most of the components do generate one or two specific links (e.g. task list and task details) we are using an alias concept for defining the link within the theme.
The specific routes must be rigged with the option `admin_lte.routes` defining the alias name like so:
```yaml
admin_lte:
routes:
adminlte_welcome: dashboard
```
So the theme route name `adminlte_welcome` maps to your route `dashboard`. Without defining these routes, the theme will not be able to render.
### Available route aliases
- `adminlte_welcome`: Used for the "homepage" within the theme (defaults to: home)
- `adminlte_login`: The login route (defaults to: login, must match option: `security.firewalls.xyz.form_login.login_path`)
- `adminlte_login_check`: The login route (defaults to: login_check, must match option: `security.firewalls.xyz.form_login.check_path`)
- `adminlte_registration`: The route for the registration form (defaults to: null). If route is not defined, then the link is not shown.
- `adminlte_password_reset`: The route for the "forgot password" form (defaults to: null). If route is not defined, then the link is not shown.
- `adminlte_message`: Used to generate a link to a specific message, receives parameter `id` (defaults to: message)
- `adminlte_messages`: Used to generate the message list link (defaults to: messages)
- `adminlte_notification`: Used to generate a link to a specific notification, receives parameter `id` (defaults to: notification)
- `adminlte_notifications`: Used to generate the notification list link (defaults to: notifications)
- `adminlte_task`: Used to generate a link to a specific task, receives parameter `id` (defaults to: task)
- `adminlte_tasks`: Used to generate the task list link (defaults to: tasks)
- `adminlte_profile`: Used for the current user's profile (defaults to: profile)
## Default configuration
The key `control_sidebar` is not part of the default configuration, for more information read the [control sidebar](control_sidebar.md) chapter.
```yaml
admin_lte:
options:
default_avatar: 'bundles/adminlte/images/default_avatar.png'
skin: 'skin-blue'
fixed_layout: false
boxed_layout: false
collapsed_sidebar: false
mini_sidebar: false
form_theme: default
max_navbar_notifications: 5
max_navbar_tasks: 5
max_navbar_messages: 5
control_sidebar:
[...]
theme:
widget:
type: 'primary'
bordered: true
collapsible: false
collapsible_title: 'Collapse'
removable: false
removable_title: 'Remove'
solid: false
use_footer: true
button:
type: 'primary'
size: false
knp_menu:
enable: false
main_menu: 'adminlte_main'
breadcrumb_menu: false
routes:
adminlte_welcome: 'home'
adminlte_login: 'login'
adminlte_login_check: 'login_check'
adminlte_registration: NULL
adminlte_password_reset: NULL
adminlte_message: 'message'
adminlte_messages: 'messages'
adminlte_notification: 'notification'
adminlte_notifications: 'notifications'
adminlte_task: 'task'
adminlte_tasks: 'tasks'
adminlte_profile: 'profile'
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/control_sidebar.md
================================================
# Control-Sidebar
The control sidebar on the right-hand screen will slide-in over the content area.
It can contain up to 5 tabs, all of them will display an icon in the tab header.
It can be configured with the package config `admin_lte.yaml` at the node:
```yaml
admin_lte:
control_sidebar:
```
The `control_sidebar` key is an array, where each key represents a tab. It must contain an combination of two keys:
- either `icon` and `template`
- or `icon` and `controller`
Both variants can be mixed through the tabs, so this would be a valid configuration:
```yaml
admin_lte:
control_sidebar:
home:
icon: fas fa-home
template: control-sidebar/home.html.twig
settings:
icon: fas fa-cogs
controller: 'App\Controller\DefaultController::controlSidebarSettings'
```
The first tab `home` will use the FontAwesome icon `home` and render the content from the template located at `templates/control-sidebar/home.html.twig`.
The second tab `settings` will use the FontAwesome icon `cogs` and render the content from the result of the call to the `DefaultController` and its action `controlSidebarSettings()`.
## Using controller actions
A simple example for the above configuration could look like this:
```php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends AbstractController
{
public function controlSidebarSettings(Request $originalRequest)
{
return $this->render('control-sidebar/settings.html.twig', []);
}
}
```
Note that you can get the original request passed in with the variable `$originalRequest` (which is optional).
This might be useful if you want to access the original requested route or request parameter.
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/extend_webpack_encore.md
================================================
# Extend Webpack Encore
If you are going to use your customized webpack-encore configuration and
want to take advantage of all the libraries imported from AdminLTEBundle,
you can easily extend its configuration.
## Create your webpack.config.js
First of all, create your own webpack.config.js, as in [Symfony documentation](http://symfony.com/doc/current/frontend/encore/simple-example.html):
```js
var Encore = require('@symfony/webpack-encore');
Encore
.setOutputPath('public/builds/')
.setPublicPath('/builds')
// this will be your app!
.addEntry('app', './assets/js/app.js')
.autoProvidejQuery()
.enableSourceMaps(!Encore.isProduction())
.cleanupOutputBeforeBuild()
.enableBuildNotifications()
// You need sass loader!
.enableSassLoader()
;
module.exports = Encore.getWebpackConfig();
```
Now you need to create (or update) your `package.json`. If you don't have one, copy
[package.json](../../package.json) from AdminLTEBundle. If you already have one, then
integrate it with the packages listed in `vendor/kevinpapst/adminlte-bundle/package.json`.
Then create your main app and require adminlte:
```js
// assets/js/app.js
require('../../vendor/kevinpapst/adminlte-bundle/Resources/assets/admin-lte');
```
Then, if you haven't done it already, install all packages and build your assets:
```bash
yarn install
[...]
./node_modules/.bin/encore production
```
## Correct the assets path
Now you have to update your assets path. To do this, create a new template
that is going to extend AdminLTEBundle main template:
```twig
{# templates/base.html.twig #}
{% extends '@AdminLTE/layout/default-layout.html.twig' %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('builds/app.css') }}">
{% endblock %}
{% block javascripts %}
<script src="{{ asset('builds/app.js') }}"></script>
{% endblock %}
```
And finally, in your project, extend your `templates/base.html.twig` when rendering
your pages:
```twig
{% extends 'base.html.twig' %}
```
Now, you can edit your `webpack.config.js` as you need.
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/form_theme.md
================================================
# Form theme
This bundle provides two form-themes:
- [Resources/views/layout/form-theme.html.twig](Resources/views/layout/form-theme.html.twig)
- [Resources/views/layout/form-theme-horizontal.html.twig](Resources/views/layout/form-theme-horizontal.html.twig)
The first one `form-theme.html.twig` is the default theme, which is automatically registered and will be applied to all form elements,
unless you overwrite it with an application wide form theme or manually overwrite it for a single form.
## Deactivate or switch default theme
Some users might not be comfortable with the default registration of the form theme, eg. because:
- they want to use the horizontal layout by default
- they want to activate the form theme only for single forms and not globally
With v4 you can now change that with the following config key:
```yaml
admin_lte:
options:
form_theme: ~
```
The allowed values are `default`, `horizontal` and the value null (here represented by `~`).
## Use the horizontal theme
To use the horizontal theme everywhere in your application edit `config/packages/twig.yaml`:
```yaml
twig:
form_themes:
- '@AdminLTE/layout/form-theme-horizontal.html.twig'
```
To use it only for one form, change your twig file:
```twig
{% form_theme form '@AdminLTE/layout/form-theme-horizontal.html.twig' %}
{{ form_start(form) }}
```
## Overwrite form theme in your application
Create a new twig file, e.g. at `templates/form/theme.html.twig`:
```twig
{% extends "@AdminLTE/layout/form-theme.html.twig" %}
{% block form_label %}
{% if form.vars.docu is defined and form.vars.docu is not empty %}
<a href="{{ path('help_chapter', {'chapter': form.vars.docu}) }}"><i class="{{ 'help'|icon }}"></i></a>
{% endif %}
{{ parent() }}
{% endblock form_label %}
```
and register it in `config/packages/twig.yaml`:
```yaml
twig:
form_themes:
- 'form/theme.html.twig'
```
### Overwrite one form with your layout
To override the default theme in any twig template you add a line like this to your twig file:
```twig
{% form_theme form 'form/theme.html.twig' %}
```
## Links
It is also possible to overwrite the form theme by referencing
[multiple templates](https://symfony.com/doc/current/form/form_customization.html#multiple-templates) in order of priority
or only customize/override some child elements in the form like:
```twig
{% form_theme form.submit '@AdminLTE/layout/form-theme.html.twig' %}
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/fos_userbundle.md
================================================
# FOSUserBundle integration
This bundle is prepared for a flawless integration with FOSUserBundle, but its not coming out-of-the-box.
First follow the [installation instruction for the FOSUserBundle](http://symfony.com/doc/current/bundles/FOSUserBundle/index.html) and
configure it to your needs.
Then integrate it with the AdminLTEBundle as follows.
## config/packages/admin_lte.yaml
```yaml
admin_lte:
routes:
adminlte_login: fos_user_security_login
adminlte_login_check: fos_user_security_check
adminlte_registration: fos_user_registration_register
adminlte_password_reset: fos_user_resetting_request
```
If you don't want the "password reset" and/or "register account" functionality,
simply remove the configuration keys `adminlte_password_reset` and `adminlte_registration`.
## Create templates
Create the directory `templates/bundles/FOSUserBundle/` with the following directory structure and files:
```
templates/bundles
└── FOSUserBundle
├── Registration
│ ├── confirmed.html.twig
│ └── register.html.twig
├── Resetting
│ └── request.html.twig
├── Security
│ └── login.html.twig
└── layout.html.twig
```
Now create the files with the following content:
### Registration/confirmed.html.twig
```yaml
{% extends '@AdminLTE/FOSUserBundle/Registration/confirmed.html.twig' %}
```
### Registration/register.html.twig
```yaml
{% extends '@AdminLTE/FOSUserBundle/Registration/register.html.twig' %}
```
### Resetting/request.html.twig
```yaml
{% extends '@AdminLTE/FOSUserBundle/Resetting/request.html.twig' %}
```
### Security/login.html.twig
```yaml
{% extends '@AdminLTE/FOSUserBundle/Security/login.html.twig' %}
```
### layout.html.twig
```yaml
{% extends '@AdminLTE/FOSUserBundle/layout.html.twig' %}
```
## Overwriting the application name
You might want to overwrite the block `logo_login` in each file to display your app name like this:
```yaml
{% block logo_login %}<b>Demo</b><br>Application{% endblock %}
```
You can have a look at the files in the [demo application](https://github.com/kevinpapst/AdminLTEBundle-Demo/tree/master/templates/bundles/FOSUserBundle) to get a first idea.
================================================
FILE: Resources/docs/frontend_assets.md
================================================
# Rebuilding assets
In case you want to rebuild the static scripts or need a build for a custom environment.
## Install vendor scripts
Execute `yarn install` to install the dependencies for this theme.
## Build asset files
To re-generate the asset files execute:
```
npm run build
```
These new assets will be stored at `Resources/public/`.
## Subdirectory usage
The AdminLTE theme comes pre-compiled for usage at domain level. If your application runs under a subdirectory,
you have to change a line in the file [webpack.config.js](https://github.com/kevinpapst/AdminLTEBundle/blob/master/webpack.config.js#L8) from:
```
.setPublicPath('/bundles/adminlte/')
```
to your subdirectory.
Lets say run app runs at https://www.example.com/my-app/ then you need to change it to:
```
.setPublicPath('/my-app/bundles/adminlte/')
```
This path is used for referencing assets from the users browser, so the generated path must be an absolute path to
the directory `my-app/public/bundles/adminlte/`.
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/knp_menu.md
================================================
# KnpMenu integration
The KnpMenu can be used instead of the regular built-in menu and breadcrumb components.
## Install the suggested dependency
Install through composer with:
```
composer require knplabs/knp-menu-bundle
```
Then add in your `config/bundles.php`:
```
<?php
return [
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
];
```
## Enabling the KnpMenu support
In order to use the KnpMenu integration you need to enable it in the configuration:
```yaml
admin_lte:
knp_menu:
enable: true
```
Enabling the KnpMenu support will disable the regular breadcrumb and menu events.
Instead, there will be a new `knp_menu.menu_builder` aliased `adminlte_main` which will dispatch a new event to hook into.
### The Event
Quite similar to the `SidebarMenuEvent`, using the knp_menu will trigger the `KnpMenuEvent` event.
The event listener will receive the `KnpMenuEvent` gives access to the root menu item, the menu factory and if applicable the `$options` and `$childOptions` as configured in the menu builder.
## EventSubscriber - auto-discovery with Symfony 4
In case you activated service discovery and auto-wiring in your app, you can write an EventSubscriber which will
be automatically registered in your container:
```php
<?php
// src/EventSubscriber/KnpMenuBuilderSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\KnpMenuEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class KnpMenuBuilderSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KnpMenuEvent::class => ['onSetupMenu', 100],
];
}
public function onSetupMenu(KnpMenuEvent $event)
{
$menu = $event->getMenu();
$menu->addChild('MainNavigationMenuItem', [
'label' => 'MAIN NAVIGATION',
'childOptions' => $event->getChildOptions()
])->setAttribute('class', 'header');
$menu->addChild('blogId', [
'route' => 'item_symfony_route',
'label' => 'Blog',
'childOptions' => $event->getChildOptions(),
'extras' => [
'badge' => [
'color' => 'yellow',
'value' => 4,
],
],
])->setLabelAttribute('icon', 'fas fa-tachometer-alt');
$menu->getChild('blogId')->addChild('ChildOneItemId', [
'route' => 'child_1_route',
'label' => 'ChildOneDisplayName',
'extras' => [
'badges' => [
[ 'value' => 6, 'color' => 'blue' ],
[ 'value' => 5, ],
],
],
'childOptions' => $event->getChildOptions()
])->setLabelAttribute('icon', 'fas fa-rss-square');
$menu->getChild('blogId')->addChild('ChildTwoItemId', [
'route' => 'child_2_route',
'label' => 'ChildTwoDisplayName',
'childOptions' => $event->getChildOptions()
]);
}
}
```
For a more in depth guide on how to use the KnpMenuBundle, please refer to the [official documentation](http://symfony.com/doc/current/bundles/KnpMenuBundle/index.html).
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Write an EventListener to work with the `KnpMenuEvent`.
```php
<?php
// src/EventListener/KnpMenuBuilderListener.php
namespace App\EventListener;
use KevinPapst\AdminLTEBundle\Event\KnpMenuEvent;
class KnpMenuBuilderListener
{
public function onSetupMenu(KnpMenuEvent $event)
{
$menu = $event->getMenu();
$menu->addChild('MainNavigationMenuItem', [
'label' => 'MAIN NAVIGATION',
'childOptions' => $event->getChildOptions()
])->setAttribute('class', 'header');
$menu->addChild('blogId', [
'route' => 'item_symfony_route',
'label' => 'Blog',
'childOptions' => $event->getChildOptions()
])->setLabelAttribute('icon', 'fas fa-tachometer-alt');
$menu->getChild('blogId')->addChild('ChildOneItemId', [
'route' => 'child_1_route',
'label' => 'ChildOneDisplayName',
'childOptions' => $event->getChildOptions()
])->setLabelAttribute('icon', 'fas fa-rss-square');
$menu->getChild('blogId')->addChild('ChildTwoItemId', [
'route' => 'child_2_route',
'label' => 'ChildTwoDisplayName',
'childOptions' => $event->getChildOptions()
]);
}
}
```
For a more in depth guide on how to use the KnpMenuBundle, please refer to the [official documentation](http://symfony.com/doc/current/bundles/KnpMenuBundle/index.html).
And attach your new listener to the event system in `config/services.yaml`:
```yaml
services:
app.setup_knp_menu_listener:
class: App\EventListener\KnpMenuBuilderListener
tags:
- { name: kernel.event_listener, event: theme.sidebar_setup_knp_menu, method: onSetupMenu }
```
### Enabling breadcrumb support
Breadcrumb support is deactivated by default for KnpMenu. Its behavior can be configured with the key `breadcrumb_menu`.
You have three choices:
- set it to `false` (which is the default value) will deactivate the breadcrumb
- set it to `true` will enable breadcrumb support and use the menubuilder configured in the key `main_menu` (whose default value is `adminlte_main`)
- set it to your own menu alias (the default menu builder alias is `adminlte_main`)
Example 1 - activate breadcrumb by using your default menu:
```yaml
admin_lte:
knp_menu:
enable : true
breadcrumb_menu: true
```
Example 2 - activate breadcrumb and use your own menu builder:
```yaml
admin_lte:
knp_menu:
enable : true
breadcrumb_menu: my_menu
```
### Replacing the MenuBuilder
Rather than using the menu builder provided by this bundle (which is aliased as `adminlte_main`), you could also generate your own implementation and change the bundle configuration to use your menu builder alias.
```yaml
admin_lte:
knp_menu:
enable : true
main_menu: <your builder alias> # By default "adminlte_main" alias
breadcrumb_menu: <true|false|your builder alias>
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/layout.md
================================================
# Using the layout
In order to use the layout, your views should extend from the provided `default-layout`
```twig
{% extends '@AdminLTE/layout/default-layout.html.twig' %}
```
## Twig Context-Helper
Instead of fully relying on blocks and includes, you are provided with a twig global named `admin_lte_context` to retrieve
several configuration values throughout the page rendering.
This is basically a parameter bag with some pre-defined values based on the bundle configuration.
It contains the following configuration keys:
- everything from `admin_lte.options`
- `button` from `admin_lte.theme.button`
- `widget` from `admin_lte.theme.widget`
- `control_sidebar` from `admin_lte.control_sidebar`
- `knp_menu` from `admin_lte.knp_menu`
To see all available settings, simply dump it in one of your templates:
```twig
{{ dump(admin_lte_context.options) }}
```
## Layout files
This bundle ships with two main template files which you need to extend in your theme:
- `default-layout.html.twig` for all default files
```
{% extends '@AdminLTE/layout/default-layout.html.twig' %}
```
- `security-layout.html.twig` for the security screens (login, register, forgot password)
```
{% extends '@AdminLTE/layout/security-layout.html.twig' %}
```
See [FOSUserBundle](fos_userbundle.md) for an easy integration of the security functionality.
## Partials
In order to make overriding some of the template regions easier, there are several partials included within the layout
which can be overridden individually as described [here](http://symfony.com/doc/current/templating/overriding.html).
Listed in the order of appearance, these are:
<dl>
<dt>@AdminLTE/Sidebar/knp-menu.html.twig
<dd>Renders the knp menu using the builder defined as `main_menu`.
<br/>___Notice___ *this partial will only be included when the knp_menu is enabled.*
<dt>@AdminLTE/Breadcrumb/knp-breadcrumb.html.twig
<dd>Renders the knp menu using the builder defined as `breadcrumb_menu`
<br/>___Notice___ *this partial will only be included when the knp_menu is enabled.*
<dt>@AdminLTE/Partials/_footer.html.twig
<dd>Renders the main footer
<dt>@AdminLTE/Partials/_control-sidebar.html.twig
<dd>Renders the control sidebar (right-hand panel) WHEN there are configured panels in the config `admin_lte.options.control_sidebar`
</dl>
## Layout blocks
The blocks are defined in the layout in order of appearance. Some of them do contain some of the major components like the sidebar or navbar.
In order to redefine the block and to keep the default content, don't forget to use `{{parent()}}`.
### security-layout.html.twig
<dl>
<dt>login_box
<dd>The main content block, containing the complete body of the
<dt>logo_login
<dd>The welcome title, should hold your application name or logo icon
<dt>login_box_msg
<dd>The box (inside) title, e.g. when you have different forms add a short title/explanation here
<dt>login_box_error
<dd>Security errors will be rendered in this block
<dt>login_form
<dd>
<dt>login_form_start
<dd>
<dt>login_form_end
<dd>
<dt>login_social_auth
<dd>
<dt>login_actions
<dd>
</dl>
### default-layout.html.twig
<dl>
<dt>html_start
<dd>Allows to add additional attributes to the `html` tag (like `ng-app` for Angular)
<dt>title
<dd>Defines the `title` and defaults to the contents of the block `page_title`
<dt>stylesheets
<dd>Defines all stylesheet tags that will be embedded in the `head` section
<dt>head
<dd>additional tags that go into the `head` section
<dt>body_start
<dd>Can be used to add additional attributes in the `body` tag (like `ng-app` for Angular)
<dt>after_body_start
<dd>comes right after the opening `body` tag
<dt>logo_path
<dd>The href value of `a.logo`
<dt>logo_mini
<dd>Contents of `.logo-mini`
<dt>logo_large
<dd>Contents of `.logo-lg`
<dt>navbar_toggle
<dd>Renders the `.sidebar-toggle` button
<dt>navbar_messages
<dd>Renders the `messages` component
<dt>navbar_notifications
<dd>Renders the `notifications` component
<dt>navbar_tasks
<dd>Renders the `tasks` component
<dt>navbar_user
<dd>Renders the `user` component
<dt>navbar_control_sidebar_toggle
<dd>Renders the toggle for the `control_sidebar` (if enabled)
<dt>sidebar_user
<dd>Renders the `userPanel` component
<dt>sidebar_search
<dd>Renders the `searchPanel` component
<dt>sidebar_nav
<dd>Renders the `menu` component _or_ includes `@AdminLTE/Sidebar/knp-menu.html.twig` depending on wether the `knp_menu` is enabled or not.
<dt>page_title
<dd>Defines the page header inside `.content-header` and implicitly the `title` if you haven't changed the content of `title`
<dt>page_subtitle
<dd>Defines the `small` portion of `.content-header`
<dt>breadcrumb
<dd>Renders either the `breadcrumb` component or includes `@AdminLTE/Breadcrumb/knp-breadcrumb.html.twig` based on your configuration.
<dt>page_content
<dd>The main content area.
<dt>page_content_class
<dd>The CSS class for the content block `page_content`.
<dt>page_content_before
<dd>A block to add additional content right before the start of `page_content`.
<dt>page_content_after
<dd>A block to add additional content right after the end of `page_content`.
<dt>footer
<dd>The main footer. Includes `@AdminLTE/Partials/_footer.html.twig` by default.
<dt>control_sidebar
<dd>Includes `@AdminLTE/Partials/_control-sidebar.html.twig`
<dt>javascripts
<dd>block to render `script` tags right before the closing `body`
</dl>
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/migration_guide.md
================================================
# Migration from the AdminThemeBundle
This is not a step-by-step migration guide, but a collection of hints what needs to be done.
Many of you will have a highly adjusted version of the AdminThemeBundle, so the best tip is to search for `avanzu` and
check if you need to change this occurrence.
The following hints should be reviewed carefully, as they apply for all of your projects.
## New requirements
- PHP >= 7.1.3
- Symfony >= 4.0
- FontAwesome 5
- npm (for rebuilding the frontend assets)
## Replace composer package
First you want to start-off with changing the composer package:
```
composer remove avanzu/admin-theme-bundle
composer require kevinpapst/adminlte-bundle
```
The bundle in your `config/bundles.php` should be auto-replaced, it changes from:
```
<?php
return [
...
Avanzu\AdminThemeBundle\AvanzuAdminThemeBundle::class => ['all' => true],
];
```
to
```
<?php
return [
...
KevinPapst\AdminLTEBundle\AdminLTEBundle::class => ['all' => true],
];
```
## Changed bundle name
Due to the changes in the bundle, you have to replace all class and view references.
### Namespaces
Replace `use Avanzu\AdminThemeBundle\` with `use KevinPapst\AdminLTEBundle\`.
### Template references
Replace `@AdminThemeBundle/` with `@AdminLTE`, as example before
```
{% include('@AdminThemeBundle/Partials/_footer.html.twig') %}
```
and afterwards
```
{% include('@AdminLTE/Partials/_footer.html.twig') %}
```
Also the controller references need to be changed from `AdminThemeBundle:` to `AdminLTEBundle:`, as example from:
```
controller('AdminThemeBundle:Navbar:messages')
```
to
```
controller('AdminLTEBundle:Navbar:messages')
```
Some macro files were updated and moved, replace:
```
{% import "@AvanzuAdminTheme/layout/macros.html.twig" as macro %}
```
to
```
{% import "@AdminLTE/Macros/default.html.twig" as macro %}
```
## Changed config
The configuration is now in the file `admin_lte.yaml` with the main key `admin_lte`,
which was previously `avanzu_admin_theme` in the file `avanzu_admin_theme.yaml` (depending on your setup this might be located somewhere else).
The following keys must be removed:
- `use_twig: true`
- `use_assetic: false`
- `bower_bin: "/usr/local/bin/bower"`
The config key `control_sidebar: true` was a boolean before and is now an array (see below in "Configurable control-sidebar").
NOTE: only `YAML` configs are shipped, while `XML` is not supported any longer.
## Changed route aliases
The file `routes.yml` was removed and the route-aliases were moved to the file `admin-lte.yaml` in the config key `admin_lte.routes`.
The configuration was simplified, it is now a key-value definition, where the key is the theme-internal name and the value is the route name for your application.
For example you need to replace:
```
avanzu_admin_profile:
path: /{_locale}/profile/{username}
options:
avanzu_admin_route: profile
```
with
```
admin_lte:
routes:
adminlte_profile: user_profile
```
where the route is defined via annotation:
```
class ProfileController extends AbstractController
{
/**
* @Route("/profile/{username}", name="user_profile")
*/
public function indexAction(User $profile)
{
return $this->getProfileView($profile, 'charts');
}
}
```
More information can be found in the [configurations docu](configurations.md).
## Removed components
The following files were removed, please check your references:
- all demo classes, files and configs (replaced by the [demo application](https://github.com/kevinpapst/AdminLTEBundle-Demo))
- class: WidgetHelper
- class: ExceptionController
- class: DefaultController
- class: WidgetController
- class: RouteAliasCollection
- class: ThemeManager
- class: WidgetExtension
- class: DependencyResolver
## Templates and layouts
There are shim files, which you can use while you are migrating your application.
If you previously relied on the AvanzuAdminTheme layouts, then these files are a replacement for the default twig layouts:
- Use `default-layout-avanzu.html.twig` instead of `default-layout.html.twig`
- Use `login-layout-avanzu.html.twig` instead of `login-layout.html.twig`
Make sure that you don't call `{{ parent() }}` in all blocks start start with the prefix `avanzu_`, as these blocks are only called virtually and don't exist any longer.
Further modifications:
- removed include `Partials/_head.html.twig` (use blocks `head`, `document_title`, `stylesheets` and `javascripts`)
- removed include `Partials/_scripts.html.twig`
The default layouts were modified to be more compatible with other themes, so the block names were changed and they do not contain `avanzu_` any longer as prefix.
### Changed blocks
Removed blocks:
- `avanzu_javascripts`
- `avanzu_javascripts_inline`
Use `javascripts` instead and don't forget to call `{{ parent() }}` (unless you compile the assets yourself).
## Configurable control-sidebar
The implementation of the control-sidebar is now dynamically and you can add tabs by defining their icon and content (either by include or controller action).
If you previously use your own `Partials/_control-sidebar.html.twig` then please check if you can replace it with the theme version.
Considering you cannot or don't want to change to the theme's implenetation then you might need to overwrite the block `{% block avanzu_navbar_control_sidebar_toggle %}` or create an empty fake configuration:
```yaml
# admin-lte.yaml
admin_lte:
options:
control_sidebar:
fake:
icon: foo
template: bar
```
Please check the [configurations](configurations.md) and [control-sidebar](control_sidebar.md) docu to for more information.
## Frontend assets
The frontend-assets are pre-compiled into one CSS and one Javascript file. There is no `ThemeManager` any longer!
If you have your own assets or need to run your application in a subdirectory, you need to adjust the build process.
Read the [building frontend assets](frontend_assets.md) documentation and see the [demo application](https://github.com/kevinpapst/AdminLTEBundle-Demo) on how that can be achieved.
### FontAwesome 5
Compared to the original theme, this bundle was upgraded to use FontAwesome 5.
Please read the [upgrading from v4](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4) documentation carefully, most icon definitions are incompatible as the previous prefix `fa` was replaced by `far` / `fas` / `fab`.
You have to find the proper font and icon and replace it from this:
```html
<i class="fa fa-tachometer"></i>
```
to the new version:
```html
<i class="fas fa-tachometer-alt"></i>
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/navbar_messages.md
================================================
# The Navbar Messages component
## Routes
Just like the other theme components, this one requires some route aliases to work.
Please refer to the [configurations overview](configurations.md) to learn about the route alias details.
## Required aliases
* all_messages
* message
## Data Model
In order to use this component, your user class has to implement the `KevinPapst\AdminLTEBundle\Model\MessageInterface`
```php
<?php
namespace App\Model;
use KevinPapst\AdminLTEBundle\Model\MessageInterface;
class MessageModel implements MessageInterface
{
// implement interface methods
}
```
The bundle provides the `MessageModel` as a ready to use implementation of the `MessageInterface`.
## EventSubscriber - auto-discovery with Symfony 4
In case you activated service discovery and auto-wiring in your app, you can write an EventSubscriber which will
be automatically registered in your container:
```php
<?php
// src/EventSubscriber/MessageSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\MessageListEvent;
use KevinPapst\AdminLTEBundle\Model\MessageModel;
use KevinPapst\AdminLTEBundle\Model\UserModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use App\Entity\User;
class MessageSubscriber implements EventSubscriberInterface
{
protected $security;
public function __construct(Security $security)
{
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
return [
MessageListEvent::class => ['onMessages', 100],
];
}
public function onMessages(MessageListEvent $event)
{
if (null === $this->security->getUser()) {
return;
}
/* @var $myUser User */
$myUser = $this->security->getUser();
$userModel = new UserModel();
$userModel->setName($myUser->getUsername());
$message = new MessageModel($userModel, 'Hello world');
$event->addMessage($message);
/*
* You can also set the total number of messages which could be different from those displayed in the navbar
* If no total is set, the total will be calculated on the number of messages added to the event
*/
$event->setTotal(15);
}
}
```
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Write an EventListener to work with the `MessageListEvent`:
```php
<?php
// src/EventListener/MessageListListener.php
namespace App\EventListener;
use KevinPapst\AdminLTEBundle\Event\MessageListEvent;
use KevinPapst\AdminLTEBundle\Model\MessageModel;
class MessageListListener
{
public function onListMessages(MessageListEvent $event)
{
foreach($this->getMessages() as $message) {
$event->addMessage($message);
}
}
protected function getMessages()
{
// see above in MessageSubscriber for a full example
return [];
}
}
```
## Service definition
Finally, you need to attach your new listener to the event system:
```yaml
services:
app.message_list_listener:
class: App\EventListener\MessageListListener
tags:
- { name: kernel.event_listener, event: theme.messages, method: onListMessages }
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/navbar_notifications.md
================================================
# The Navbar Notifications component
## Routes
Just like the other theme components, this one requires some route aliases to work.
Please refer to the [configurations overview](configurations.md) to learn about the route alias details.
## Required aliases
* all_notifications
* notification
## Data Model
In order to use this component, your user class has to implement the `KevinPapst\AdminLTEBundle\Model\NotificationInterface`
```php
<?php
namespace App\Model;
use KevinPapst\AdminLTEBundle\Model\NotificationInterface;
class NotificationModel implements NotificationInterface
{
// implement interface methods
}
```
The bundle provides the `NotificationModel` as a ready to use implementation of the `NotificationInterface`.
## EventSubscriber - auto-discovery with Symfony 4
In case you activated service discovery and auto-wiring in your app, you can write an EventSubscriber which will
be automatically registered in your container:
```php
<?php
// src/EventSubscriber/NotificationSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\NotificationListEvent;
use KevinPapst\AdminLTEBundle\Helper\Constants;
use KevinPapst\AdminLTEBundle\Model\NotificationModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class NotificationSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
NotificationListEvent::class => ['onNotifications', 100],
];
}
public function onNotifications(NotificationListEvent $event)
{
$notification = new NotificationModel();
$notification
->setId(1)
->setMessage('A demo message')
->setType(Constants::TYPE_SUCCESS)
->setIcon('far fa-envelope')
;
$event->addNotification($notification);
/*
* You can also set the total number of notifications which could be different from those displayed in the navbar
* If no total is set, the total will be calculated on the number of notifications added to the event
*/
$event->setTotal(15);
}
}
```
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Write an EventListener to work with the `NotificationListEvent`:
```php
<?php
// src/EventListener/NotificationListListener.php
namespace App\EventListener;
use KevinPapst\AdminLTEBundle\Event\NotificationListEvent;
use KevinPapst\AdminLTEBundle\Model\NotificationModel;
class NotificationListListener
{
public function onListNotifications(NotificationListEvent $event)
{
foreach($this->getNotifications() as $Notification) {
$event->addNotification($Notification);
}
}
protected function getNotifications()
{
// see above in NotificationSubscriber for a full example
return [new NotificationModel()];
}
}
```
And attach your new listener to the event system:
```yaml
services:
app.notification_list_listener:
class: App\EventListener\NotificationListListener
tags:
- { name: kernel.event_listener, event: theme.notifications, method: onListNotifications }
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/navbar_tasks.md
================================================
# The Navbar Tasks component
## Routes
Just like the other theme components, this one requires some route aliases to work.
Please refer to the [configurations overview](configurations.md) to learn about the route alias details.
### Required aliases
* all_task
* task
## Data Model
In order to use this component, your task class has to implement the `KevinPapst\AdminLTEBundle\Model\TaskInterface`
```php
<?php
namespace App\Model;
use KevinPapst\AdminLTEBundle\Model\TaskInterface;
class TaskModel implements TaskInterface
{
// implement interface methods
}
```
The bundle provides the `TaskModel` as a ready to use implementation of the `TaskInterface`.
## EventSubscriber - auto-discovery with Symfony 4
In case you activated service discovery and auto-wiring in your app, you can write an EventSubscriber which will
be automatically registered in your container:
```php
<?php
// src/EventSubscriber/TaskSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\TaskListEvent;
use KevinPapst\AdminLTEBundle\Helper\Constants;
use KevinPapst\AdminLTEBundle\Model\TaskModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class TaskSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
TaskListEvent::class => ['onTasks', 100],
];
}
public function onTasks(TaskListEvent $event)
{
$task = new TaskModel();
$task
->setId(1)
->setTitle('My task')
->setColor(Constants::COLOR_AQUA)
->setProgress(80)
;
$event->addTask($task);
/*
* You can also set the total number of tasks which could be different from those displayed in the navbar
* If no total is set, the total will be calculated on the number of tasks added to the event
*/
$event->setTotal(15);
}
}
```
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Write an EventListener to work with the `TaskListEvent`:
```php
<?php
// src/EventListener/TaskListListener.php
namespace App\EventListener;
use KevinPapst\AdminLTEBundle\Event\TaskListEvent;
use KevinPapst\AdminLTEBundle\Model\TaskModel;
class TaskListListener
{
public function onListTasks(TaskListEvent $event)
{
foreach($this->getTasks() as $task) {
$event->addTask($task);
}
}
protected function getTasks()
{
// see above in TaskSubscriber for a full example
return [new TaskModel()];
}
}
```
## Service definition
Finally, you need to attach your new listener to the event system:
```yaml
services:
app.task_list_listener:
class: App\EventListener\TaskListListener
tags:
- { name: kernel.event_listener, event: theme.tasks, method: onListTasks }
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/navbar_user.md
================================================
# The Navbar User component
## Routes
Just like the other theme components, this one requires some route aliases to work.
Please refer to the [configurations overview](configurations.md) to learn about the route alias details.
### Required aliases
* profile
* logout
## Data Model
In order to use this component, your user class has to implement the `KevinPapst\AdminLTEBundle\Model\UserInterface`
```php
<?php
namespace App\Model;
use KevinPapst\AdminLTEBundle\Model\UserInterface;
class UserModel implements UserInterface {
// ...
// implement interface methods
// ...
}
```
The bundle provides the `UserModel` as a ready to use implementation of the `UserInterface`.
## EventSubscriber - auto-discovery with Symfony 4
In case you activated service discovery and auto-wiring in your app, you can write an EventSubscriber which will
be automatically registered in your container:
```php
<?php
// src/EventSubscriber/NavbarUserSubscriber.php
namespace App\EventSubscriber;
use App\Entity\User;
use KevinPapst\AdminLTEBundle\Event\ShowUserEvent;
use KevinPapst\AdminLTEBundle\Event\NavbarUserEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarUserEvent;
use KevinPapst\AdminLTEBundle\Model\UserModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
class NavbarUserSubscriber implements EventSubscriberInterface
{
protected $security;
public function __construct(Security $security)
{
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
return [
NavbarUserEvent::class => ['onShowUser', 100],
SidebarUserEvent::class => ['onShowUser', 100],
];
}
public function onShowUser(ShowUserEvent $event)
{
if (null === $this->security->getUser()) {
return;
}
/* @var $myUser User */
$myUser = $this->security->getUser();
$user = new UserModel();
$user
->setId($myUser->getId())
->setName($myUser->getUsername())
->setUsername($myUser->getUsername())
->setIsOnline(true)
->setTitle('demo user')
->setAvatar($myUser->getAvatar())
->setMemberSince($myUser->getRegisteredAt())
;
$event->setUser($user);
}
}
```
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Write an EventListener to work with the `ShowUserEvent`:
```php
<?php
// src/EventListener/NavbarUserListener.php
namespace App\EventListener;
use KevinPapst\AdminLTEBundle\Event\ShowUserEvent;
use KevinPapst\AdminLTEBundle\Model\NavBarUserLink;
use KevinPapst\AdminLTEBundle\Model\UserModel;
class NavbarUserListener
{
public function onShowUser(ShowUserEvent $event)
{
$user = $this->getUser();
$event->setUser($user);
$event->setShowProfileLink(false);
$event->addLink(new NavBarUserLink('Followers', 'logout'));
$event->addLink(new NavBarUserLink('Sales', 'logout'));
$event->addLink(new NavBarUserLink('Friends', 'logout', ['id' => 2]));
}
protected function getUser()
{
// retrieve your concrete user model or entity
// see above in NavbarUserSubscriber for a full example
return new UserModel();
}
}
```
And attach your new listener to the event system:
```yaml
# config/services.yml
services:
my_admin_bundle.show_user_listener:
class: App\EventListener\NavbarUserListener
tags:
- { name: kernel.event_listener, event: theme.navbar_user, method: onShowUser }
```
## Customizing the HTML output
Considering you want to change the generated HTML of the user dropdown, you can simply overwrite the template.
Create the file `templates/bundles/AdminLTEBundle/Navbar/user.html.twig` and add your own HTML.
Or you can even replace some blocks inside the themes template by extending it:
```twig
{% extends "@!AdminLTE/Navbar/user.html.twig" %}
{% block member_since %}
{# I do not want to display the member since information #}
{% endblock %}
```
Right now, there is only the one block `member_since`, but if you need more: just drop a PR for new ones!
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/sidebar_navigation.md
================================================
# The Sidebar Navigation component
__*Notice* If you would rather use the KnpMenuBundle instead, please refer to the [integration guide][1].__
Although the `MenuItemInteface` as well as the `MenuItemModel` are designed to support an unlimited depth,
the sidebar menu is currently limited to two levels.
## Data Model
In order to use this component, your have to create a `MenuItemModel` class that implements `\KevinPapst\AdminLTEBundle\Model\MenuItemInterface`
```php
<?php
namespace App\Model;
use KevinPapst\AdminLTEBundle\Model\MenuItemInterface;
class MenuItemModel implements MenuItemInterface {
// ...
// implement interface methods
// ...
}
```
The bundle provides the `MenuItemModel` as a ready to use implementation of the `MenuItemInterface`.
You can use it to create a menu item:
```php
$menuItem = new \KevinPapst\AdminLTEBundle\Model\MenuItemModel('item', 'Item', 'item_route_name');
```
or a menu label:
```php
$menuLabel = new \KevinPapst\AdminLTEBundle\Model\MenuItemModel('label', 'Label', false);
```
## EventSubscriber - auto-discovery with Symfony 4
In case you activated service discovery and auto-wiring in your app, you can write an EventSubscriber which will
be automatically registered in your container:
```php
<?php
// src/EventSubscriber/MenuBuilderSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use KevinPapst\AdminLTEBundle\Model\MenuItemModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MenuBuilderSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
SidebarMenuEvent::class => ['onSetupMenu', 100],
];
}
public function onSetupMenu(SidebarMenuEvent $event)
{
$blog = new MenuItemModel('blogId', 'Blog', 'item_symfony_route', [], 'fas fa-tachometer-alt');
$blog->addChild(
new MenuItemModel('ChildOneItemId', 'ChildOneDisplayName', 'child_1_route', [], 'fas fa-rss-square')
)->addChild(
new MenuItemModel('ChildTwoItemId', 'ChildTwoDisplayName', 'child_2_route')
);
$event->addItem($blog);
$this->activateByRoute(
$event->getRequest()->get('_route'),
$event->getItems()
);
}
/**
* @param string $route
* @param MenuItemModel[] $items
*/
protected function activateByRoute($route, $items)
{
foreach ($items as $item) {
if ($item->hasChildren()) {
$this->activateByRoute($route, $item->getChildren());
} elseif ($item->getRoute() == $route) {
$item->setIsActive(true);
}
}
}
}
```
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Write an EventListener to work with the `SidebarMenuEvent`.
```php
<?php
// src/EventListener/MenuBuilderListener.php
namespace App\EventListener;
use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
use KevinPapst\AdminLTEBundle\Model\MenuItemModel;
use Symfony\Component\HttpFoundation\Request;
class MenuBuilderListener
{
public function onSetupMenu(SidebarMenuEvent $event)
{
$request = $event->getRequest();
foreach ($this->getMenu($request) as $item) {
$event->addItem($item);
}
}
protected function getMenu(Request $request)
{
$blog = new MenuItemModel('ItemId', 'ItemDisplayName', 'item_symfony_route', [], 'iconclasses fa fa-plane');
$blog->addChild(
new MenuItemModel('ChildOneItemId', 'ChildOneDisplayName', 'child_1_route', [], 'fa fa-rss-square')
)->addChild(
new MenuItemModel('ChildTwoItemId', 'ChildTwoDisplayName', 'child_2_route')
);
return $this->activateByRoute($request->get('_route'), [$blog]);
}
/**
* @param string $route
* @param MenuItemModel[] $items
* @return MenuItemModel[]
*/
protected function activateByRoute($route, $items)
{
foreach($items as $item) {
if($item->hasChildren()) {
$this->activateByRoute($route, $item->getChildren());
} elseif($item->getRoute() == $route) {
$item->setIsActive(true);
}
}
return $items;
}
}
```
And attach your new listener to the event system in `config/services.yaml`:
```yaml
services:
my_admin_bundle.menu_listener:
class: App\EventListener\MenuBuilderListener
tags:
- { name: kernel.event_listener, event: theme.sidebar_setup_menu, method: onSetupMenu }
```
## Translating menu items
You don't have to care about translating your menu items, simply use the translation key instead of the translated string.
The label of each menu item will be automatically displayed by applying the `|trans` filter:
```twig
{{ item.label|trans }}
```
The default translation domain `messages` will be used (see `Resources/views/Macros/menu.html.twig`).
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
[1]: knp_menu.md
================================================
FILE: Resources/docs/sidebar_user.md
================================================
# The Sidebar User component
This component uses the same setup as the [Navbar User](navbar_user.md) except for the event name it listens to.
## EventSubscriber - auto-discovery with Symfony 4
Edit the previously made class `NavbarUserSubscriber` and register it for another event:
```php
<?php
// src/EventSubscriber/NavbarUserSubscriber.php
namespace App\EventSubscriber;
use KevinPapst\AdminLTEBundle\Event\NavbarUserEvent;
use KevinPapst\AdminLTEBundle\Event\SidebarUserEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class NavbarUserSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
NavbarUserEvent::class => ['onShowUser', 100],
SidebarUserEvent::class => ['onShowUser', 100],
];
}
// ... the rest of the class follows here ...
}
```
## EventListener and Service definition
If your application is using the classical approach of manually registering Services and EventListener use this method.
Just add the following listener definition to the event system in `config/services.yaml` and you're good to go:
```yaml
services:
app.show_user_listener:
class: App\EventListener\NavbarUserListener
tags:
- { name: kernel.event_listener, event: theme.sidebar_user, method: onShowUser }
```
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
================================================
FILE: Resources/docs/twig_widgets.md
================================================
# Twig widgets
In order to simplify the usage of widget and info boxes, and to help with a consistent look and feel throughout your application,
the bundle provides an [embeddable][3] template for the [box-widget][1] and the [infobox-widget][2].
## Global configuration
The global/general configuration for the box-widget can be defined using the bundle configuration.
The values in this configuration example are the default settings.
```yaml
admin_lte:
theme:
widget:
# relates to box-<type>, default: primary
type: primary
# will add .with-border to .box-header, default: true
bordered: true
# will add a collapse button to the widget toolbar, default: true
collapsible: true
# sets the title attribute for the collapse button
collapsible_title: Collapse
# will ad a remove button to the widget toolbar
removable: false
# defines the title attribute for the remove button
removable_title: Remove
# will add .box-solid
solid: false
# will avoid rendering the .box-footer without content
use_footer: true
```
## box-widget.html.twig
```twig
{% embed '@AdminLTE/Widgets/box-widget.html.twig' %}
{% block box_title %}
{# Title goes here #}
{% endblock %}
{% block box_body %}
{# Content goes here #}
{% endblock %}
{% endembed %}
```
The box widget comes with several variables and blocks to define content and customize the rendering and behavior individually.
### Variables
_**Notice:** since FALSE will not be considered a value by Twig and therefor activate the default filter, you will have to use `0` instead.
<dl>
<dt>collapsed
<dd>Will render the Widget in a collapsed state and add and expander toolbutton.
<dt>solid
<dd>Will render the widget as solid box if set to true.
<dt>border
<dd>Will add .with-border to the box header.
<dt>use_footer
<dd>Will render the .box-footer even if it has no content.
<dt>collapsible & collapsible_title
<dd>Will add a collapse tool-button. This setting will always be true if the box is defined as `collapsed`. The `collapsible_title` will be set as the button's `title` attribute.
<dt>removable & removable_title
<dd>Will add a remove tool-button. The `removable_title` will be set as the button's `title` attribute.
<dt>boxtype
<dd>Sets the color-type of the box. The value should only be the type name without prefix.
</dl>
### Blocks
<dl>
<dt>box_before
<dd>Content just before the box's opening div.
<dt>box_title
<dd>Content inside of `.box-title`.
<dt>box_tools
<dd>Content inside the `.box-tools` just before the collapse and/or remove buttons.
<dt>box_body
<dd>The block for the actual box content.
<dt>box_footer
<dd>Content inside the `.box-footer`. Using this block will force the footer rendering, regardless of the `footer` variable or configuration setting.
<dt>box_after
<dd>Content just after the box's closing `div`
<dt>box_body_class
<dd>Additional css class for the box_body HTML element
<dt>box_attributes
<dd>Additional HTML attributes for the outer box HTML element
<dt>box_tools_attributes
<dd>Additional attributes for the tools HTML element
</dl>
## infobox-widget
The infobox widget has no default configuration. The very nature of this widget type is to be distinguishable from each other hence, the configuration would be overridden anyways.
```twig
{% embed '@AdminLTE/Widgets/infobox-widget.html.twig' with {
'color' : 'aqua',
'icon' : 'comments-o',
}%}
{% block box_text %}
{# text goes here #}
{% endblock %}
{% block box_number %}
{# number goes here #}
{% endblock %}
{% block progress_description %}
{# progress text goes here#}
{% endblock %}
{% endembed %}
```
### Variables
<dl>
<dt>solid
<dd>If you want to define a solid box, this variable should contain the color name.
<dt>color
<dd>Defines the `.info-box-icon` color and should be the color name (obsolete if you have a `solid` box).
<dt>icon
<dd>Defines the fontawesome icon name. The value should only be the actual icon name including the prefix (e.g. `fas fa-tachometer-alt`)
<dt>progress
<dd>Defines the progress value. The progress bar will only be rendered if the progress variable is defined.
</dl>
### Blocks
<dl>
<dt>box_before
<dd>Content just before the opening `div`.
<dt>box_text
<dd>Content of `.info-box-text`.
<dt>box_number
<dd>Content of `.info-box-number`.
<dt>progress_description
<dd>Content of `.progress_description`.
<dt>box_after
<dd>Content just after the closing `div`
</dl>
## Next steps
Please go back to the [AdminLTE bundle documentation](README.md) to find out more about using the theme.
[1]: https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html#component-box
[2]: https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html#component-info-box
[3]: http://twig.sensiolabs.org/doc/tags/embed.html
================================================
FILE: Resources/public/adminlte.css
================================================
@charset "UTF-8";.daterangepicker{position:absolute;color:inherit;background-color:#fff;border-radius:4px;border:1px solid #ddd;width:278px;max-width:none;padding:0;margin-top:7px;top:100px;left:20px;z-index:3001;display:none;font-family:arial;font-size:15px;line-height:1em}.daterangepicker:after,.daterangepicker:before{position:absolute;display:inline-block;border-bottom-color:rgba(0,0,0,.2);content:""}.daterangepicker:before{top:-7px;border-right:7px solid transparent;border-left:7px solid transparent;border-bottom:7px solid #ccc}.daterangepicker:after{top:-6px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker.opensleft:before{right:9px}.daterangepicker.opensleft:after{right:10px}.daterangepicker.openscenter:after,.daterangepicker.openscenter:before{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.daterangepicker.opensright:before{left:9px}.daterangepicker.opensright:after{left:10px}.daterangepicker.drop-up{margin-top:-7px}.daterangepicker.drop-up:before{top:auto;bottom:-7px;border-bottom:initial;border-top:7px solid #ccc}.daterangepicker.drop-up:after{top:auto;bottom:-6px;border-bottom:initial;border-top:6px solid #fff}.daterangepicker.single .daterangepicker .ranges,.daterangepicker.single .drp-calendar{float:none}.daterangepicker.single .drp-selected{display:none}.daterangepicker.show-calendar .drp-buttons,.daterangepicker.show-calendar .drp-calendar{display:block}.daterangepicker.auto-apply .drp-buttons{display:none}.daterangepicker .drp-calendar{display:none;max-width:270px}.daterangepicker .drp-calendar.left{padding:8px 0 8px 8px}.daterangepicker .drp-calendar.right{padding:8px}.daterangepicker .drp-calendar.single .calendar-table{border:none}.daterangepicker .calendar-table .next span,.daterangepicker .calendar-table .prev span{color:#fff;border:solid #000;border-width:0 2px 2px 0;border-radius:0;display:inline-block;padding:3px}.daterangepicker .calendar-table .next span{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}.daterangepicker .calendar-table .prev span{transform:rotate(135deg);-webkit-transform:rotate(135deg)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{text-align:center;vertical-align:middle;min-width:32px;width:32px;height:24px;line-height:24px;font-size:12px;border-radius:4px;border:1px solid transparent;white-space:nowrap;cursor:pointer}.daterangepicker .calendar-table{border:1px solid #fff;border-radius:4px;background-color:#fff}.daterangepicker .calendar-table table{width:100%;margin:0;border-spacing:0;border-collapse:collapse}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background-color:#eee;border-color:transparent;color:inherit}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{background-color:#fff;border-color:transparent;color:#999}.daterangepicker td.in-range{background-color:#ebf4f8;border-color:transparent;color:#000;border-radius:0}.daterangepicker td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#357ebd;border-color:transparent;color:#fff}.daterangepicker th.month{width:auto}.daterangepicker option.disabled,.daterangepicker td.disabled{color:#999;cursor:not-allowed;text-decoration:line-through}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect,.daterangepicker select.secondselect{width:50px;margin:0 auto;background:#eee;border:1px solid #eee;padding:2px;outline:0;font-size:12px}.daterangepicker .calendar-time{text-align:center;margin:4px auto 0;line-height:30px;position:relative}.daterangepicker .calendar-time select.disabled{color:#ccc;cursor:not-allowed}.daterangepicker .drp-buttons{clear:both;text-align:right;padding:8px;border-top:1px solid #ddd;display:none;line-height:12px;vertical-align:middle}.daterangepicker .drp-selected{display:inline-block;font-size:12px;padding-right:8px}.daterangepicker .drp-buttons .btn{margin-left:8px;font-size:12px;font-weight:700;padding:4px 8px}.daterangepicker.show-ranges.single.rtl .drp-calendar.left{border-right:1px solid #ddd}.daterangepicker.show-ranges.single.ltr .drp-calendar.left{border-left:1px solid #ddd}.daterangepicker.show-ranges.rtl .drp-calendar.right{border-right:1px solid #ddd}.daterangepicker.show-ranges.ltr .drp-calendar.left{border-left:1px solid #ddd}.daterangepicker .ranges{float:none;text-align:left;margin:0}.daterangepicker.show-calendar .ranges{margin-top:8px}.daterangepicker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.daterangepicker .ranges li{font-size:12px;padding:8px 12px;cursor:pointer}.daterangepicker .ranges li:hover{background-color:#eee}.daterangepicker .ranges li.active{background-color:#08c;color:#fff}@media (min-width:564px){.daterangepicker{width:auto}.daterangepicker .ranges ul{width:140px}.daterangepicker.single .ranges ul{width:100%}.daterangepicker.single .drp-calendar.left{clear:none}.daterangepicker.single .drp-calendar,.daterangepicker.single .ranges{float:left}.daterangepicker{direction:ltr;text-align:left}.daterangepicker .drp-calendar.left{clear:left;margin-right:0}.daterangepicker .drp-calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.daterangepicker .drp-calendar.right{margin-left:0}.daterangepicker .drp-calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.daterangepicker .drp-calendar.left .calendar-table{padding-right:8px}.daterangepicker .drp-calendar,.daterangepicker .ranges{float:left}}@media (min-width:730px){.daterangepicker .ranges{width:auto;float:left}.daterangepicker.rtl .ranges{float:right}.daterangepicker .drp-calendar.left{clear:none!important}}
/*!
* Bootstrap-select v1.13.18 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2020 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/@-webkit-keyframes bs-notify-fadeOut{0%{opacity:.9}to{opacity:0}}@-o-keyframes bs-notify-fadeOut{0%{opacity:.9}to{opacity:0}}@keyframes bs-notify-fadeOut{0%{opacity:.9}to{opacity:0}}.bootstrap-select>select.bs-select-hidden,select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px\0;vertical-align:middle}.bootstrap-select>.dropdown-toggle{position:relative;width:100%;text-align:right;white-space:nowrap;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.bootstrap-select>.dropdown-toggle:after{margin-top:-1px}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:hover{color:hsla(0,0%,100%,.5)}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none;z-index:0!important}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2!important}.bootstrap-select.is-invalid .dropdown-toggle,.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle,.was-validated .bootstrap-select select:invalid+.dropdown-toggle{border-color:#b94a48}.bootstrap-select.is-valid .dropdown-toggle,.was-validated .bootstrap-select select:valid+.dropdown-toggle{border-color:#28a745}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus,.bootstrap-select>select.mobile-device:focus+.dropdown-toggle{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none;height:auto}:not(.input-group)>.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{float:none;z-index:auto}.form-inline .bootstrap-select,.form-inline .bootstrap-select.form-control:not([class*=col-]){width:auto}.bootstrap-select:not(.input-group-btn),.bootstrap-select[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.dropdown-menu-right,.bootstrap-select[class*=col-].dropdown-menu-right,.row .bootstrap-select[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select,.form-horizontal .bootstrap-select,.form-inline .bootstrap-select{margin-bottom:0}.form-group-lg .bootstrap-select.form-control,.form-group-sm .bootstrap-select.form-control{padding:0}.form-group-lg .bootstrap-select.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-lg .dropdown-toggle,.bootstrap-select.form-control-sm .dropdown-toggle{font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle{padding:.25rem .5rem}.bootstrap-select.form-control-lg .dropdown-toggle{padding:.5rem 1rem}.form-inline .bootstrap-select .form-control{width:100%}.bootstrap-select.disabled,.bootstrap-select>.disabled{cursor:not-allowed}.bootstrap-select.disabled:focus,.bootstrap-select>.disabled:focus{outline:0!important}.bootstrap-select.bs-container{position:absolute;top:0;left:0;height:0!important;padding:0!important}.bootstrap-select.bs-container .dropdown-menu{z-index:1060}.bootstrap-select .dropdown-toggle .filter-option{position:static;top:0;left:0;float:left;height:100%;width:100%;text-align:left;overflow:hidden;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.bs3.bootstrap-select .dropdown-toggle .filter-option{padding-right:inherit}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option{position:absolute;padding-top:inherit;padding-bottom:inherit;padding-left:inherit;float:none}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner{padding-right:inherit}.bootstrap-select .dropdown-toggle .filter-option-inner-inner{overflow:hidden}.bootstrap-select .dropdown-toggle .filter-expand{width:0!important;float:left;opacity:0!important;overflow:hidden}.bootstrap-select .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.input-group .bootstrap-select.form-control .dropdown-toggle{border-radius:inherit}.bootstrap-select[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu>.inner:focus{outline:0!important}.bootstrap-select .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select .dropdown-menu li{position:relative}.bootstrap-select .dropdown-menu li.active small{color:hsla(0,0%,100%,.5)!important}.bootstrap-select .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select .dropdown-menu li a span.check-mark{display:none}.bootstrap-select .dropdown-menu li a span.text{display:inline-block}.bootstrap-select .dropdown-menu li small{padding-left:.5em}.bootstrap-select .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu .notify.fadeOut{-webkit-animation:bs-notify-fadeOut .3s linear .75s forwards;-o-animation:.3s linear .75s forwards bs-notify-fadeOut;animation:bs-notify-fadeOut .3s linear .75s forwards}.bootstrap-select .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.fit-width .dropdown-toggle .filter-option{position:static;display:inline;padding:0}.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner{display:inline}.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before{content:"\00a0"}.bootstrap-select.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark{position:absolute;display:inline-block;right:15px;top:5px}.bootstrap-select.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select .bs-ok-default:after{content:"";display:block;width:.5em;height:1em;border-style:solid;border-width:0 .26em .26em 0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before{content:"";border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid hsla(0,0%,80%,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after{content:"";border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before{bottom:auto;top:-4px;border-top:7px solid hsla(0,0%,80%,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after{bottom:auto;top:-4px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none}
/*!
* Bootstrap v3.4.1 (https://getbootstrap.com/)
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:Glyphicons Halflings;src:url(/bundles/adminlte/fonts/glyphicons-halflings-regular.eot?5be1347c);src:url(/bundles/adminlte/fonts/glyphicons-halflings-regular.eot?5be1347c?#iefix) format("embedded-opentype"),url(/bundles/adminlte/fonts/glyphicons-halflings-regular.woff2?be810be3) format("woff2"),url(/bundles/adminlte/fonts/glyphicons-halflings-regular.woff?82b1212e) format("woff"),url(/bundles/adminlte/fonts/glyphicons-halflings-regular.ttf?4692b9ec) format("truetype"),url(/bundles/adminlte/images/glyphicons-halflings-regular.svg?060b2710#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:Glyphicons Halflings;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphico
gitextract_6dcvqnm8/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CONTRIBUTING.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ └── linting.yaml ├── .gitignore ├── .php_cs ├── AdminLTEBundle.php ├── CONTRIBUTING.md ├── Controller/ │ ├── BreadcrumbController.php │ ├── EmitterController.php │ ├── NavbarController.php │ └── SidebarController.php ├── DependencyInjection/ │ ├── AdminLTEExtension.php │ ├── Compiler/ │ │ └── TwigPass.php │ └── Configuration.php ├── Event/ │ ├── BreadcrumbMenuEvent.php │ ├── KnpMenuEvent.php │ ├── MenuEvent.php │ ├── MessageListEvent.php │ ├── NavbarUserEvent.php │ ├── NotificationListEvent.php │ ├── ShowUserEvent.php │ ├── SidebarMenuEvent.php │ ├── SidebarUserEvent.php │ ├── TaskListEvent.php │ ├── ThemeEvent.php │ └── ThemeEvents.php ├── Helper/ │ ├── Constants.php │ └── ContextHelper.php ├── LICENSE ├── Menu/ │ └── MenuBuilder.php ├── Model/ │ ├── MenuItemInterface.php │ ├── MenuItemModel.php │ ├── MessageInterface.php │ ├── MessageModel.php │ ├── NavBarUserLink.php │ ├── NotificationInterface.php │ ├── NotificationModel.php │ ├── TaskInterface.php │ ├── TaskModel.php │ ├── UserDetailsInterface.php │ ├── UserInterface.php │ └── UserModel.php ├── README.md ├── Repository/ │ ├── MessageRepositoryInterface.php │ ├── NotificationRepositoryInterface.php │ └── TaskRepositoryInterface.php ├── Resources/ │ ├── assets/ │ │ ├── admin-lte-extensions.scss │ │ ├── admin-lte.js │ │ └── admin-lte.scss │ ├── config/ │ │ ├── container/ │ │ │ └── knp-menu.yml │ │ └── services.yml │ ├── docs/ │ │ ├── README.md │ │ ├── breadcrumbs.md │ │ ├── bundle_options.md │ │ ├── component_events.md │ │ ├── configurations.md │ │ ├── control_sidebar.md │ │ ├── extend_webpack_encore.md │ │ ├── form_theme.md │ │ ├── fos_userbundle.md │ │ ├── frontend_assets.md │ │ ├── knp_menu.md │ │ ├── layout.md │ │ ├── migration_guide.md │ │ ├── navbar_messages.md │ │ ├── navbar_notifications.md │ │ ├── navbar_tasks.md │ │ ├── navbar_user.md │ │ ├── sidebar_navigation.md │ │ ├── sidebar_user.md │ │ └── twig_widgets.md │ ├── public/ │ │ ├── adminlte.css │ │ ├── adminlte.js │ │ ├── adminlte.js.LICENSE.txt │ │ ├── entrypoints.json │ │ └── manifest.json │ ├── translations/ │ │ ├── AdminLTEBundle.ar.xliff │ │ ├── AdminLTEBundle.cs.xliff │ │ ├── AdminLTEBundle.da.xliff │ │ ├── AdminLTEBundle.de.xliff │ │ ├── AdminLTEBundle.el.xliff │ │ ├── AdminLTEBundle.en.xliff │ │ ├── AdminLTEBundle.eo.xliff │ │ ├── AdminLTEBundle.es.xliff │ │ ├── AdminLTEBundle.eu.xliff │ │ ├── AdminLTEBundle.fi.xliff │ │ ├── AdminLTEBundle.fr.xliff │ │ ├── AdminLTEBundle.he.xliff │ │ ├── AdminLTEBundle.hr.xliff │ │ ├── AdminLTEBundle.it.xliff │ │ ├── AdminLTEBundle.ja.xliff │ │ ├── AdminLTEBundle.nl.xliff │ │ ├── AdminLTEBundle.pl.xliff │ │ ├── AdminLTEBundle.pt_BR.xliff │ │ ├── AdminLTEBundle.ro.xliff │ │ ├── AdminLTEBundle.ru.xliff │ │ ├── AdminLTEBundle.sk.xliff │ │ ├── AdminLTEBundle.sv.xliff │ │ ├── AdminLTEBundle.tr.xliff │ │ └── AdminLTEBundle.zh_CN.xliff │ └── views/ │ ├── Breadcrumb/ │ │ ├── breadcrumb.html.twig │ │ └── knp-breadcrumb.html.twig │ ├── Exception/ │ │ └── exception_full.html.twig │ ├── FOSUserBundle/ │ │ ├── Registration/ │ │ │ ├── confirmed.html.twig │ │ │ └── register.html.twig │ │ ├── Resetting/ │ │ │ └── request.html.twig │ │ ├── Security/ │ │ │ └── login.html.twig │ │ └── layout.html.twig │ ├── Macros/ │ │ ├── buttons.html.twig │ │ ├── default.html.twig │ │ └── menu.html.twig │ ├── Navbar/ │ │ ├── messages.html.twig │ │ ├── notifications.html.twig │ │ ├── tasks.html.twig │ │ └── user.html.twig │ ├── Partials/ │ │ ├── _control-sidebar.html.twig │ │ ├── _flash_messages.html.twig │ │ ├── _footer.html.twig │ │ └── _menu.html.twig │ ├── Sidebar/ │ │ ├── knp-menu.html.twig │ │ ├── menu.html.twig │ │ ├── search-form.html.twig │ │ └── user-panel.html.twig │ ├── Widgets/ │ │ ├── box-widget.html.twig │ │ └── infobox-widget.html.twig │ └── layout/ │ ├── default-layout-avanzu.html.twig │ ├── default-layout.html.twig │ ├── form-theme-base.html.twig │ ├── form-theme-horizontal.html.twig │ ├── form-theme-security.html.twig │ ├── form-theme.html.twig │ ├── login-layout-avanzu.html.twig │ └── security-layout.html.twig ├── Tests/ │ ├── Controller/ │ │ └── NavbarControllerTest.php │ ├── DependencyInjection/ │ │ └── ConfigurationTest.php │ ├── Event/ │ │ ├── MessageListEventTest.php │ │ ├── NotificationListEventTest.php │ │ └── TaskListEventTest.php │ ├── Helper/ │ │ └── ContextHelperTest.php │ ├── Model/ │ │ ├── MessageModelTest.php │ │ ├── NotificationModelTest.php │ │ ├── TaskModelTest.php │ │ └── UserModelTest.php │ ├── Twig/ │ │ ├── AdminExtensionTest.php │ │ └── RuntimeExtensionTest.php │ └── phpstan.neon ├── Twig/ │ ├── AdminExtension.php │ ├── EventsExtension.php │ └── RuntimeExtension.php ├── UPGRADING.md ├── composer.json ├── config/ │ └── packages/ │ └── admin_lte.yaml ├── package.json ├── phpstan.neon ├── phpunit.xml.dist └── webpack.config.js
SYMBOL INDEX (773 symbols across 54 files)
FILE: AdminLTEBundle.php
class AdminLTEBundle (line 16) | class AdminLTEBundle extends Bundle
method build (line 18) | public function build(ContainerBuilder $container)
FILE: Controller/BreadcrumbController.php
class BreadcrumbController (line 21) | class BreadcrumbController extends EmitterController
method breadcrumbAction (line 33) | public function breadcrumbAction(Request $request): Response
FILE: Controller/EmitterController.php
class EmitterController (line 16) | class EmitterController extends AbstractController
method __construct (line 23) | public function __construct(EventDispatcherInterface $dispatcher)
method dispatch (line 28) | protected function dispatch(Event $event): Event
method hasListener (line 36) | protected function hasListener(string $eventName): bool
FILE: Controller/NavbarController.php
class NavbarController (line 21) | class NavbarController extends EmitterController
method __construct (line 28) | public function __construct(EventDispatcherInterface $dispatcher, Cont...
method notificationsAction (line 38) | public function notificationsAction($max = null): Response
method messagesAction (line 66) | public function messagesAction($max = null): Response
method tasksAction (line 94) | public function tasksAction($max = null): Response
method userAction (line 121) | public function userAction(): Response
FILE: Controller/SidebarController.php
class SidebarController (line 18) | final class SidebarController extends EmitterController
method userPanelAction (line 20) | public function userPanelAction(): Response
method searchFormAction (line 39) | public function searchFormAction(): Response
method menuAction (line 46) | public function menuAction(Request $request): Response
FILE: DependencyInjection/AdminLTEExtension.php
class AdminLTEExtension (line 23) | class AdminLTEExtension extends Extension implements PrependExtensionInt...
method load (line 28) | public function load(array $configs, ContainerBuilder $container)
method getContextOptions (line 53) | protected function getContextOptions(array $config = [])
method prepend (line 74) | public function prepend(ContainerBuilder $container)
FILE: DependencyInjection/Compiler/TwigPass.php
class TwigPass (line 19) | class TwigPass implements CompilerPassInterface
method process (line 26) | public function process(ContainerBuilder $container)
FILE: DependencyInjection/Configuration.php
class Configuration (line 21) | class Configuration implements ConfigurationInterface
method getConfigTreeBuilder (line 26) | public function getConfigTreeBuilder()
method getRouteAliasesConfig (line 45) | private function getRouteAliasesConfig()
method getKnpMenuConfig (line 108) | private function getKnpMenuConfig()
method getWidgetConfig (line 135) | private function getWidgetConfig()
method getButtonConfig (line 182) | private function getButtonConfig()
method getThemeConfig (line 205) | private function getThemeConfig()
method getOptionsConfig (line 222) | private function getOptionsConfig()
method getControlSidebarConfig (line 285) | private function getControlSidebarConfig()
FILE: Event/BreadcrumbMenuEvent.php
class BreadcrumbMenuEvent (line 16) | class BreadcrumbMenuEvent extends SidebarMenuEvent
FILE: Event/KnpMenuEvent.php
class KnpMenuEvent (line 18) | class KnpMenuEvent extends ThemeEvent
method __construct (line 43) | public function __construct($menu, $factory, $options = [], $childOpti...
method getMenu (line 54) | public function getMenu()
method getFactory (line 62) | public function getFactory()
method getOptions (line 70) | public function getOptions()
method getChildOptions (line 78) | public function getChildOptions()
FILE: Event/MenuEvent.php
class MenuEvent (line 19) | abstract class MenuEvent extends ThemeEvent
method __construct (line 33) | public function __construct(Request $request = null)
method getRequest (line 41) | public function getRequest(): ?Request
method getItems (line 49) | public function getItems(): array
method addItem (line 58) | public function addItem($item)
method removeItem (line 69) | public function removeItem($item): MenuEvent
method getRootItem (line 84) | public function getRootItem($id)
method getActive (line 92) | public function getActive()
FILE: Event/MessageListEvent.php
class MessageListEvent (line 18) | class MessageListEvent extends ThemeEvent implements MessageRepositoryIn...
method __construct (line 42) | public function __construct($max = null)
method getMax (line 52) | public function getMax()
method getMessages (line 62) | public function getMessages()
method addMessage (line 78) | public function addMessage(MessageInterface $messageInterface)
method getTotal (line 90) | public function getTotal()
method setTotal (line 98) | public function setTotal($totalMessages)
FILE: Event/NavbarUserEvent.php
class NavbarUserEvent (line 12) | class NavbarUserEvent extends ShowUserEvent
FILE: Event/NotificationListEvent.php
class NotificationListEvent (line 18) | class NotificationListEvent extends ThemeEvent implements NotificationRe...
method __construct (line 38) | public function __construct($max = null)
method getMax (line 48) | public function getMax()
method getNotifications (line 56) | public function getNotifications()
method addNotification (line 70) | public function addNotification(NotificationInterface $notificationInt...
method setTotal (line 80) | public function setTotal($total)
method getTotal (line 88) | public function getTotal()
FILE: Event/ShowUserEvent.php
class ShowUserEvent (line 19) | abstract class ShowUserEvent extends ThemeEvent implements UserDetailsIn...
method setUser (line 42) | public function setUser($user)
method getUser (line 52) | public function getUser(): ?UserInterface
method getLinks (line 60) | public function getLinks(): array
method addLink (line 69) | public function addLink(NavBarUserLink $link)
method isShowProfileLink (line 79) | public function isShowProfileLink(): bool
method setShowProfileLink (line 88) | public function setShowProfileLink(bool $showProfileLink)
method isShowLogoutLink (line 98) | public function isShowLogoutLink(): bool
method setShowLogoutLink (line 107) | public function setShowLogoutLink(bool $showLogoutLink)
FILE: Event/SidebarMenuEvent.php
class SidebarMenuEvent (line 12) | class SidebarMenuEvent extends MenuEvent
FILE: Event/SidebarUserEvent.php
class SidebarUserEvent (line 12) | class SidebarUserEvent extends ShowUserEvent
FILE: Event/TaskListEvent.php
class TaskListEvent (line 18) | class TaskListEvent extends ThemeEvent implements TaskRepositoryInterface
method __construct (line 38) | public function __construct($max = null)
method getMax (line 48) | public function getMax()
method getTasks (line 56) | public function getTasks()
method addTask (line 70) | public function addTask(TaskInterface $taskInterface)
method setTotal (line 82) | public function setTotal($total)
method getTotal (line 92) | public function getTotal()
FILE: Event/ThemeEvent.php
class ThemeEvent (line 17) | class ThemeEvent extends Event
FILE: Event/ThemeEvents.php
type ThemeEvents (line 16) | interface ThemeEvents
FILE: Helper/Constants.php
type Constants (line 12) | interface Constants
FILE: Helper/ContextHelper.php
class ContextHelper (line 12) | class ContextHelper extends \ArrayObject
method getOptions (line 17) | public function getOptions(): array
method setOption (line 27) | public function setOption(string $name, $value): ContextHelper
method hasOption (line 38) | public function hasOption(string $name): bool
method getOption (line 48) | public function getOption(string $name, $default = null)
FILE: Menu/MenuBuilder.php
class MenuBuilder (line 16) | class MenuBuilder
method __construct (line 32) | public function __construct(FactoryInterface $factory, EventDispatcher...
method createMainMenu (line 38) | public function createMainMenu(array $options)
FILE: Model/MenuItemInterface.php
type MenuItemInterface (line 15) | interface MenuItemInterface
method getIdentifier (line 20) | public function getIdentifier();
method getLabel (line 25) | public function getLabel();
method getRoute (line 30) | public function getRoute();
method isActive (line 35) | public function isActive();
method setIsActive (line 40) | public function setIsActive($isActive);
method hasChildren (line 45) | public function hasChildren();
method getChildren (line 50) | public function getChildren();
method addChild (line 55) | public function addChild(MenuItemInterface $child);
method removeChild (line 60) | public function removeChild(MenuItemInterface $child);
method getIcon (line 65) | public function getIcon();
method getBadge (line 70) | public function getBadge();
method getBadgeColor (line 75) | public function getBadgeColor();
method getParent (line 80) | public function getParent();
method hasParent (line 85) | public function hasParent();
method setParent (line 90) | public function setParent(MenuItemInterface $parent = null);
method getActiveChild (line 95) | public function getActiveChild();
FILE: Model/MenuItemModel.php
class MenuItemModel (line 15) | class MenuItemModel implements MenuItemInterface
method __construct (line 74) | public function __construct(
method getBadge (line 95) | public function getBadge()
method setBadge (line 105) | public function setBadge($badge)
method getChildren (line 115) | public function getChildren()
method setChildren (line 123) | public function setChildren($children)
method getIcon (line 131) | public function getIcon()
method setIcon (line 141) | public function setIcon($icon)
method getIdentifier (line 151) | public function getIdentifier()
method setIdentifier (line 161) | public function setIdentifier($identifier)
method getIsActive (line 171) | public function getIsActive()
method setIsActive (line 181) | public function setIsActive($isActive)
method hasParent (line 195) | public function hasParent()
method getParent (line 203) | public function getParent()
method setParent (line 213) | public function setParent(MenuItemInterface $parent = null)
method getLabel (line 223) | public function getLabel()
method setLabel (line 233) | public function setLabel($label)
method getRoute (line 243) | public function getRoute()
method setRoute (line 253) | public function setRoute($route)
method getRouteArgs (line 263) | public function getRouteArgs()
method setRouteArgs (line 273) | public function setRouteArgs($routeArgs)
method hasChildren (line 283) | public function hasChildren()
method addChild (line 293) | public function addChild(MenuItemInterface $child)
method removeChild (line 306) | public function removeChild(MenuItemInterface $child)
method getBadgeColor (line 318) | public function getBadgeColor()
method setBadgeColor (line 328) | public function setBadgeColor($badgeColor)
method getActiveChild (line 338) | public function getActiveChild()
method isActive (line 352) | public function isActive()
FILE: Model/MessageInterface.php
type MessageInterface (line 15) | interface MessageInterface
method getFrom (line 22) | public function getFrom();
method getSentAt (line 29) | public function getSentAt();
method getSubject (line 36) | public function getSubject();
method getIdentifier (line 43) | public function getIdentifier();
FILE: Model/MessageModel.php
class MessageModel (line 12) | class MessageModel implements MessageInterface
method __construct (line 45) | public function __construct(UserInterface $from = null, $subject = '',...
method getId (line 56) | public function getId()
method setId (line 65) | public function setId($id): MessageModel
method setFrom (line 78) | public function setFrom(UserInterface $from): MessageModel
method getFrom (line 90) | public function getFrom()
method setSentAt (line 102) | public function setSentAt(\DateTime $sentAt): MessageModel
method getSentAt (line 114) | public function getSentAt(): \DateTime
method setSubject (line 125) | public function setSubject($subject): MessageModel
method getSubject (line 137) | public function getSubject()
method setTo (line 148) | public function setTo(UserInterface $to): MessageModel
method getTo (line 160) | public function getTo()
method getIdentifier (line 170) | public function getIdentifier()
FILE: Model/NavBarUserLink.php
class NavBarUserLink (line 12) | class NavBarUserLink
method __construct (line 32) | public function __construct($title, $path, $parameters = [])
method getTitle (line 42) | public function getTitle()
method setTitle (line 50) | public function setTitle($title)
method getPath (line 58) | public function getPath()
method setPath (line 66) | public function setPath($path)
method getParameters (line 74) | public function getParameters()
method setParameters (line 82) | public function setParameters($parameters)
FILE: Model/NotificationInterface.php
type NotificationInterface (line 12) | interface NotificationInterface
method getMessage (line 17) | public function getMessage();
method getType (line 22) | public function getType();
method getIcon (line 27) | public function getIcon();
method getIdentifier (line 32) | public function getIdentifier();
FILE: Model/NotificationModel.php
class NotificationModel (line 14) | class NotificationModel implements NotificationInterface
method __construct (line 38) | public function __construct($message = null, $type = Constants::TYPE_I...
method getId (line 48) | public function getId()
method setId (line 57) | public function setId($id)
method setMessage (line 69) | public function setMessage($message)
method getMessage (line 79) | public function getMessage()
method setType (line 89) | public function setType($type)
method getType (line 99) | public function getType()
method setIcon (line 109) | public function setIcon($icon)
method getIcon (line 119) | public function getIcon()
method getIdentifier (line 127) | public function getIdentifier()
FILE: Model/TaskInterface.php
type TaskInterface (line 12) | interface TaskInterface
method getColor (line 17) | public function getColor();
method getProgress (line 22) | public function getProgress();
method getTitle (line 27) | public function getTitle();
method getIdentifier (line 32) | public function getIdentifier();
FILE: Model/TaskModel.php
class TaskModel (line 14) | class TaskModel implements TaskInterface
method __construct (line 41) | public function __construct($title = null, $progress = 0, $color = Con...
method getId (line 51) | public function getId()
method setId (line 60) | public function setId($id)
method setColor (line 72) | public function setColor($color)
method getColor (line 82) | public function getColor()
method setProgress (line 92) | public function setProgress($progress)
method getProgress (line 102) | public function getProgress()
method setTitle (line 112) | public function setTitle($title)
method getTitle (line 122) | public function getTitle()
method getIdentifier (line 130) | public function getIdentifier()
FILE: Model/UserDetailsInterface.php
type UserDetailsInterface (line 12) | interface UserDetailsInterface
method getLinks (line 17) | public function getLinks(): array;
method getUser (line 19) | public function getUser(): ?UserInterface;
method isShowProfileLink (line 21) | public function isShowProfileLink(): bool;
method isShowLogoutLink (line 23) | public function isShowLogoutLink(): bool;
FILE: Model/UserInterface.php
type UserInterface (line 12) | interface UserInterface
method getAvatar (line 17) | public function getAvatar();
method getUsername (line 22) | public function getUsername();
method getName (line 27) | public function getName();
method getMemberSince (line 32) | public function getMemberSince();
method isOnline (line 37) | public function isOnline();
method getIdentifier (line 42) | public function getIdentifier();
method getTitle (line 47) | public function getTitle();
FILE: Model/UserModel.php
class UserModel (line 12) | class UserModel implements UserInterface
method __construct (line 57) | public function __construct($username = '', $avatar = '', $memberSince...
method getId (line 70) | public function getId()
method setId (line 79) | public function setId($id)
method setAvatar (line 91) | public function setAvatar($avatar)
method getAvatar (line 101) | public function getAvatar()
method setIsOnline (line 111) | public function setIsOnline($isOnline)
method getIsOnline (line 121) | public function getIsOnline()
method setMemberSince (line 131) | public function setMemberSince(\DateTime $memberSince)
method getMemberSince (line 141) | public function getMemberSince()
method setUsername (line 151) | public function setUsername($username)
method getUsername (line 161) | public function getUsername()
method setName (line 171) | public function setName($name)
method getName (line 181) | public function getName()
method setTitle (line 191) | public function setTitle($title)
method getTitle (line 201) | public function getTitle()
method isOnline (line 209) | public function isOnline()
method getIdentifier (line 217) | public function getIdentifier()
FILE: Repository/MessageRepositoryInterface.php
type MessageRepositoryInterface (line 14) | interface MessageRepositoryInterface
method getTotal (line 19) | public function getTotal();
method getMessages (line 24) | public function getMessages();
FILE: Repository/NotificationRepositoryInterface.php
type NotificationRepositoryInterface (line 14) | interface NotificationRepositoryInterface
method getTotal (line 19) | public function getTotal();
method getNotifications (line 24) | public function getNotifications();
FILE: Repository/TaskRepositoryInterface.php
type TaskRepositoryInterface (line 14) | interface TaskRepositoryInterface
method getTotal (line 19) | public function getTotal();
method getTasks (line 24) | public function getTasks();
FILE: Resources/public/adminlte.js
function t (line 2) | function t(t,n){if(this.element=t,this.options=n,this.$overlay=e(n.overl...
function s (line 2) | function s(s){return this.each((function(){var a=e(this),r=a.data(n);if(...
function t (line 2) | function t(e,t){this.element=e,this.options=t,this._setUpListeners()}
function l (line 2) | function l(s){return this.each((function(){var a=e(this),r=a.data(n);if(...
function t (line 2) | function t(e,t){this.element=e,this.options=t,this.hasBindedResize=!1,th...
function l (line 2) | function l(s){return this.each((function(){var a=e(this),r=a.data(n);if(...
function t (line 2) | function t(e){this.element=e}
function i (line 2) | function i(i){return this.each((function(){var s=e(this),a=s.data(n);a||...
function t (line 2) | function t(e){this.options=e,this.init()}
function c (line 2) | function c(s){return this.each((function(){var a=e(this),r=a.data(n);if(...
function t (line 2) | function t(e,t){this.element=e,this.options=t,this._setUpListeners()}
function a (line 2) | function a(s){return this.each((function(){var a=e(this),r=a.data(n);if(...
function t (line 2) | function t(t,n){this.element=t,this.options=n,e(this.element).addClass(d...
function l (line 2) | function l(s){return this.each((function(){var a=e(this);if(!a.data(n)){...
function t (line 2) | function t(e){this.options=e,this.bindedResize=!1,this.activate()}
function u (line 2) | function u(s){return this.each((function(){var a=e(this),r=a.data(n);if(...
function r (line 2) | function r(){a.detach().trigger("closed.bs.alert").remove()}
function n (line 2) | function n(n){return this.each((function(){var i=e(this),s=i.data("bs.bu...
function n (line 2) | function n(n){return this.each((function(){var i=e(this),s=i.data("bs.ca...
function n (line 2) | function n(t){var n,i=t.attr("data-target")||(n=t.attr("href"))&&n.repla...
function i (line 2) | function i(n){return this.each((function(){var i=e(this),s=i.data("bs.co...
function i (line 2) | function i(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A...
function s (line 2) | function s(n){n&&3===n.which||(e(".dropdown-backdrop").remove(),e(t).eac...
function n (line 2) | function n(n,i){return this.each((function(){var s=e(this),a=s.data("bs....
function r (line 2) | function r(t,i){var r=t.nodeName.toLowerCase();if(-1!==e.inArray(r,i))re...
function o (line 2) | function o(t,n,i){if(0===t.length)return t;if(i&&"function"==typeof i)re...
function a (line 2) | function a(){"in"!=n.hoverState&&i.detach(),n.$element&&n.$element.remov...
function t (line 2) | function t(n,i){this.$body=e(document.body),this.$scrollElement=e(n).is(...
function n (line 2) | function n(n){return this.each((function(){var i=e(this),s=i.data("bs.sc...
function n (line 2) | function n(n){return this.each((function(){var i=e(this),s=i.data("bs.ta...
function o (line 2) | function o(){a.removeClass("active").find("> .dropdown-menu > .active")....
function n (line 2) | function n(n){return this.each((function(){var i=e(this),s=i.data("bs.af...
function r (line 2) | function r(t,i){var r=t.nodeName.toLowerCase();if(-1!==e.inArray(r,i))re...
function o (line 2) | function o(e,t,n){if(n&&"function"==typeof n)return n(e);for(var i=Objec...
function p (line 2) | function p(e,t){return e.length===t.length&&e.every((function(e,n){retur...
function f (line 2) | function f(e,t){var n,i=e.selectedOptions,s=[];if(t){for(var a=0,r=i.len...
function y (line 2) | function y(e,t){for(var n,i=[],s=t||e.selectedOptions,a=0,r=s.length;a<r...
function L (line 2) | function L(e,t,n,i){for(var s=["display","subtext","tokens"],a=!1,r=0;r<...
function Y (line 2) | function Y(e){return parseInt(e,10)||0}
function D (line 2) | function D(e){return k[e]}
function T (line 2) | function T(e){return(e=e.toString())&&e.replace(b,D).replace(w,"")}
function B (line 2) | function B(e,t){e.length||(z.noResults.innerHTML=this.options.noneResult...
function q (line 2) | function q(n){var i,s=arguments,a=n;if([].shift.apply(s),!A.success){try...
function _ (line 2) | function _(e,n){var i,d,u,c,h,m,_,f,y=r.selectpicker.current.elements.le...
function a (line 2) | function a(e){var n=t[t.length-1];n&&"divider"===n.type&&(n.optID||e.opt...
function r (line 2) | function r(e,n){if((n=n||{}).divider="true"===e.getAttribute("data-divid...
function o (line 2) | function o(s,o){var d=o[s],l=!(s-1<i)&&o[s-1],u=o[s+1],c=d.querySelector...
function s (line 2) | function s(t){var s,a=0;switch(t.type){case"divider":s=U.li(!1,N.DIVIDER...
function i (line 2) | function i(){t.options.liveSearch?t.$searchbox.trigger("focus"):t.$menuI...
function s (line 2) | function s(){t.dropdown&&t.dropdown._popper&&t.dropdown._popper.state.is...
function G (line 2) | function G(){if(e.fn.dropdown)return(e.fn.dropdown.Constructor._dataApiK...
function y (line 2) | function y(e,t,n){var a=e[0],u=/er/.test(n)?d:/bl/.test(n)?r:s,c=n==l?{c...
function g (line 2) | function g(n,l,u){var c=n[0],_=n.parent(),f=l==s,y=l==d,g=l==r,v=y?o:f?a...
function M (line 2) | function M(e,t,n){var i=e[0],l=e.parent(),u=t==s,c=t==d,_=t==r,f=c?o:u?a...
function v (line 2) | function v(n,i){n.data(t)&&(n.parent().html(n.attr("style",n.data(t).s||...
function L (line 2) | function L(e,n,i){if(e.data(t))return e.data(t).o[n+(i?"":"Class")]}
function Y (line 2) | function Y(e){return e.charAt(0).toUpperCase()+e.slice(1)}
function k (line 2) | function k(e,t,n,i){i||(t&&e.trigger("ifToggled"),e.trigger("ifChanged")...
function k (line 2) | function k(e){if(i){var t=0;(e=e||window.event).wheelDelta&&(t=-e.wheelD...
function b (line 2) | function b(e,t,i){m=!1;var s=e,a=_.outerHeight()-L.outerHeight();if(t&&(...
function w (line 2) | function w(){l=Math.max(_.outerHeight()/_[0].scrollHeight*_.outerHeight(...
function D (line 2) | function D(){if(w(),clearTimeout(o),u==~~u){if(m=n.allowPageScroll,c!=u)...
function T (line 2) | function T(){n.alwaysVisible||(o=setTimeout((function(){n.disableFadeOut...
function e (line 2) | function e(){return n.prototype[t].apply(this,arguments)}
function s (line 2) | function s(e){return n.prototype[t].apply(this,e)}
function s (line 2) | function s(s,a){var r,o;for(o=0;o<s.length;o++)r=i.classesElementLookup[...
function o (line 2) | function o(){if(t||!0!==a.options.disabled&&!e(this).hasClass("ui-state-...
function n (line 2) | function n(){return("string"==typeof e?i[e]:e).apply(i,arguments)}
function L (line 2) | function L(e,t,n){var i,s,a=(n=n||M).createElement("script");if(a.text=e...
function Y (line 2) | function Y(e){return null==e?e+"":"object"==typeof e||"function"==typeof...
function w (line 2) | function w(e){var t=!!e&&"length"in e&&e.length,n=Y(e);return!y(e)&&!g(e...
function oe (line 2) | function oe(e,t,i,s){var a,o,l,u,c,_,y,g=t&&t.ownerDocument,L=t?t.nodeTy...
function de (line 2) | function de(){var e=[];return function t(n,s){return e.push(n+" ")>i.cac...
function le (line 2) | function le(e){return e[v]=!0,e}
function ue (line 2) | function ue(e){var t=m.createElement("fieldset");try{return!!e(t)}catch(...
function ce (line 2) | function ce(e,t){for(var n=e.split("|"),s=n.length;s--;)i.attrHandle[n[s...
function he (line 2) | function he(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourc...
function me (line 2) | function me(e){return function(t){return"input"===t.nodeName.toLowerCase...
function _e (line 2) | function _e(e){return function(t){var n=t.nodeName.toLowerCase();return(...
function pe (line 2) | function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t....
function fe (line 2) | function fe(e){return le((function(t){return t=+t,le((function(n,i){for(...
function ye (line 2) | function ye(e){return e&&void 0!==e.getElementsByTagName&&e}
function ge (line 2) | function ge(){}
function Me (line 2) | function Me(e){for(var t=0,n=e.length,i="";t<n;t++)i+=e[t].value;return i}
function ve (line 2) | function ve(e,t,n){var i=t.dir,s=t.next,a=s||i,r=n&&"parentNode"===a,o=k...
function Le (line 2) | function Le(e){return e.length>1?function(t,n,i){for(var s=e.length;s--;...
function Ye (line 2) | function Ye(e,t,n,i,s){for(var a,r=[],o=0,d=e.length,l=null!=t;o<d;o++)(...
function ke (line 2) | function ke(e,t,n,i,s,a){return i&&!i[v]&&(i=ke(i)),s&&!s[v]&&(s=ke(s,a)...
function be (line 2) | function be(e){for(var t,n,s,a=e.length,r=i.relative[e[0].type],o=r||i.r...
function H (line 2) | function H(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerC...
function C (line 2) | function C(e,t,n){return y(t)?b.grep(e,(function(e,i){return!!t.call(e,i...
function I (line 2) | function I(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}
function N (line 2) | function N(e){return e}
function $ (line 2) | function $(e){throw e}
function z (line 2) | function z(e,t,n,i){var s;try{e&&y(s=e.promise)?s.call(e).done(t).fail(n...
function r (line 2) | function r(e,t,n,s){return function(){var o=this,d=arguments,l=function(...
function U (line 2) | function U(){M.removeEventListener("DOMContentLoaded",U),i.removeEventLi...
function V (line 2) | function V(e,t){return t.toUpperCase()}
function G (line 2) | function G(e){return e.replace(J,"ms-").replace(q,V)}
function Z (line 2) | function Z(){this.expando=b.expando+Z.uid++}
function ne (line 2) | function ne(e,t,n){var i;if(void 0===n&&1===e.nodeType)if(i="data-"+t.re...
function ue (line 2) | function ue(e,t,n,i){var s,a,r=20,o=i?function(){return i.cur()}:functio...
function he (line 2) | function he(e){var t,n=e.ownerDocument,i=e.nodeName,s=ce[i];return s||(t...
function me (line 2) | function me(e,t){for(var n,i,s=[],a=0,r=e.length;a<r;a++)(i=e[a]).style&...
function ve (line 2) | function ve(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getEle...
function Le (line 2) | function Le(e,t){for(var n=0,i=e.length;n<i;n++)Q.set(e[n],"globalEval",...
function ke (line 2) | function ke(e,t,n,i,s){for(var a,r,o,d,l,u,c=t.createDocumentFragment(),...
function Te (line 2) | function Te(){return!0}
function xe (line 2) | function xe(){return!1}
function Se (line 2) | function Se(e,t){return e===function(){try{return M.activeElement}catch(...
function He (line 2) | function He(e,t,n,i,s,a){var r,o;if("object"==typeof t){for(o in"string"...
function je (line 2) | function je(e,t,n){n?(Q.set(e,t,!1),b.event.add(e,t,{namespace:!1,handle...
function Pe (line 2) | function Pe(e,t){return H(e,"table")&&H(11!==t.nodeType?t:t.firstChild,"...
function Ae (line 2) | function Ae(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
function Ie (line 2) | function Ie(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.sli...
function We (line 2) | function We(e,t){var n,i,s,a,r,o;if(1===t.nodeType){if(Q.hasData(e)&&(o=...
function Ne (line 2) | function Ne(e,t){var n=t.nodeName.toLowerCase();"input"===n&&fe.test(e.t...
function $e (line 2) | function $e(e,t,n,i){t=d(t);var s,a,r,o,l,u,c=0,h=e.length,m=h-1,_=t[0],...
function ze (line 2) | function ze(e,t,n){for(var i,s=t?b.filter(t,e):e,a=0;null!=(i=s[a]);a++)...
function Je (line 2) | function Je(e,t,n){var i,s,a,r,o=e.style;return(n=n||Re(e))&&(""!==(r=n....
function qe (line 2) | function qe(e,t){return{get:function(){if(!e())return(this.get=t).apply(...
function e (line 2) | function e(){if(u){l.style.cssText="position:absolute;left:-11111px;widt...
function t (line 2) | function t(e){return Math.round(parseFloat(e))}
function Ze (line 2) | function Ze(e){var t=b.cssProps[e]||Ke[e];return t||(e in Ge?e:Ke[e]=fun...
function nt (line 2) | function nt(e,t,n){var i=se.exec(t);return i?Math.max(0,i[2]-(n||0))+(i[...
function it (line 2) | function it(e,t,n,i,s,a){var r="width"===t?1:0,o=0,d=0;if(n===(i?"border...
function st (line 2) | function st(e,t,n){var i=Re(e),s=(!f.boxSizingReliable()||n)&&"border-bo...
function at (line 2) | function at(e,t,n,i,s){return new at.prototype.init(e,t,n,i,s)}
function ut (line 2) | function ut(){ot&&(!1===M.hidden&&i.requestAnimationFrame?i.requestAnima...
function ct (line 2) | function ct(){return i.setTimeout((function(){rt=void 0})),rt=Date.now()}
function ht (line 2) | function ht(e,t){var n,i=0,s={height:e};for(t=t?1:0;i<4;i+=2-t)s["margin...
function mt (line 2) | function mt(e,t,n){for(var i,s=(_t.tweeners[t]||[]).concat(_t.tweeners["...
function _t (line 2) | function _t(e,t,n){var i,s,a=0,r=_t.prefilters.length,o=b.Deferred().alw...
function Mt (line 2) | function Mt(e){return(e.match(W)||[]).join(" ")}
function vt (line 2) | function vt(e){return e.getAttribute&&e.getAttribute("class")||""}
function Lt (line 2) | function Lt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(W)|...
function Ct (line 2) | function Ct(e,t,n,i){var s;if(Array.isArray(t))b.each(t,(function(t,s){n...
function Rt (line 2) | function Rt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var ...
function Ut (line 2) | function Ut(e,t,n,i){var s={},a=e===$t;function r(o){var d;return s[o]=!...
function Bt (line 2) | function Bt(e,t){var n,i,s=b.ajaxSettings.flatOptions||{};for(n in t)voi...
function w (line 2) | function w(e,t,r,d){var c,h,M,v,L,Y=t;l||(l=!0,o&&i.clearTimeout(o),n=vo...
function t (line 2) | function t(e,t){var n=e.split("_");return t%10==1&&t%100!=11?n[0]:t%10>=...
function n (line 2) | function n(e,n,i){return"m"===i?n?"хвіліна":"хвіліну":"h"===i?n?"гадзіна...
function t (line 2) | function t(e,t,n){return e+" "+s({mm:"munutenn",MM:"miz",dd:"devezh"}[n]...
function n (line 2) | function n(e){switch(i(e)){case 1:case 3:case 4:case 5:case 9:return e+"...
function i (line 2) | function i(e){return e>9?i(e%10):e}
function s (line 2) | function s(e,t){return 2===t?a(e):e}
function a (line 2) | function a(e){var t={m:"v",b:"v",d:"z"};return void 0===t[e.charAt(0)]?e...
function t (line 2) | function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+=1===e?"sekund...
function a (line 2) | function a(e){return e>1&&e<5&&1!=~~(e/10)}
function r (line 2) | function r(e,t,n,i){var s=e+" ";switch(n){case"s":return t||i?"pár sekun...
function t (line 2) | function t(e,t,n,i){var s={m:["eine Minute","einer Minute"],h:["eine Stu...
function t (line 2) | function t(e,t,n,i){var s={m:["eine Minute","einer Minute"],h:["eine Stu...
function t (line 2) | function t(e,t,n,i){var s={m:["eine Minute","einer Minute"],h:["eine Stu...
function t (line 2) | function t(e){return"undefined"!=typeof Function&&e instanceof Function|...
function t (line 2) | function t(e,t,n,i){var s={s:["mõne sekundi","mõni sekund","paar sekundi...
function i (line 2) | function i(e,t,n,i){var a="";switch(n){case"s":return i?"muutaman sekunn...
function s (line 2) | function s(e,i){return e<10?i?n[e]:t[e]:e}
function t (line 2) | function t(e,t,n,i){var s={s:["थोडया सॅकंडांनी","थोडे सॅकंड"],ss:[e+" सॅ...
function t (line 2) | function t(e,t,n,i){var s={s:["thoddea sekondamni","thodde sekond"],ss:[...
function t (line 2) | function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+=1===e?"sekund...
function n (line 2) | function n(e,t,n,i){var s=e;switch(n){case"s":return i||t?"néhány másodp...
function i (line 2) | function i(e){return(e?"":"[múlt] ")+"["+t[this.day()]+"] LT[-kor]"}
function t (line 2) | function t(e){return e%100==11||e%10!=1}
function n (line 2) | function n(e,n,i,s){var a=e+" ";switch(i){case"s":return n||s?"nokkrar s...
function t (line 2) | function t(e,t,n,i){var s={m:["eng Minutt","enger Minutt"],h:["eng Stonn...
function n (line 2) | function n(e){return s(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e}
function i (line 2) | function i(e){return s(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e}
function s (line 2) | function s(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e...
function n (line 2) | function n(e,t,n,i){return t?"kelios sekundės":i?"kelių sekundžių":"keli...
function i (line 2) | function i(e,t,n,i){return t?a(n)[0]:i?a(n)[1]:a(n)[2]}
function s (line 2) | function s(e){return e%10==0||e>10&&e<20}
function a (line 2) | function a(e){return t[e].split("_")}
function r (line 2) | function r(e,t,n,r){var o=e+" ";return 1===e?o+i(e,t,n[0],r):t?o+(s(e)?a...
function n (line 2) | function n(e,t,n){return n?t%10==1&&t%100!=11?e[2]:e[3]:t%10==1&&t%100!=...
function i (line 2) | function i(e,i,s){return e+" "+n(t[s],e,i)}
function s (line 2) | function s(e,i,s){return n(t[s],e,i)}
function a (line 2) | function a(e,t){return t?"dažas sekundes":"dažām sekundēm"}
function t (line 2) | function t(e,t,n,i){switch(n){case"s":return t?"хэдхэн секунд":"хэдхэн с...
function i (line 2) | function i(e,t,n,i){var s="";if(t)switch(n){case"s":s="काही सेकंद";break...
function s (line 2) | function s(e){return e%10<5&&e%10>1&&~~(e/10)%10!=1}
function a (line 2) | function a(e,t,n){var i=e+" ";switch(n){case"ss":return i+(s(e)?"sekundy...
function t (line 2) | function t(e,t,n){var i=" ";return(e%100>=20||e>=100&&e%100==0)&&(i=" de...
function t (line 2) | function t(e,t){var n=e.split("_");return t%10==1&&t%100!=11?n[0]:t%10>=...
function n (line 2) | function n(e,n,i){return"m"===i?n?"минута":"минуту":e+" "+t({ss:n?"секун...
function i (line 2) | function i(e){return e>1&&e<5}
function s (line 2) | function s(e,t,n,s){var a=e+" ";switch(n){case"s":return t||s?"pár sekún...
function t (line 2) | function t(e,t,n,i){var s=e+" ";switch(n){case"s":return t||i?"nekaj sek...
function n (line 2) | function n(e){var t=e;return t=-1!==e.indexOf("jaj")?t.slice(0,-3)+"leS"...
function i (line 2) | function i(e){var t=e;return t=-1!==e.indexOf("jaj")?t.slice(0,-3)+"Hu’"...
function s (line 2) | function s(e,t,n,i){var s=a(e);switch(n){case"ss":return s+" lup";case"m...
function a (line 2) | function a(e){var n=Math.floor(e%1e3/100),i=Math.floor(e%100/10),s=e%10,...
function t (line 2) | function t(e,t,n,i){var s={s:["viensas secunds","'iensas secunds"],ss:[e...
function t (line 2) | function t(e,t){var n=e.split("_");return t%10==1&&t%100!=11?n[0]:t%10>=...
function n (line 2) | function n(e,n,i){return"m"===i?n?"хвилина":"хвилину":"h"===i?n?"година"...
function i (line 2) | function i(e,t){var n={nominative:"неділя_понеділок_вівторок_середа_четв...
function s (line 2) | function s(e){return function(){return e+"о"+(11===this.hours()?"б":"")+...
function s (line 2) | function s(e){var t=a(e);return n(t)}
function a (line 2) | function a(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'"...
function s (line 2) | function s(){return t.apply(null,arguments)}
function a (line 2) | function a(e){t=e}
function r (line 2) | function r(e){return e instanceof Array||"[object Array]"===Object.proto...
function o (line 2) | function o(e){return null!=e&&"[object Object]"===Object.prototype.toStr...
function d (line 2) | function d(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
function l (line 2) | function l(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnProp...
function u (line 2) | function u(e){return void 0===e}
function c (line 2) | function c(e){return"number"==typeof e||"[object Number]"===Object.proto...
function h (line 2) | function h(e){return e instanceof Date||"[object Date]"===Object.prototy...
function m (line 2) | function m(e,t){var n,i=[];for(n=0;n<e.length;++n)i.push(t(e[n],n));retu...
function _ (line 2) | function _(e,t){for(var n in t)d(t,n)&&(e[n]=t[n]);return d(t,"toString"...
function p (line 2) | function p(e,t,n,i){return Vn(e,t,n,i,!0).utc()}
function f (line 2) | function f(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,...
function y (line 2) | function y(e){return null==e._pf&&(e._pf=f()),e._pf}
function g (line 2) | function g(e){if(null==e._isValid){var t=y(e),n=i.call(t.parsedDateParts...
function M (line 2) | function M(e){var t=p(NaN);return null!=e?_(y(t),e):y(t).userInvalidated...
function Y (line 2) | function Y(e,t){var n,i,s;if(u(t._isAMomentObject)||(e._isAMomentObject=...
function k (line 2) | function k(e){Y(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),...
function b (line 2) | function b(e){return e instanceof k||null!=e&&null!=e._isAMomentObject}
function w (line 2) | function w(e){!1===s.suppressDeprecationWarnings&&"undefined"!=typeof co...
function D (line 2) | function D(e,t){var n=!0;return _((function(){if(null!=s.deprecationHand...
function S (line 2) | function S(e,t){null!=s.deprecationHandler&&s.deprecationHandler(e,t),x[...
function H (line 2) | function H(e){return"undefined"!=typeof Function&&e instanceof Function|...
function j (line 2) | function j(e){var t,n;for(n in e)d(e,n)&&(H(t=e[n])?this[n]=t:this["_"+n...
function C (line 2) | function C(e,t){var n,i=_({},e);for(n in t)d(t,n)&&(o(e[n])&&o(t[n])?(i[...
function E (line 2) | function E(e){null!=e&&this.set(e)}
function P (line 2) | function P(e,t,n){var i=this._calendar[e]||this._calendar.sameElse;retur...
function A (line 2) | function A(e,t,n){var i=""+Math.abs(e),s=t-i.length;return(e>=0?n?"+":""...
function z (line 2) | function z(e,t,n,i){var s=i;"string"==typeof i&&(s=function(){return thi...
function F (line 2) | function F(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.repl...
function R (line 2) | function R(e){var t,n,i=e.match(I);for(t=0,n=i.length;t<n;t++)$[i[t]]?i[...
function U (line 2) | function U(e,t){return e.isValid()?(t=B(t,e.localeData()),N[t]=N[t]||R(t...
function B (line 2) | function B(e,t){var n=5;function i(e){return t.longDateFormat(e)||e}for(...
function q (line 2) | function q(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toU...
function G (line 2) | function G(){return this._invalidDate}
function Q (line 2) | function Q(e){return this._ordinal.replace("%d",e)}
function ee (line 2) | function ee(e,t,n,i){var s=this._relativeTime[n];return H(s)?s(e,t,n,i):...
function te (line 2) | function te(e,t){var n=this._relativeTime[e>0?"future":"past"];return H(...
function ie (line 2) | function ie(e,t){var n=e.toLowerCase();ne[n]=ne[n+"s"]=ne[t]=e}
function se (line 2) | function se(e){return"string"==typeof e?ne[e]||ne[e.toLowerCase()]:void 0}
function ae (line 2) | function ae(e){var t,n,i={};for(n in e)d(e,n)&&(t=se(n))&&(i[t]=e[n]);re...
function oe (line 2) | function oe(e,t){re[e]=t}
function de (line 2) | function de(e){var t,n=[];for(t in e)d(e,t)&&n.push({unit:t,priority:re[...
function le (line 2) | function le(e){return e%4==0&&e%100!=0||e%400==0}
function ue (line 2) | function ue(e){return e<0?Math.ceil(e)||0:Math.floor(e)}
function ce (line 2) | function ce(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=ue(t)),n}
function he (line 2) | function he(e,t){return function(n){return null!=n?(_e(this,e,n),s.updat...
function me (line 2) | function me(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():...
function _e (line 2) | function _e(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&le(e.year())...
function pe (line 2) | function pe(e){return H(this[e=se(e)])?this[e]():this}
function fe (line 2) | function fe(e,t){if("object"==typeof e){var n,i=de(e=ae(e));for(n=0;n<i....
function Pe (line 2) | function Pe(e,t,n){ye[e]=H(t)?t:function(e,i){return e&&n?n:t}}
function Ae (line 2) | function Ae(e,t){return d(ye,e)?ye[e](t._strict,t._locale):new RegExp(Ie...
function Ie (line 2) | function Ie(e){return We(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^...
function We (line 2) | function We(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}
function $e (line 2) | function $e(e,t){var n,i=t;for("string"==typeof e&&(e=[e]),c(t)&&(i=func...
function ze (line 2) | function ze(e,t){$e(e,(function(e,n,i,s){i._w=i._w||{},t(e,i._w,i,s)}))}
function Fe (line 2) | function Fe(e,t,n){null!=t&&d(Ne,e)&&Ne[e](t,n._a,n,e)}
function Xe (line 2) | function Xe(e,t){return(e%t+t)%t}
function et (line 2) | function et(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=Xe(t,12);return ...
function rt (line 2) | function rt(e,t){return e?r(this._months)?this._months[e.month()]:this._...
function ot (line 2) | function ot(e,t){return e?r(this._monthsShort)?this._monthsShort[e.month...
function dt (line 2) | function dt(e,t,n){var i,s,a,r=e.toLocaleLowerCase();if(!this._monthsPar...
function lt (line 2) | function lt(e,t,n){var i,s,a;if(this._monthsParseExact)return dt.call(th...
function ut (line 2) | function ut(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if...
function ct (line 2) | function ct(e){return null!=e?(ut(this,e),s.updateOffset(this,!0),this):...
function ht (line 2) | function ht(){return et(this.year(),this.month())}
function mt (line 2) | function mt(e){return this._monthsParseExact?(d(this,"_monthsRegex")||pt...
function _t (line 2) | function _t(e){return this._monthsParseExact?(d(this,"_monthsRegex")||pt...
function pt (line 2) | function pt(){function e(e,t){return t.length-e.length}var t,n,i=[],s=[]...
function ft (line 2) | function ft(e){return le(e)?366:365}
function gt (line 2) | function gt(){return le(this.year())}
function Mt (line 2) | function Mt(e,t,n,i,s,a,r){var o;return e<100&&e>=0?(o=new Date(e+400,t,...
function vt (line 2) | function vt(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call...
function Lt (line 2) | function Lt(e,t,n){var i=7+t-n;return-(7+vt(e,0,i).getUTCDay()-t)%7+i-1}
function Yt (line 2) | function Yt(e,t,n,i,s){var a,r,o=1+7*(t-1)+(7+n-i)%7+Lt(e,i,s);return o<...
function kt (line 2) | function kt(e,t,n){var i,s,a=Lt(e.year(),t,n),r=Math.floor((e.dayOfYear(...
function bt (line 2) | function bt(e,t,n){var i=Lt(e,t,n),s=Lt(e+1,t,n);return(ft(e)-i+s)/7}
function wt (line 2) | function wt(e){return kt(e,this._week.dow,this._week.doy).week}
function Tt (line 2) | function Tt(){return this._week.dow}
function xt (line 2) | function xt(){return this._week.doy}
function St (line 2) | function St(e){var t=this.localeData().week(this);return null==e?t:this....
function Ht (line 2) | function Ht(e){var t=kt(this,1,4).week;return null==e?t:this.add(7*(e-t)...
function jt (line 2) | function jt(e,t){return"string"!=typeof e?e:isNaN(e)?"number"==typeof(e=...
function Ct (line 2) | function Ct(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(...
function Et (line 2) | function Et(e,t){return e.slice(t,7).concat(e.slice(0,t))}
function $t (line 2) | function $t(e,t){var n=r(this._weekdays)?this._weekdays:this._weekdays[e...
function zt (line 2) | function zt(e){return!0===e?Et(this._weekdaysShort,this._week.dow):e?thi...
function Ft (line 2) | function Ft(e){return!0===e?Et(this._weekdaysMin,this._week.dow):e?this....
function Rt (line 2) | function Rt(e,t,n){var i,s,a,r=e.toLocaleLowerCase();if(!this._weekdaysP...
function Ut (line 2) | function Ut(e,t,n){var i,s,a;if(this._weekdaysParseExact)return Rt.call(...
function Bt (line 2) | function Bt(e){if(!this.isValid())return null!=e?this:NaN;var t=this._is...
function Jt (line 2) | function Jt(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.da...
function qt (line 2) | function qt(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){va...
function Vt (line 2) | function Vt(e){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")...
function Gt (line 2) | function Gt(e){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")...
function Kt (line 2) | function Kt(e){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")...
function Zt (line 2) | function Zt(){function e(e,t){return t.length-e.length}var t,n,i,s,a,r=[...
function Qt (line 2) | function Qt(){return this.hours()%12||12}
function Xt (line 2) | function Xt(){return this.hours()||24}
function en (line 2) | function en(e,t){z(e,0,0,(function(){return this.localeData().meridiem(t...
function tn (line 2) | function tn(e,t){return t._meridiemParse}
function nn (line 2) | function nn(e){return"p"===(e+"").toLowerCase().charAt(0)}
function rn (line 2) | function rn(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}
function cn (line 2) | function cn(e,t){var n,i=Math.min(e.length,t.length);for(n=0;n<i;n+=1)if...
function hn (line 2) | function hn(e){return e?e.toLowerCase().replace("_","-"):e}
function mn (line 2) | function mn(e){for(var t,n,i,s,a=0;a<e.length;){for(t=(s=hn(e[a]).split(...
function _n (line 2) | function _n(t){var i=null;if(void 0===ln[t]&&e&&e.exports)try{i=on._abbr...
function pn (line 2) | function pn(e,t){var n;return e&&((n=u(t)?gn(e):fn(e,t))?on=n:"undefined...
function fn (line 2) | function fn(e,t){if(null!==t){var n,i=dn;if(t.abbr=e,null!=ln[e])S("defi...
function yn (line 2) | function yn(e,t){if(null!=t){var n,i,s=dn;null!=ln[e]&&null!=ln[e].paren...
function gn (line 2) | function gn(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abb...
function Mn (line 2) | function Mn(){return T(ln)}
function vn (line 2) | function vn(e){var t,n=e._a;return n&&-2===y(e).overflow&&(t=n[Be]<0||n[...
function Sn (line 2) | function Sn(e){var t,n,i,s,a,r,o=e._i,d=Ln.exec(o)||Yn.exec(o);if(d){for...
function Hn (line 2) | function Hn(e,t,n,i,s,a){var r=[jn(e),nt.indexOf(t),parseInt(n,10),parse...
function jn (line 2) | function jn(e){var t=parseInt(e,10);return t<=49?2e3+t:t<=999?1900+t:t}
function Cn (line 2) | function Cn(e){return e.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+...
function En (line 2) | function En(e,t,n){return!e||Pt.indexOf(e)===new Date(t[0],t[1],t[2]).ge...
function On (line 2) | function On(e,t,n){if(e)return xn[e];if(t)return 0;var i=parseInt(n,10),...
function Pn (line 2) | function Pn(e){var t,n=Tn.exec(Cn(e._i));if(n){if(t=Hn(n[4],n[3],n[2],n[...
function An (line 2) | function An(e){var t=Dn.exec(e._i);null===t?(Sn(e),!1===e._isValid&&(del...
function In (line 2) | function In(e,t,n){return null!=e?e:null!=t?t:n}
function Wn (line 2) | function Wn(e){var t=new Date(s.now());return e._useUTC?[t.getUTCFullYea...
function Nn (line 2) | function Nn(e){var t,n,i,s,a,r=[];if(!e._d){for(i=Wn(e),e._w&&null==e._a...
function $n (line 2) | function $n(e){var t,n,i,s,a,r,o,d,l;null!=(t=e._w).GG||null!=t.W||null!...
function zn (line 2) | function zn(e){if(e._f!==s.ISO_8601)if(e._f!==s.RFC_2822){e._a=[],y(e).e...
function Fn (line 2) | function Fn(e,t,n){var i;return null==n?t:null!=e.meridiemHour?e.meridie...
function Rn (line 2) | function Rn(e){var t,n,i,s,a,r,o=!1;if(0===e._f.length)return y(e).inval...
function Un (line 2) | function Un(e){if(!e._d){var t=ae(e._i),n=void 0===t.day?t.date:t.day;e....
function Bn (line 2) | function Bn(e){var t=new k(vn(Jn(e)));return t._nextDay&&(t.add(1,"d"),t...
function Jn (line 2) | function Jn(e){var t=e._i,n=e._f;return e._locale=e._locale||gn(e._l),nu...
function qn (line 2) | function qn(e){var t=e._i;u(t)?e._d=new Date(s.now()):h(t)?e._d=new Date...
function Vn (line 2) | function Vn(e,t,n,i,s){var a={};return!0!==t&&!1!==t||(i=t,t=void 0),!0!...
function Gn (line 2) | function Gn(e,t,n,i){return Vn(e,t,n,i,!1)}
function Qn (line 2) | function Qn(e,t){var n,i;if(1===t.length&&r(t[0])&&(t=t[0]),!t.length)re...
function Xn (line 2) | function Xn(){return Qn("isBefore",[].slice.call(arguments,0))}
function ei (line 2) | function ei(){return Qn("isAfter",[].slice.call(arguments,0))}
function ii (line 2) | function ii(e){var t,n,i=!1;for(t in e)if(d(e,t)&&(-1===Re.call(ni,t)||n...
function si (line 2) | function si(){return this._isValid}
function ai (line 2) | function ai(){return xi(NaN)}
function ri (line 2) | function ri(e){var t=ae(e),n=t.year||0,i=t.quarter||0,s=t.month||0,a=t.w...
function oi (line 2) | function oi(e){return e instanceof ri}
function di (line 2) | function di(e){return e<0?-1*Math.round(-1*e):Math.round(e)}
function li (line 2) | function li(e,t,n){var i,s=Math.min(e.length,t.length),a=Math.abs(e.leng...
function ui (line 2) | function ui(e,t){z(e,0,0,(function(){var e=this.utcOffset(),n="+";return...
function hi (line 2) | function hi(e,t){var n,i,s=(t||"").match(e);return null===s?null:0===(i=...
function mi (line 2) | function mi(e,t){var n,i;return t._isUTC?(n=t.clone(),i=(b(e)||h(e)?e.va...
function _i (line 2) | function _i(e){return-Math.round(e._d.getTimezoneOffset())}
function pi (line 2) | function pi(e,t,n){var i,a=this._offset||0;if(!this.isValid())return nul...
function fi (line 2) | function fi(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffs...
function yi (line 2) | function yi(e){return this.utcOffset(0,e)}
function gi (line 2) | function gi(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e...
function Mi (line 2) | function Mi(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if...
function vi (line 2) | function vi(e){return!!this.isValid()&&(e=e?Gn(e).utcOffset():0,(this.ut...
function Li (line 2) | function Li(){return this.utcOffset()>this.clone().month(0).utcOffset()|...
function Yi (line 2) | function Yi(){if(!u(this._isDSTShifted))return this._isDSTShifted;var e,...
function ki (line 2) | function ki(){return!!this.isValid()&&!this._isUTC}
function bi (line 2) | function bi(){return!!this.isValid()&&this._isUTC}
function wi (line 2) | function wi(){return!!this.isValid()&&this._isUTC&&0===this._offset}
function xi (line 2) | function xi(e,t){var n,i,s,a=e,r=null;return oi(e)?a={ms:e._milliseconds...
function Si (line 2) | function Si(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)...
function Hi (line 2) | function Hi(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year...
function ji (line 2) | function ji(e,t){var n;return e.isValid()&&t.isValid()?(t=mi(t,e),e.isBe...
function Ci (line 2) | function Ci(e,t){return function(n,i){var s;return null===i||isNaN(+i)||...
function Ei (line 2) | function Ei(e,t,n,i){var a=t._milliseconds,r=di(t._days),o=di(t._months)...
function Ai (line 2) | function Ai(e){return"string"==typeof e||e instanceof String}
function Ii (line 2) | function Ii(e){return b(e)||h(e)||Ai(e)||c(e)||Ni(e)||Wi(e)||null==e}
function Wi (line 2) | function Wi(e){var t,n,i=o(e)&&!l(e),s=!1,a=["years","year","y","months"...
function Ni (line 2) | function Ni(e){var t=r(e),n=!1;return t&&(n=0===e.filter((function(t){re...
function $i (line 2) | function $i(e){var t,n,i=o(e)&&!l(e),s=!1,a=["sameDay","nextDay","lastDa...
function zi (line 2) | function zi(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"...
function Fi (line 2) | function Fi(e,t){1===arguments.length&&(arguments[0]?Ii(arguments[0])?(e...
function Ri (line 2) | function Ri(){return new k(this)}
function Ui (line 2) | function Ui(e,t){var n=b(e)?e:Gn(e);return!(!this.isValid()||!n.isValid(...
function Bi (line 2) | function Bi(e,t){var n=b(e)?e:Gn(e);return!(!this.isValid()||!n.isValid(...
function Ji (line 2) | function Ji(e,t,n,i){var s=b(e)?e:Gn(e),a=b(t)?t:Gn(t);return!!(this.isV...
function qi (line 2) | function qi(e,t){var n,i=b(e)?e:Gn(e);return!(!this.isValid()||!i.isVali...
function Vi (line 2) | function Vi(e,t){return this.isSame(e,t)||this.isAfter(e,t)}
function Gi (line 2) | function Gi(e,t){return this.isSame(e,t)||this.isBefore(e,t)}
function Ki (line 2) | function Ki(e,t,n){var i,s,a;if(!this.isValid())return NaN;if(!(i=mi(e,t...
function Zi (line 2) | function Zi(e,t){if(e.date()<t.date())return-Zi(t,e);var n=12*(t.year()-...
function Qi (line 2) | function Qi(){return this.clone().locale("en").format("ddd MMM DD YYYY H...
function Xi (line 2) | function Xi(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clon...
function es (line 2) | function es(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */...
function ts (line 2) | function ts(e){e||(e=this.isUtc()?s.defaultFormatUtc:s.defaultFormat);va...
function ns (line 2) | function ns(e,t){return this.isValid()&&(b(e)&&e.isValid()||Gn(e).isVali...
function is (line 2) | function is(e){return this.from(Gn(),e)}
function ss (line 2) | function ss(e,t){return this.isValid()&&(b(e)&&e.isValid()||Gn(e).isVali...
function as (line 2) | function as(e){return this.to(Gn(),e)}
function rs (line 2) | function rs(e){var t;return void 0===e?this._locale._abbr:(null!=(t=gn(e...
function ds (line 2) | function ds(){return this._locale}
function ms (line 2) | function ms(e,t){return(e%t+t)%t}
function _s (line 2) | function _s(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-hs:new Date(e,...
function ps (line 2) | function ps(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-hs:Date.UTC(e,...
function fs (line 2) | function fs(e){var t,n;if(void 0===(e=se(e))||"millisecond"===e||!this.i...
function ys (line 2) | function ys(e){var t,n;if(void 0===(e=se(e))||"millisecond"===e||!this.i...
function gs (line 2) | function gs(){return this._d.valueOf()-6e4*(this._offset||0)}
function Ms (line 2) | function Ms(){return Math.floor(this.valueOf()/1e3)}
function vs (line 2) | function vs(){return new Date(this.valueOf())}
function Ls (line 2) | function Ls(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.m...
function Ys (line 2) | function Ys(){var e=this;return{years:e.year(),months:e.month(),date:e.d...
function ks (line 2) | function ks(){return this.isValid()?this.toISOString():null}
function bs (line 2) | function bs(){return g(this)}
function ws (line 2) | function ws(){return _({},y(this))}
function Ds (line 2) | function Ds(){return y(this).overflow}
function Ts (line 2) | function Ts(){return{input:this._i,format:this._f,locale:this._locale,is...
function xs (line 2) | function xs(e,t){var n,i,a,r=this._eras||gn("en")._eras;for(n=0,i=r.leng...
function Ss (line 2) | function Ss(e,t,n){var i,s,a,r,o,d=this.eras();for(e=e.toUpperCase(),i=0...
function Hs (line 2) | function Hs(e,t){var n=e.since<=e.until?1:-1;return void 0===t?s(e.since...
function js (line 2) | function js(){var e,t,n,i=this.localeData().eras();for(e=0,t=i.length;e<...
function Cs (line 2) | function Cs(){var e,t,n,i=this.localeData().eras();for(e=0,t=i.length;e<...
function Es (line 2) | function Es(){var e,t,n,i=this.localeData().eras();for(e=0,t=i.length;e<...
function Os (line 2) | function Os(){var e,t,n,i,a=this.localeData().eras();for(e=0,t=a.length;...
function Ps (line 2) | function Ps(e){return d(this,"_erasNameRegex")||Fs.call(this),e?this._er...
function As (line 2) | function As(e){return d(this,"_erasAbbrRegex")||Fs.call(this),e?this._er...
function Is (line 2) | function Is(e){return d(this,"_erasNarrowRegex")||Fs.call(this),e?this._...
function Ws (line 2) | function Ws(e,t){return t.erasAbbrRegex(e)}
function Ns (line 2) | function Ns(e,t){return t.erasNameRegex(e)}
function $s (line 2) | function $s(e,t){return t.erasNarrowRegex(e)}
function zs (line 2) | function zs(e,t){return t._eraYearOrdinalRegex||Se}
function Fs (line 2) | function Fs(){var e,t,n=[],i=[],s=[],a=[],r=this.eras();for(e=0,t=r.leng...
function Rs (line 2) | function Rs(e,t){z(0,[e,e.length],0,t)}
function Us (line 2) | function Us(e){return Ks.call(this,e,this.week(),this.weekday(),this.loc...
function Bs (line 2) | function Bs(e){return Ks.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}
function Js (line 2) | function Js(){return bt(this.year(),1,4)}
function qs (line 2) | function qs(){return bt(this.isoWeekYear(),1,4)}
function Vs (line 2) | function Vs(){var e=this.localeData()._week;return bt(this.year(),e.dow,...
function Gs (line 2) | function Gs(){var e=this.localeData()._week;return bt(this.weekYear(),e....
function Ks (line 2) | function Ks(e,t,n,i,s){var a;return null==e?kt(this,i,s).year:(t>(a=bt(e...
function Zs (line 2) | function Zs(e,t,n,i,s){var a=Yt(e,t,n,i,s),r=vt(a.year,0,a.dayOfYear);re...
function Qs (line 2) | function Qs(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3...
function ea (line 2) | function ea(e){var t=Math.round((this.clone().startOf("day")-this.clone(...
function aa (line 2) | function aa(e,t){t[Ke]=ce(1e3*("0."+e))}
function ra (line 2) | function ra(){return this._isUTC?"UTC":""}
function oa (line 2) | function oa(){return this._isUTC?"Coordinated Universal Time":""}
function la (line 2) | function la(e){return Gn(1e3*e)}
function ua (line 2) | function ua(){return Gn.apply(null,arguments).parseZone()}
function ca (line 2) | function ca(e){return e}
function ma (line 2) | function ma(e,t,n,i){var s=gn(),a=p().set(i,t);return s[n](a,e)}
function _a (line 2) | function _a(e,t,n){if(c(e)&&(t=e,e=void 0),e=e||"",null!=t)return ma(e,t...
function pa (line 2) | function pa(e,t,n,i){"boolean"==typeof e?(c(t)&&(n=t,t=void 0),t=t||""):...
function fa (line 2) | function fa(e,t){return _a(e,t,"months")}
function ya (line 2) | function ya(e,t){return _a(e,t,"monthsShort")}
function ga (line 2) | function ga(e,t,n){return pa(e,t,n,"weekdays")}
function Ma (line 2) | function Ma(e,t,n){return pa(e,t,n,"weekdaysShort")}
function va (line 2) | function va(e,t,n){return pa(e,t,n,"weekdaysMin")}
function Ya (line 2) | function Ya(){var e=this._data;return this._milliseconds=La(this._millis...
function ka (line 2) | function ka(e,t,n,i){var s=xi(t,n);return e._milliseconds+=i*s._millisec...
function ba (line 2) | function ba(e,t){return ka(this,e,t,1)}
function wa (line 2) | function wa(e,t){return ka(this,e,t,-1)}
function Da (line 2) | function Da(e){return e<0?Math.floor(e):Math.ceil(e)}
function Ta (line 2) | function Ta(){var e,t,n,i,s,a=this._milliseconds,r=this._days,o=this._mo...
function xa (line 2) | function xa(e){return 4800*e/146097}
function Sa (line 2) | function Sa(e){return 146097*e/4800}
function Ha (line 2) | function Ha(e){if(!this.isValid())return NaN;var t,n,i=this._millisecond...
function ja (line 2) | function ja(){return this.isValid()?this._milliseconds+864e5*this._days+...
function Ca (line 2) | function Ca(e){return function(){return this.as(e)}}
function Fa (line 2) | function Fa(){return xi(this)}
function Ra (line 2) | function Ra(e){return e=se(e),this.isValid()?this[e+"s"]():NaN}
function Ua (line 2) | function Ua(e){return function(){return this.isValid()?this._data[e]:NaN}}
function Qa (line 2) | function Qa(){return ue(this.days()/7)}
function tr (line 2) | function tr(e,t,n,i,s){return s.relativeTime(t||1,!!n,e,i)}
function nr (line 2) | function nr(e,t,n,i){var s=xi(e).abs(),a=Xa(s.as("s")),r=Xa(s.as("m")),o...
function ir (line 2) | function ir(e){return void 0===e?Xa:"function"==typeof e&&(Xa=e,!0)}
function sr (line 2) | function sr(e,t){return void 0!==er[e]&&(void 0===t?er[e]:(er[e]=t,"s"==...
function ar (line 2) | function ar(e,t){if(!this.isValid())return this.localeData().invalidDate...
function or (line 2) | function or(e){return(e>0)-(e<0)||+e}
function dr (line 2) | function dr(){if(!this.isValid())return this.localeData().invalidDate();...
function i (line 2) | function i(t){if(n[t])return n[t].exports;var s=n[t]={id:t,loaded:!1,exp...
FILE: Tests/Controller/NavbarControllerTest.php
class NavbarControllerTest (line 23) | class NavbarControllerTest extends TestCase
method getContainerMock (line 25) | protected function getContainerMock()
method getContextHelper (line 46) | protected function getContextHelper($notifications, $messages, $tasks)
method getTestData (line 55) | public function getTestData()
method testMessagesAction (line 68) | public function testMessagesAction(Contexthelper $helper, $expectedMax...
FILE: Tests/DependencyInjection/ConfigurationTest.php
class ConfigurationTest (line 16) | class ConfigurationTest extends TestCase
method testDefaultConfiguration (line 18) | public function testDefaultConfiguration()
method testFullConfiguration (line 33) | public function testFullConfiguration()
method getDefaultConfig (line 45) | protected function getDefaultConfig()
FILE: Tests/Event/MessageListEventTest.php
class MessageListEventTest (line 17) | class MessageListEventTest extends TestCase
method total_should_be_zero_and_max_null_when_there_are_no_messages (line 22) | public function total_should_be_zero_and_max_null_when_there_are_no_me...
method total_should_be_equal_the_number_of_messages_if_max_is_greater_then_the_number_of_messages (line 32) | public function total_should_be_equal_the_number_of_messages_if_max_is...
method total_should_be_equal_the_number_of_messages_and_count_message_should_equal_max_when_max_is_lower_then_the_number_of_messages (line 49) | public function total_should_be_equal_the_number_of_messages_and_count...
method total_is_equal_the_number_of_messages_when_max_is_null (line 66) | public function total_is_equal_the_number_of_messages_when_max_is_null()
method you_can_set_total_to_be_different_from_the_number_of_messages (line 83) | public function you_can_set_total_to_be_different_from_the_number_of_m...
method you_can_set_total_to_be_different_from_the_number_of_messages_and_set_max_to_another_value (line 101) | public function you_can_set_total_to_be_different_from_the_number_of_m...
method generateNbMessages (line 121) | private function generateNbMessages($number)
method generateUser (line 139) | private function generateUser($username)
FILE: Tests/Event/NotificationListEventTest.php
class NotificationListEventTest (line 17) | class NotificationListEventTest extends TestCase
method total_should_be_zero_and_max_null_when_there_are_no_notification (line 22) | public function total_should_be_zero_and_max_null_when_there_are_no_no...
method total_should_be_equal_the_number_of_notifications_if_max_is_greater_then_the_number_of_notifications (line 32) | public function total_should_be_equal_the_number_of_notifications_if_m...
method total_should_equal_the_number_of_notifications_and_count_notifications_should_equal_max_when_max_is_lower_then_the_number_of_notifications (line 49) | public function total_should_equal_the_number_of_notifications_and_cou...
method total_equal_the_number_of_notifications_when_max_is_null (line 66) | public function total_equal_the_number_of_notifications_when_max_is_nu...
method you_can_set_total_to_be_different_from_the_number_of_notifications (line 83) | public function you_can_set_total_to_be_different_from_the_number_of_n...
method you_can_set_total_to_be_different_from_the_number_of_notifications_and_set_max_to_another_value (line 101) | public function you_can_set_total_to_be_different_from_the_number_of_n...
method generateNbNotifications (line 122) | private function generateNbNotifications($number, $type = Constants::T...
FILE: Tests/Event/TaskListEventTest.php
class TaskListEventTest (line 16) | class TaskListEventTest extends TestCase
method total_should_be_zero_and_max_null_when_there_are_no_tasks (line 21) | public function total_should_be_zero_and_max_null_when_there_are_no_ta...
method total_should_be_equal_the_number_of_tasks_if_max_is_greater_then_the_number_of_tasks (line 31) | public function total_should_be_equal_the_number_of_tasks_if_max_is_gr...
method total_should_equal_the_number_of_tasks_and_count_tasks_should_equal_max_when_max_is_lower_then_the_number_of_tasks (line 48) | public function total_should_equal_the_number_of_tasks_and_count_tasks...
method total_equal_the_number_of_tasks_when_max_is_null (line 65) | public function total_equal_the_number_of_tasks_when_max_is_null()
method you_can_set_total_to_be_different_from_the_number_of_tasks (line 82) | public function you_can_set_total_to_be_different_from_the_number_of_t...
method you_can_set_total_to_be_different_from_the_number_of_tasks_and_set_max_to_another_value (line 100) | public function you_can_set_total_to_be_different_from_the_number_of_t...
method generateNbTasks (line 120) | private function generateNbTasks($number)
FILE: Tests/Helper/ContextHelperTest.php
class ContextHelperTest (line 15) | class ContextHelperTest extends TestCase
method testOptions (line 17) | public function testOptions()
FILE: Tests/Model/MessageModelTest.php
class MessageModelTest (line 16) | class MessageModelTest extends TestCase
method testGetIdentifier (line 18) | public function testGetIdentifier()
FILE: Tests/Model/NotificationModelTest.php
class NotificationModelTest (line 15) | class NotificationModelTest extends TestCase
method testGetIdentifier (line 17) | public function testGetIdentifier()
FILE: Tests/Model/TaskModelTest.php
class TaskModelTest (line 15) | class TaskModelTest extends TestCase
method testGetIdentifier (line 17) | public function testGetIdentifier()
FILE: Tests/Model/UserModelTest.php
class UserModelTest (line 15) | class UserModelTest extends TestCase
method testGetIdentifier (line 17) | public function testGetIdentifier()
FILE: Tests/Twig/AdminExtensionTest.php
class AdminExtensionTest (line 15) | class AdminExtensionTest extends TestCase
method testGetFilters (line 17) | public function testGetFilters()
method testGetFunctions (line 27) | public function testGetFunctions()
FILE: Tests/Twig/RuntimeExtensionTest.php
class RuntimeExtensionTest (line 17) | class RuntimeExtensionTest extends TestCase
method getSut (line 23) | protected function getSut(array $options = [])
method testGetRouteByAlias (line 38) | public function testGetRouteByAlias()
method testBodyClass (line 46) | public function testBodyClass()
method testGetTextType (line 64) | public function testGetTextType()
FILE: Twig/AdminExtension.php
class AdminExtension (line 16) | class AdminExtension extends AbstractExtension
method getFilters (line 21) | public function getFilters()
method getFunctions (line 30) | public function getFunctions()
FILE: Twig/EventsExtension.php
class EventsExtension (line 31) | final class EventsExtension implements RuntimeExtensionInterface
method __construct (line 42) | public function __construct(EventDispatcherInterface $dispatcher, Cont...
method getMenu (line 52) | public function getMenu(Request $request): ?array
method getSidebarUser (line 64) | public function getSidebarUser(): ?UserInterface
method getBreadcrumbs (line 76) | public function getBreadcrumbs(Request $request): ?array
method getNotifications (line 99) | public function getNotifications(?int $max = null): ?NotificationRepos...
method getMessages (line 115) | public function getMessages(?int $max = null): ?MessageRepositoryInter...
method getTasks (line 131) | public function getTasks(?int $max = null): ?TaskRepositoryInterface
method getUserDetails (line 147) | public function getUserDetails(): ?UserDetailsInterface
FILE: Twig/RuntimeExtension.php
class RuntimeExtension (line 16) | final class RuntimeExtension implements RuntimeExtensionInterface
method __construct (line 31) | public function __construct(ContextHelper $contextHelper, array $routes)
method getRouteByAlias (line 41) | public function getRouteByAlias($routeName)
method getTextType (line 50) | public function getTextType($type)
method bodyClass (line 74) | public function bodyClass($classes = '')
Condensed preview — 160 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,326K chars).
[
{
"path": ".editorconfig",
"chars": 156,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 4\nindent_style = space\n\n[*.php]\ninsert_final_newline = t"
},
{
"path": ".gitattributes",
"chars": 226,
"preview": ".github export-ignore\nTests export-ignore\n.gitattributes export-ignore\n.gitignore export-ignore\n.php_cs export-ignore\n.t"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 2549,
"preview": "# Contribution Guidelines\n\nThank you for considering contributing to this bundle. We welcome any kind of\ncontribution, n"
},
{
"path": ".github/FUNDING.yml",
"chars": 58,
"preview": "github: [kevinpapst]\ncustom: https://paypal.me/kevinpapst\n"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 720,
"preview": "Please write here a description of your problem. Don't hesitate and add enough\ninformation to fix your problem properly "
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 623,
"preview": "## Description\nA clear and concise description of what this pull request adds or changes.\n\n## Types of changes\n- [ ] Bug"
},
{
"path": ".github/workflows/linting.yaml",
"chars": 677,
"preview": "name: CI\non:\n pull_request: null\n push:\n branches:\n - master\njobs:\n tests:\n runs-on: u"
},
{
"path": ".gitignore",
"chars": 188,
"preview": "nbproject/*\n.idea\nvendor\ncomposer.lock\npackage-lock.json\n\n# Ignore Eclipse IDE config files\n.buildpath\n.project\n.setting"
},
{
"path": ".php_cs",
"chars": 5714,
"preview": "<?php\n\n$fileHeaderComment = <<<COMMENT\nThis file is part of the AdminLTE bundle.\n\nFor the full copyright and license inf"
},
{
"path": "AdminLTEBundle.php",
"chars": 601,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "CONTRIBUTING.md",
"chars": 1306,
"preview": "# Contributing\n\nThe AdminLTEBundle is an open source project and contributions made by the community are welcome. \nSend "
},
{
"path": "Controller/BreadcrumbController.php",
"chars": 1849,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Controller/EmitterController.php",
"chars": 1004,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Controller/NavbarController.php",
"chars": 4413,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Controller/SidebarController.php",
"chars": 1970,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "DependencyInjection/AdminLTEExtension.php",
"chars": 3530,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "DependencyInjection/Compiler/TwigPass.php",
"chars": 1342,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "DependencyInjection/Configuration.php",
"chars": 10452,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/BreadcrumbMenuEvent.php",
"chars": 419,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/KnpMenuEvent.php",
"chars": 1563,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/MenuEvent.php",
"chars": 2186,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/MessageListEvent.php",
"chars": 2115,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/NavbarUserEvent.php",
"chars": 282,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/NotificationListEvent.php",
"chars": 1935,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/ShowUserEvent.php",
"chars": 2202,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/SidebarMenuEvent.php",
"chars": 279,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/SidebarUserEvent.php",
"chars": 283,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/TaskListEvent.php",
"chars": 1845,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/ThemeEvent.php",
"chars": 389,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Event/ThemeEvents.php",
"chars": 1886,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Helper/Constants.php",
"chars": 750,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Helper/ContextHelper.php",
"chars": 1063,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "LICENSE",
"chars": 1295,
"preview": "MIT License\n\nCopyright (c) 2014-2018 Marc Bach, Ángel Guzmán Maeso, Kevin Papst and others\n\nPermission is hereby granted"
},
{
"path": "Menu/MenuBuilder.php",
"chars": 1415,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/MenuItemInterface.php",
"chars": 1638,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/MenuItemModel.php",
"chars": 5898,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/MessageInterface.php",
"chars": 813,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/MessageModel.php",
"chars": 3161,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/NavBarUserLink.php",
"chars": 1449,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/NotificationInterface.php",
"chars": 558,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/NotificationModel.php",
"chars": 2281,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/TaskInterface.php",
"chars": 550,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/TaskModel.php",
"chars": 2227,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/UserDetailsInterface.php",
"chars": 499,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/UserInterface.php",
"chars": 773,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Model/UserModel.php",
"chars": 3686,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "README.md",
"chars": 6666,
"preview": "\n--- \n# THIS BUNDLE IS NOT MAINTAINED ANYMORE\n\nThe used AdminLTE version is old.\nBoth: supported Symfony and PHP version"
},
{
"path": "Repository/MessageRepositoryInterface.php",
"chars": 496,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Repository/NotificationRepositoryInterface.php",
"chars": 516,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Repository/TaskRepositoryInterface.php",
"chars": 484,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Resources/assets/admin-lte-extensions.scss",
"chars": 1565,
"preview": "\n@import \"~bootstrap-sass/assets/stylesheets/bootstrap/variables\";\n\n/*\n * This theme was upgraded to FONT AWESOME 5\n * w"
},
{
"path": "Resources/assets/admin-lte.js",
"chars": 837,
"preview": "// ------ jquery and bootstrap basics ------\n// create global $ and jQuery variables\nconst $ = require('jquery');\nglobal"
},
{
"path": "Resources/assets/admin-lte.scss",
"chars": 509,
"preview": "\n$icon-font-path: \"~bootstrap-sass/assets/fonts/bootstrap/\";\n$fa-font-path: \"~@fortawesome/fontawesome-free/webfonts/\";\n"
},
{
"path": "Resources/config/container/knp-menu.yml",
"chars": 309,
"preview": "services:\n\n KevinPapst\\AdminLTEBundle\\Menu\\MenuBuilder:\n class: KevinPapst\\AdminLTEBundle\\Menu\\MenuBuilder\n "
},
{
"path": "Resources/config/services.yml",
"chars": 978,
"preview": "services:\n\n KevinPapst\\AdminLTEBundle\\Twig\\RuntimeExtension:\n class: KevinPapst\\AdminLTEBundle\\Twig\\RuntimeExt"
},
{
"path": "Resources/docs/README.md",
"chars": 1490,
"preview": "# AdminLTE Bundle documentation\n\nIf you cannot find the needed information in this list of topics, please create an [iss"
},
{
"path": "Resources/docs/breadcrumbs.md",
"chars": 1941,
"preview": "# The Breadcrumb component\n\nThe breadcrumb maps a list of route to a list of link. \n\nYou don't need to build a new Event"
},
{
"path": "Resources/docs/bundle_options.md",
"chars": 825,
"preview": "# Theme options\n\nThe theme options define the basic layout of your side. \nIf you want to change any default value, defin"
},
{
"path": "Resources/docs/component_events.md",
"chars": 1674,
"preview": "# Accessing components\n\nThe contents of the navbar and sidebar are separated into components, following an event driven "
},
{
"path": "Resources/docs/configurations.md",
"chars": 4701,
"preview": "# Configurations\n\nAfter installing the theme, you have to adjust a couple of config settings to your application.\n\nThe c"
},
{
"path": "Resources/docs/control_sidebar.md",
"chars": 1905,
"preview": "# Control-Sidebar\n\nThe control sidebar on the right-hand screen will slide-in over the content area.\nIt can contain up t"
},
{
"path": "Resources/docs/extend_webpack_encore.md",
"chars": 2200,
"preview": "# Extend Webpack Encore\n\nIf you are going to use your customized webpack-encore configuration and\nwant to take advantage"
},
{
"path": "Resources/docs/form_theme.md",
"chars": 2602,
"preview": "# Form theme\n\nThis bundle provides two form-themes:\n- [Resources/views/layout/form-theme.html.twig](Resources/views/layo"
},
{
"path": "Resources/docs/fos_userbundle.md",
"chars": 2201,
"preview": "# FOSUserBundle integration\n\nThis bundle is prepared for a flawless integration with FOSUserBundle, but its not coming o"
},
{
"path": "Resources/docs/frontend_assets.md",
"chars": 1140,
"preview": "# Rebuilding assets\n\nIn case you want to rebuild the static scripts or need a build for a custom environment.\n\n## Instal"
},
{
"path": "Resources/docs/knp_menu.md",
"chars": 6576,
"preview": "# KnpMenu integration\n\nThe KnpMenu can be used instead of the regular built-in menu and breadcrumb components. \n\n## Inst"
},
{
"path": "Resources/docs/layout.md",
"chars": 5537,
"preview": "# Using the layout\n\nIn order to use the layout, your views should extend from the provided `default-layout`\n```twig\n{% e"
},
{
"path": "Resources/docs/migration_guide.md",
"chars": 6806,
"preview": "# Migration from the AdminThemeBundle\n\nThis is not a step-by-step migration guide, but a collection of hints what needs "
},
{
"path": "Resources/docs/navbar_messages.md",
"chars": 3540,
"preview": "# The Navbar Messages component\n\n## Routes\n\nJust like the other theme components, this one requires some route aliases t"
},
{
"path": "Resources/docs/navbar_notifications.md",
"chars": 3436,
"preview": "# The Navbar Notifications component\n\n## Routes\n\nJust like the other theme components, this one requires some route alia"
},
{
"path": "Resources/docs/navbar_tasks.md",
"chars": 3119,
"preview": "# The Navbar Tasks component\n\n## Routes\n\nJust like the other theme components, this one requires some route aliases to w"
},
{
"path": "Resources/docs/navbar_user.md",
"chars": 4479,
"preview": "# The Navbar User component\n\n## Routes\nJust like the other theme components, this one requires some route aliases to wor"
},
{
"path": "Resources/docs/sidebar_navigation.md",
"chars": 5311,
"preview": "# The Sidebar Navigation component\n\n__*Notice* If you would rather use the KnpMenuBundle instead, please refer to the [i"
},
{
"path": "Resources/docs/sidebar_user.md",
"chars": 1501,
"preview": "# The Sidebar User component\n\nThis component uses the same setup as the [Navbar User](navbar_user.md) except for the eve"
},
{
"path": "Resources/docs/twig_widgets.md",
"chars": 5056,
"preview": "# Twig widgets\n\nIn order to simplify the usage of widget and info boxes, and to help with a consistent look and feel thr"
},
{
"path": "Resources/public/adminlte.css",
"chars": 342715,
"preview": "@charset \"UTF-8\";.daterangepicker{position:absolute;color:inherit;background-color:#fff;border-radius:4px;border:1px sol"
},
{
"path": "Resources/public/adminlte.js",
"chars": 508329,
"preview": "/*! For license information please see adminlte.js.LICENSE.txt */\n(()=>{var e={9261:(e,t,n)=>{\"use strict\";e.exports=n.p"
},
{
"path": "Resources/public/adminlte.js.LICENSE.txt",
"chars": 2258,
"preview": "/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under the MIT licen"
},
{
"path": "Resources/public/entrypoints.json",
"chars": 219,
"preview": "{\n \"entrypoints\": {\n \"adminlte\": {\n \"js\": [\n \"/bundles/adminlte/adminlte.js?4e5af81e7a2186622a4e\"\n "
},
{
"path": "Resources/public/manifest.json",
"chars": 4231,
"preview": "{\n \"bundles/adminlte/adminlte.js\": \"/bundles/adminlte/adminlte.js?4e5af81e7a2186622a4e\",\n \"bundles/adminlte/adminlte.c"
},
{
"path": "Resources/translations/AdminLTEBundle.ar.xliff",
"chars": 4087,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.cs.xliff",
"chars": 4480,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.da.xliff",
"chars": 4357,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.de.xliff",
"chars": 4456,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.el.xliff",
"chars": 4486,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.en.xliff",
"chars": 4355,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.eo.xliff",
"chars": 4372,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.es.xliff",
"chars": 4444,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.eu.xliff",
"chars": 4408,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.fi.xliff",
"chars": 4824,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.fr.xliff",
"chars": 4471,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.he.xliff",
"chars": 4250,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.hr.xliff",
"chars": 4461,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.it.xliff",
"chars": 4227,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.ja.xliff",
"chars": 4202,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.nl.xliff",
"chars": 4783,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.pl.xliff",
"chars": 4464,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.pt_BR.xliff",
"chars": 4346,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.ro.xliff",
"chars": 4420,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.ru.xliff",
"chars": 4243,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.sk.xliff",
"chars": 4452,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.sv.xliff",
"chars": 4772,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.tr.xliff",
"chars": 4364,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff xmlns=\"urn:oasis:names:tc:xliff:document:1.2\" version=\"1.2\">\n <file sou"
},
{
"path": "Resources/translations/AdminLTEBundle.zh_CN.xliff",
"chars": 4072,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n <file so"
},
{
"path": "Resources/views/Breadcrumb/breadcrumb.html.twig",
"chars": 686,
"preview": "{% if active is not defined or adminlte_direct_include is defined %}\n {% set active = adminlte_breadcrumbs(app.reques"
},
{
"path": "Resources/views/Breadcrumb/knp-breadcrumb.html.twig",
"chars": 834,
"preview": "{% if admin_lte_context.knp_menu.breadcrumb_menu is not same as(false) %}\n <ol class=\"breadcrumb\">\n {% apply s"
},
{
"path": "Resources/views/Exception/exception_full.html.twig",
"chars": 4197,
"preview": "{% extends '@AdminLTE/layout/base-layout.html.twig' %}\n{% block page_title %} Error {% endblock %}\n{% block page_subtitl"
},
{
"path": "Resources/views/FOSUserBundle/Registration/confirmed.html.twig",
"chars": 489,
"preview": "{% extends '@AdminLTE/layout/security-layout.html.twig' %}\n\n{% block login_social_auth %}{% endblock %}\n\n{% block login_"
},
{
"path": "Resources/views/FOSUserBundle/Registration/register.html.twig",
"chars": 867,
"preview": "{% extends '@AdminLTE/layout/security-layout.html.twig' %}\n\n{% block login_social_auth %}{% endblock %}\n\n{% block login_"
},
{
"path": "Resources/views/FOSUserBundle/Resetting/request.html.twig",
"chars": 1107,
"preview": "{% extends '@AdminLTE/layout/security-layout.html.twig' %}\n\n{% block login_social_auth %}{% endblock %}\n\n{% block login_"
},
{
"path": "Resources/views/FOSUserBundle/Security/login.html.twig",
"chars": 309,
"preview": "{% extends '@AdminLTE/layout/security-layout.html.twig' %}\n\n{% block login_social_auth %}{% endblock %}\n\n{% block login_"
},
{
"path": "Resources/views/FOSUserBundle/layout.html.twig",
"chars": 364,
"preview": "{% extends '@AdminLTE/layout/security-layout.html.twig' %}\n\n{% block login_social_auth %}{% endblock %}\n\n{% block login_"
},
{
"path": "Resources/views/Macros/buttons.html.twig",
"chars": 1452,
"preview": "{% macro action_toolbutton(icon, action, label) %}\n <button class=\"btn btn-box-tool\" data-widget=\"{{ action }}\" data-"
},
{
"path": "Resources/views/Macros/default.html.twig",
"chars": 1747,
"preview": "{% macro avatar(image, alt, class) %}\n {% if image %}\n <img src=\"{{ asset(image) }}\" class=\"{{ class|default('"
},
{
"path": "Resources/views/Macros/menu.html.twig",
"chars": 2187,
"preview": "{% macro menu_item(item) %}\n {% import _self as menu %}\n {% if item.route or item.hasChildren %}\n <li id=\"{"
},
{
"path": "Resources/views/Navbar/messages.html.twig",
"chars": 1746,
"preview": "{% import \"@AdminLTE/Macros/default.html.twig\" as macro %}\n{% if messages is not defined or adminlte_direct_include is d"
},
{
"path": "Resources/views/Navbar/notifications.html.twig",
"chars": 1419,
"preview": "{% if notifications is not defined or adminlte_direct_include is defined %}\n {% set notifications = null %}\n {% se"
},
{
"path": "Resources/views/Navbar/tasks.html.twig",
"chars": 2068,
"preview": "{% if tasks is not defined or adminlte_direct_include is defined %}\n {% set tasks = null %}\n {% set adminlte_tasks"
},
{
"path": "Resources/views/Navbar/user.html.twig",
"chars": 2478,
"preview": "{% import \"@AdminLTE/Macros/default.html.twig\" as macro %}\n{% if user is not defined or adminlte_direct_include is defin"
},
{
"path": "Resources/views/Partials/_control-sidebar.html.twig",
"chars": 1116,
"preview": "{% if admin_lte_context.control_sidebar is defined and admin_lte_context.control_sidebar is not empty %}\n<aside class=\"c"
},
{
"path": "Resources/views/Partials/_flash_messages.html.twig",
"chars": 343,
"preview": "{% import \"@AdminLTE/Macros/default.html.twig\" as macro %}\n\n{% if app.session and app.session.started and app.session.fl"
},
{
"path": "Resources/views/Partials/_footer.html.twig",
"chars": 262,
"preview": "<footer class=\"main-footer\">\n <!-- To the right -->\n <div class=\"pull-right hidden-xs\">\n Anything you want\n"
},
{
"path": "Resources/views/Partials/_menu.html.twig",
"chars": 2831,
"preview": "{% extends 'knp_menu.html.twig' %}\n\n{% block label %}\n {% if item.labelAttribute('icon') %}<i class=\"{{ item.labelAtt"
},
{
"path": "Resources/views/Sidebar/knp-menu.html.twig",
"chars": 281,
"preview": "{{\n knp_menu_render(admin_lte_context.knp_menu.main_menu, {\n \"template\" : \"@AdminLTE/Partials/_menu.html."
},
{
"path": "Resources/views/Sidebar/menu.html.twig",
"chars": 372,
"preview": "{% from \"@AdminLTE/Macros/menu.html.twig\" import menu_item %}\n{% if menu is not defined or adminlte_direct_include is de"
},
{
"path": "Resources/views/Sidebar/search-form.html.twig",
"chars": 399,
"preview": "<form action=\"#\" method=\"get\" class=\"sidebar-form\">\n <div class=\"input-group\">\n <input type=\"text\" name=\"q\" cl"
},
{
"path": "Resources/views/Sidebar/user-panel.html.twig",
"chars": 556,
"preview": "{% import \"@AdminLTE/Macros/default.html.twig\" as macro %}\n{% if user is not defined or adminlte_direct_include is defin"
},
{
"path": "Resources/views/Widgets/box-widget.html.twig",
"chars": 2825,
"preview": "{% import '@AdminLTE/Macros/buttons.html.twig' as button %}\n{% if block('box_before') is defined %}{{ block('box_before'"
},
{
"path": "Resources/views/Widgets/infobox-widget.html.twig",
"chars": 1126,
"preview": "{% if block('box_before') is defined %}{{ block('box_before') }}{% endif %}\n<div class=\"info-box{% if solid is defined %"
},
{
"path": "Resources/views/layout/default-layout-avanzu.html.twig",
"chars": 4891,
"preview": "{#\n Do not use this layout if you are starting a fresh project with this bundle.\n This file is ONLY meant for migr"
},
{
"path": "Resources/views/layout/default-layout.html.twig",
"chars": 5991,
"preview": "{#\n Use this as your new starter template page, use it to start your new project,\n by adding this code to your own"
},
{
"path": "Resources/views/layout/form-theme-base.html.twig",
"chars": 6799,
"preview": "{% extends 'bootstrap_3_layout.html.twig' %}\n\n{#\n ATTENTION:\n when changing anything in this file, check if the ch"
},
{
"path": "Resources/views/layout/form-theme-horizontal.html.twig",
"chars": 7235,
"preview": "{% extends 'bootstrap_3_horizontal_layout.html.twig' %}\n\n{#\n ATTENTION:\n when changing anything in this file, chec"
},
{
"path": "Resources/views/layout/form-theme-security.html.twig",
"chars": 1061,
"preview": "{% extends '@AdminLTE/layout/form-theme-base.html.twig' %}\n\n{%- block form_widget_simple -%}\n {% if label is defined "
},
{
"path": "Resources/views/layout/form-theme.html.twig",
"chars": 641,
"preview": "{% extends '@AdminLTE/layout/form-theme-base.html.twig' %}\n\n{#\n ATTENTION:\n when changing anything in this file, c"
},
{
"path": "Resources/views/layout/login-layout-avanzu.html.twig",
"chars": 2132,
"preview": "{% extends '@AdminLTE/layout/security-layout.html.twig' %}\n{#\n Do not use this layout if you are starting a fresh pro"
},
{
"path": "Resources/views/layout/security-layout.html.twig",
"chars": 4423,
"preview": "<!DOCTYPE html{% block html_start %}{% endblock %}>\n<html>\n<head>\n {% block head %}\n <meta charset=\"utf-8\">\n <m"
},
{
"path": "Tests/Controller/NavbarControllerTest.php",
"chars": 3918,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/DependencyInjection/ConfigurationTest.php",
"chars": 3969,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Event/MessageListEventTest.php",
"chars": 4017,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Event/NotificationListEventTest.php",
"chars": 4033,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Event/TaskListEventTest.php",
"chars": 3476,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Helper/ContextHelperTest.php",
"chars": 967,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Model/MessageModelTest.php",
"chars": 667,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Model/NotificationModelTest.php",
"chars": 618,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Model/TaskModelTest.php",
"chars": 594,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Model/UserModelTest.php",
"chars": 602,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Twig/AdminExtensionTest.php",
"chars": 1180,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/Twig/RuntimeExtensionTest.php",
"chars": 2450,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Tests/phpstan.neon",
"chars": 65,
"preview": "includes:\n - ../vendor/phpstan/phpstan-phpunit/extension.neon\n"
},
{
"path": "Twig/AdminExtension.php",
"chars": 1466,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Twig/EventsExtension.php",
"chars": 4988,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "Twig/RuntimeExtension.php",
"chars": 2619,
"preview": "<?php\n\n/*\n * This file is part of the AdminLTE bundle.\n *\n * For the full copyright and license information, please view"
},
{
"path": "UPGRADING.md",
"chars": 982,
"preview": "# Upgrading\n\n## From v3 to v4 (unreleased)\n\nRead the changelogs at https://github.com/kevinpapst/AdminLTEBundle/releases"
},
{
"path": "composer.json",
"chars": 1899,
"preview": "{\n \"name\": \"kevinpapst/adminlte-bundle\",\n \"type\": \"symfony-bundle\",\n \"description\": \"Admin theme bundle for Sym"
},
{
"path": "config/packages/admin_lte.yaml",
"chars": 2279,
"preview": "#\n# Configuration file for the AdminLTE bundle\n#\n# For more information about the bundle settings visit:\n# https://githu"
},
{
"path": "package.json",
"chars": 759,
"preview": "{\n \"devDependencies\": {\n \"@fortawesome/fontawesome-free\": \"~5.15.2\",\n \"@symfony/webpack-encore\": \"^1.0."
},
{
"path": "phpstan.neon",
"chars": 270,
"preview": "includes:\n - vendor/phpstan/phpstan-phpunit/extension.neon\n\nparameters:\n excludes_analyse:\n - %rootDir%/../"
},
{
"path": "phpunit.xml.dist",
"chars": 820,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:noNa"
},
{
"path": "webpack.config.js",
"chars": 1657,
"preview": "var Encore = require('@symfony/webpack-encore');\n\nEncore\n// the project directory where compiled assets will be stored\n "
}
]
About this extraction
This page contains the full source code of the kevinpapst/AdminLTEBundle GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 160 files (1.2 MB), approximately 382.5k tokens, and a symbol index with 773 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.