OroDashboardBundle
OroDashboardBundle introduces different widget types and manages the configuration of user dashboards and dashboard widgets. A dashboard is a default page you see after you log in. It is an adjustable view that contains many types of information blocks (widgets) and metrics, such as today’s calendar, recent calls and emails, quick launchpad, etc. You can have several dashboards that serve different purposes and switch between them.
Configure a Dashboard
To configure a dashboard, add your code into the Resources/config/oro/dashboards.yml file of your bundle. For example:
dashboards:
# Configuration of widgets
widgets: # widget declaration section
quick_launchpad: # widget name
icon_class: fa-rocket # name of FontAwesome class for an icon shown on widget add dialog
icon: icon.png # widget icon shown on widget add dialog, in case the iconClass is not defined
description: Text # description of widget
acl: acl_resource # acl resource of dashboard
route: oro_dashboard_itemized_widget # widget route
route_parameters: { bundle: OroDashboard, name: quickLaunchpad } # additional route parameters
isNew: true # show or not "New" label next to the title
# Configuration of dashboards
dashboards: # dashboard configuration section
main: # dashboard name
twig: '@OroDashboard/Index/default.html.twig' # dashboard template (used by default)
To view all configuration options, launch the config:dump-reference command:
php bin/console config:dump-reference OroDashboardBundle
Add a New Widget
A widget is a twig template that is displayed in the desired position on the dashboard. As an illustration, let us create a widget that will display information in the form of a datagrid table.
To create such widget, first, make sure you create a grid using datagrids.yml. Below is an example of creating a dashboard-recent-calls-grid grid:
datagrids:
dashboard-recent-calls-grid:
options:
entityHint: call
source:
type: orm
acl_resource: oro_call_view
query:
select:
- call.id
- call.subject
- call.phoneNumber as phone
- call.callDateTime as dateTime
- directionType.name as callDirection
from:
- { table: 'Oro\Bundle\CallBundle\Entity\Call', alias: call }
join:
left:
- { join: call.direction, alias: directionType }
inner:
- { join: call.owner, alias: ownerUser }
where:
and:
- ownerUser.id = @oro_security.token_accessor->getUserId
columns:
callDirection:
type: twig
label: ~
frontend_type: html
template: '@OroCall/Datagrid/Column/direction.html.twig'
dateTime:
label: orocrm.call.datagrid.date_time
frontend_type: datetime
subject:
type: twig
label: orocrm.call.subject.label
frontend_type: html
template: '@OroCall/Datagrid/Column/subject.html.twig'
phone:
label: orocrm.call.phone_number.label
sorters:
columns:
dateTime:
data_name: call.callDateTime
default:
dateTime: DESC
options:
toolbarOptions:
hide: true
pageSize:
items: [10]
default_per_page: 10
Next, create a TWIG template that renders your grid and place it in your bundle’s Resources/views/Dashboard directory. The example below shows how to create recentCalls.html.twig:
{% extends '@OroDashboard/Dashboard/widget.html.twig' %}
{% import '@OroDataGrid/macros.html.twig' as dataGrid %}
{% block content %}
{{ dataGrid.renderGrid('dashboard-recent-calls-grid') }}
{% endblock %}
{% block actions %}
{% set actions = [{
'url': path('oro_call_index'),
'type': 'link',
'label': 'orocrm.dashboard.recent_calls.view_all'|trans
}] %}
{{ parent() }}
{% endblock %}
Next, register the widget and add it to the appropriate dashboard using dashboards.yml. For example:
dashboards:
widgets:
recent_calls: # register a widget
label: orocrm.dashboard.recent_calls.title
route: oro_dashboard_widget # you can use existing controller to render your TWIG template
route_parameters: { bundle: OroCall, name: recentCalls } # just specify a bundle and a TWIG template name
acl: oro_call_view
You can find some additional TWIG templates for primarily used widgets, such as tabbed, itemized (a widget contains some items, for example, links), chart and others located in the OroDashboardBundle/Resources/views/Dashboard
directory.
Configure a Widget
Each widget can have its own configuration. Configuration values are stored for each widget instance on the dashboard.
To add configuration, make sure that widget configuration contains a ‘configuration’ block with a list of available configuration values. For example:
dashboards:
widgets:
my_test_chart:
...
configuration:
testValue: # field name
type: text # field type
options: # field options
label: acme.test.label # field label
show_on_widget: true # if true - value of config parameter will be shown at the bottom of widget. By default - false
To add some config value to all widgets, use the ‘widgets_configuration’ block of the dashboards.yml file. For example:
dashboards:
widgets_configuration:
globalConfigParameter:
type: text
options:
label: acme.globalConfigParameter.label
Add a New Dashboard to a User
To add a new dashboard defined in the dashboards.yml file (as described above) to a user, or modify an existing one, use the following data migration:
namespace Oro\Bundle\DashboardBundle\Migrations\Data\ORM;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Oro\Bundle\DashboardBundle\Migrations\Data\ORM\AbstractDashboardFixture;
use Oro\Bundle\UserBundle\Migrations\Data\ORM\LoadAdminUserData;
class LoadDashboardData extends AbstractDashboardFixture implements DependentFixtureInterface
{
/**
* {@inheritDoc}
*/
public function getDependencies(): array
{
// we need admin user as a dashboard owner
return [LoadAdminUserData::class];
}
/**
* {@inheritDoc}
*/
public function load(ObjectManager $manager): void
{
// create new dashboard
$dashboard = $this->createAdminDashboardModel(
$manager, // pass ObjectManager
'new_dashoard' // dashboard name
);
// to update existing one
$dashboard = $this->findAdminDashboardModel(
$manager, // pass ObjectManager
'existing_one' // dashboard name
);
$dashboard
// if user doesn't have active dashboard this one will be used
->setIsDefault(true)
// dashboard label
->setLabel(
$this->container->get('translator')->trans('oro.dashboard.title.main')
)
// add widgets one by one
->addWidget(
$this->createWidgetModel(
'quick_launchpad', // widget name from yml configuration
[
0, // column, starting from left
10 // position, starting from top
]
)
);
$manager->flush();
}
}