From e82570e3ab3b35ef6ad3412810d9b5ba3cb539de Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 12 Jul 2019 13:53:36 +0300 Subject: [PATCH 1/4] added dashboard doc/tutorial --- docs/en/AspNetCore/DashboardWidgetSystem.md | 559 ++++++++++++++++++++ docs/en/docs-nav.json | 4 + docs/en/images/MonthlyProfitWidgetFiles.png | Bin 0 -> 6449 bytes docs/en/images/dashboard1.png | Bin 0 -> 43797 bytes 4 files changed, 563 insertions(+) create mode 100644 docs/en/AspNetCore/DashboardWidgetSystem.md create mode 100644 docs/en/images/MonthlyProfitWidgetFiles.png create mode 100644 docs/en/images/dashboard1.png diff --git a/docs/en/AspNetCore/DashboardWidgetSystem.md b/docs/en/AspNetCore/DashboardWidgetSystem.md new file mode 100644 index 0000000000..a50d4d6777 --- /dev/null +++ b/docs/en/AspNetCore/DashboardWidgetSystem.md @@ -0,0 +1,559 @@ +# Dashboard & Widget System + +Dashboard & Widget System allows you to create reusable widgets and dashboards. + +![](D:\github\abp\docs\en\images\dashboard1.png) + +You can see a sample dashboard, build with that system, in the screenshot above. Top section, where the filters and refresh button is placed is global filter section and each card below is a widget. Both widgets and global filters are reusable components. Also dashboard layout is reusable too. + +Now we will see how those are defined, used in an application. + +## Dashboard Component + +Firstly, we will define a dashboard in our application (you can download a new application template from [abp.io/get-started](https://abp.io/get-started). To keep it simple, Please don't use tiered option). + +In *.Web project, we create **DashboardNames.cs** and **DashboardDefinitionProvider.cs** classes: + +```c# + public static class DashboardNames + { + public const string MyDashboard = "MyDashboard"; + + public static string[] GetAll() + { + return ReflectionHelper.GetPublicConstantsRecursively(typeof(DashboardNames)); + } + } +``` + +```c# + public static class DashboardDefinitionProvider + { + public static List GetDefinitions() + { + var myDashboard = new DashboardDefinition( + DashboardNames.MyDashboard, + LocalizableString.Create("MyDashboard") + ); + + return new List + { + myDashboard + }; + } + } +``` + +We need to add that definition to **DashboardOptions** in **ConfigureServices** method of ***WebModule.cs** file: + +```c# +using Volo.Abp.AspNetCore.Mvc.UI.Dashboards; +//... + public class DashboardDemoWebModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + //other codes.. + Configure(options => + { + options.Dashboards.AddRange(DashboardDefinitionProvider.GetDefinitions()); + }) + //other codes.. + } + //other codes.. + } +``` + +Then we can create the view file that the dashboard we have defined will be rendered, **Pages/MyDashboard.cshtml**: + +```html +@page +@using DashboardDemo.Dashboards +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Dashboards +@using Volo.Abp.AspNetCore.Mvc.UI.Widgets +@inject IWidgetRenderer WidgetRenderer +@inject IDashboardRenderer DashboardRenderer +@inject IStringLocalizerFactory localizer +@model DashboardDemo.Pages.MyDashboardModel +@{ +} +@section styles { + +} +@section scripts { + +} + + @await DashboardRenderer.RenderAsync(Component, new { dashboardName = DashboardNames.MyDashboard }) + + +``` + +**DashboardRenderer.RenderAsync** method renders the dashboard we have defined. Now we have to define the script and style bundles that you can see their usage in the code above: + +```c# + [DependsOn(typeof(AbpBasicDashboardStyleContributor))] + public class MyDashboardStyleBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + + } + } +``` + +```c# + [DependsOn(typeof(AbpBasicDashboardScriptContributor))] + public class MyDashboardScriptBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + + } + } +``` + +The dashboard system uses [Bundling & Minification](../Bundling-Minification.md) for scripts and styles. Dashboard contributors will be dependent on their widget and global filter contributors, and widget and global filters will be dependent on the other contributors they need. This guarantees that more than one widget can request a javascript library and it won't be duplicated. + +We need to add those contributors to bundling options in **ConfigureServices** method of ***WebModule.cs** file: + +```c# + Configure(options => + { + options.ScriptBundles.Add(DashboardNames.MyDashboard, configuration => + { + configuration.AddContributors(typeof(MyDashboardScriptBundleContributor)); + }); + + options.StyleBundles.Add(DashboardNames.MyDashboard, configuration => + { + configuration.AddContributors(typeof(MyDashboardStyleBundleContributor)); + }); + }); +``` + +Now we can start to create widgets. + +## Widgets + +Widgets are view components those are rendered in order when you add them to a dashboard. They also can be rendered anywhere you like. + +We will see how to create a widget and add it to the dashboard we created. We will create the "Monthly profit" widget in the screenshot at the beginning of this tutorial. + +Before creating our widget, we need a application service to return dummy data for our widget. + +```c# +namespace DashboardDemo +{ + public interface IDemoStatisticAppService : IApplicationService + { + Task GetMonthlyUserStatistic(FilterDto filter); + + Task GetMonthlyProfitStatistic(FilterDto filter); + } + + public class DemoStatisticAppService : ApplicationService, IDemoStatisticAppService + { + public async Task GetMonthlyProfitStatistic(FilterDto filter) + { + var monthCount = GetLabels(filter, out var monthList); + + var data = Enumerable + .Repeat(0, monthCount) + .Select(i => new Random().Next(-20, 40)) + .ToArray(); + + return new MonthlyProfitStatisticDto { Labels = monthList.ToArray(), Data = data }; + } + + private static int GetLabels(FilterDto filter, out List monthList) + { + DateTime endDate = filter.EndDate ?? DateTime.Now; + DateTime startDate = filter.StartDate ?? DateTime.Now.AddYears(-1); + + if (filter.StartDate > filter.EndDate) + { + throw new BusinessException("Start date can not be greater than end date."); + } + + var months = new[] {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"}; + var monthCount = (endDate.Year - startDate.Year) * 12 + endDate.Month - startDate.Month +1; + monthList = new List(); + + for (int i = 0; i < monthCount; i++) + { + monthList.Add(months[endDate.Month-1]); + endDate = endDate.AddMonths(-1); + } + + monthList.Reverse(); + + return monthCount; + } + } + + public class MonthlyProfitStatisticDto + { + public string[] Labels { get; set; } + + public int[] Data { get; set; } + } + + public class FilterDto + { + public DateTime? StartDate { get; set; } + + public DateTime? EndDate { get; set; } + } +} +``` + +We will use **FilterDto** in **Global Filters** section. + +Now we can start to work on our widget. + +![](D:\github\abp\docs\en\images\MonthlyProfitWidgetFiles.png) + +You can see the files that we will create our widget. (If your widget won't need css or javascript, you don't need to create them and contributors as well.) + +First we create the **MonthlyProfitWidgetViewComponent**: + +```html +@inject IHtmlLocalizer L +@using DashboardDemo.Localization.DashboardDemo +@using Microsoft.AspNetCore.Mvc.Localization +@model DashboardDemo.Pages.widgets.MonthlyProfitWidgetViewComponent +@{ +} +
+ + @L["Monthly Profit"] + +
+ +
+
+
+
+ +``` + +```c# + public class MonthlyProfitWidgetViewComponent : AbpViewComponent + { + public const string Name = "MonthlyProfitWidget"; + + public const string DisplayName = "Monthly Profit Widget"; + + public IViewComponentResult Invoke() + { + return View("/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml", new MonthlyProfitWidgetViewComponent()); + } + } +``` + +We will use [chart.js library](https://www.chartjs.org/) to create the chart. To add this library to our project, we add the package dependency to **package.json**: + +```json + "dependencies": { + //other dependencies... + "chart.js": "^2.8.0" + } +``` + +Then add the mapping **abp.resourcemappings.js**: (see [related doc](/AspNetCore/Client-Side-Package-Management#resource-mapping-definition-file)) + +```js + mappings: { + //other mappings... + "@node_modules/chart.js/dist/*.*": "@libs/chart.js/" + } +``` + +Now we have chart.js library in our application. In order to use it, we will create it's contributors: + +```c# + public class ChartjsScriptContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/libs/chart.js/Chart.js"); + } + } + + public class ChartjsStyleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/libs/chart.js/Chart.css"); + } + } +``` + +Well. Now we create the contributors for our widget files and make them dependent on chart.js: + +```c# + [DependsOn(typeof(JQueryScriptContributor))] + [DependsOn(typeof(ChartjsScriptContributor))] + public class MonthlyProfitWidgetScriptBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.js"); + } + } + + [DependsOn(typeof(BootstrapStyleContributor))] + [DependsOn(typeof(ChartjsStyleContributor))] + public class MonthlyProfitWidgetStyleBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.css"); + } + } +``` + +**MonthlyProfitWidget.css** is empty for our widget. + +**MonthlyProfitWidget.js** content is below: + +```js +(function ($) { + var $container = $('#MonthlyProfitWidgetContainer'); + if ($container.length > 0) { + var chart = {}; + + var createChart = function () { + dashboardDemo.demoStatistic.getMonthlyProfitStatistic({}).then(function (result) { + chart = new Chart($container.find('#MonthlyProfitStatistics'), { + type: 'line', + data: { + labels: result.labels, + datasets: [{ + label: 'Monthly Profit', + data: result.data, + backgroundColor: 'rgba(255, 255, 132, 0.2)' + }] + }, + options: { + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + }); + }; + + createChart(); + } +})(jQuery); + +``` + +We have created our widget. There is one last thing before adding it to dashboard; we need to define it: + +```c# + public static class WidgetDefinitionProvider + { + public static List GetDefinitions() + { + //other widgets... + + var monthlyProfitWidget = new WidgetDefinition( + MonthlyProfitWidgetViewComponent.Name, + LocalizableString.Create(MonthlyProfitWidgetViewComponent.DisplayName), + typeof(MonthlyProfitWidgetViewComponent) + ) + .SetDefaultDimension(6, 4) + .AddRequiredPermission(IdentityPermissions.Users.Default); + + return new List + { + //other widgets... + monthlyProfitWidget + }; + } + } +``` + +**.SetDefaultDimension(int x, int y):** Sets the dimensions of the widget. This will be used when rendering it in dashboard. X is for column width in bootstrap, can be between 1 and 12. Y is height in pixels, will be multiplied by 100. + +**AddRequiredPermission(string permissionName)**: Sets the permission for widget. So a user that doesn't have this permission will not see this widget. + +We need to add the widget definitions to **WidgetOptions** in **ConfigureServices** method of ***WebModule.cs** file as well: + +```c# + Configure(options => + { + options.Widgets.AddRange(WidgetDefinitionProvider.GetDefinitions()); + }); +``` + +Now our widget is ready to use. We will use **WithWidget** method to add it to our dashboard in **DashboardDefinitionProvider.cs**: + +```c# + var myDashboard = new DashboardDefinition( + DashboardNames.MyDashboard, + LocalizableString.Create("MyDashboard")) + .WithWidget(MonthlyProfitWidgetViewComponent.Name); +``` + +And add the javascript and contributor dependencies to dashboard: + +```c# + [DependsOn(typeof(MonthlyProfitWidgetScriptBundleContributor))] // <<<<<< + [DependsOn(typeof(AbpBasicDashboardScriptContributor))] + public class MyDashboardScriptBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + + } + } + + [DependsOn(typeof(MonthlyProfitWidgetStyleBundleContributor))] // <<<<<< + [DependsOn(typeof(AbpBasicDashboardStyleContributor))] + public class MyDashboardStyleBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + + } + } +``` + +Now start your application and go to **/MyDashboard** page. + +## Global Filters + +Global filters are used for filtering all widgets with same input. If you add a global filter to a dashboard, a refresh button will appear for refreshing widgets with new filter values. When this button is clicked, it serializes filters to object and fires an event with that object as parameter. + +Let's implement a **date range** global filter. + +First, we need to create **DateRangeGlobalFilterViewComponent.cshtml**: + +```html +@inject IHtmlLocalizer L +@using DashboardDemo.Localization.DashboardDemo +@using Microsoft.AspNetCore.Mvc.Localization +@model DashboardDemo.Pages.widgets.Filters.DateRangeGlobalFilterViewComponent +@{ +} +
+
+
+ + +
+
+ + +
+
+
+ + +``` + +```c# +namespace DashboardDemo.Pages.widgets.Filters +{ + [ViewComponent] + public class DateRangeGlobalFilterViewComponent : ViewComponent + { + public const string Name = "DateRangeGlobalFilter"; + + public const string DisplayName = "Date Range Filter"; + + public IViewComponentResult Invoke() + { + return View("/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml", new DateRangeGlobalFilterViewComponent()); + } + } +} +``` + +You can add javascript and css files in the same way you add them to widgets, but in this example they are not needed. + +We will add the global filter definitions to **GlobalFilterOptions** in **ConfigureServices** method of ***WebModule.cs** file as well: + +```c# + Configure(options => + { + options.GlobalFilters.AddRange(GlobalFilterDefinitionProvider.GetDefinitions()); + }); +``` + +And add it to our dashboard in **DashboardDefinitionProvider.cs** using **WithGlobalFilter** method: + +```c# + var myDashboard = new DashboardDefinition( + DashboardNames.MyDashboard, + LocalizableString.Create("MyDashboard")) + .WithWidget(MonthlyProfitWidgetViewComponent.Name) + .WithGlobalFilter(DateRangeGlobalFilterViewComponent.Name); +``` + +That's it! Now let's catch the refresh event in our widget: + +```js +(function ($) { + var $container = $('#MonthlyProfitWidgetContainer'); + if ($container.length > 0) { + var chart = {}; + + var createChart = function () { + dashboardDemo.demoStatistic.getMonthlyProfitStatistic({}).then(function (result) { + chart = new Chart($container.find('#MonthlyProfitStatistics'), { + type: 'line', + data: { + labels: result.labels, + datasets: [{ + label: 'Monthly Profit', + data: result.data, + backgroundColor: 'rgba(255, 255, 132, 0.2)' + }] + }, + options: { + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + }); + }; + + $(document).on('RefreshWidgets', + function (event, filters) { + dashboardDemo.demoStatistic.getMonthlyProfitStatistic({ startDate: filters.startDate, endDate: filters.endDate }).then(function (result) { + chart.data = { + labels: result.labels, + datasets: [{ + label: 'Monthly Profit', + data: result.data, + backgroundColor: 'rgba(255, 255, 132, 0.2)' + }] + }, + chart.update(); + }); + }); + + createChart(); + } +})(jQuery); + +``` + +## Source Code + +You can see a sample application for dashboard at [Github](https://github.com/abpframework/abp/tree/dev/samples/DashboardDemo). \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 27ebb86a2c..efa9b7d023 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -220,6 +220,10 @@ "text": "Tag Helpers", "path": "AspNetCore/Tag-Helpers/Index.md" }, + { + "text": "Dashboard & Widget System", + "path": "AspNetCore/Tag-Helpers/DashboardWidgetSystem.md" + }, { "text": "Theming", "path": "AspNetCore/Theming.md" diff --git a/docs/en/images/MonthlyProfitWidgetFiles.png b/docs/en/images/MonthlyProfitWidgetFiles.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e9d316f5b36b008ac67050fa151a7ef956abb4 GIT binary patch literal 6449 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/dashboard1.png b/docs/en/images/dashboard1.png new file mode 100644 index 0000000000000000000000000000000000000000..4102bbd4c13e44a9f68b55d71fe82ece78a8e4d3 GIT binary patch literal 43797 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�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 JC>7>){ZIWd+D`xg literal 0 HcmV?d00001 From 14a7d87d8d9413ed65f5863789680d2996794660 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 16 Jul 2019 08:35:51 +0300 Subject: [PATCH 2/4] Update abp.resourcemapping.js --- .../DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js b/samples/DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js index 06d0a801e4..a613fb0925 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js +++ b/samples/DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js @@ -1,7 +1,5 @@ module.exports = { mappings: { "@node_modules/chart.js/dist/*.*": "@libs/chart.js/" - //"@node_modules/chartjs-color/*.*": "@libs/chartjs-color/", - //"@node_modules/chartjs-color-string/*.*": "@libs/chartjs-color-string/" } }; From 1f74ae3c673bd510f2623a45aab7648574b6ed12 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 19 Jul 2019 09:33:50 +0300 Subject: [PATCH 3/4] rename doc file --- .../{DashboardWidgetSystem.md => Dashboard-Widget-System.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/en/AspNetCore/{DashboardWidgetSystem.md => Dashboard-Widget-System.md} (100%) diff --git a/docs/en/AspNetCore/DashboardWidgetSystem.md b/docs/en/AspNetCore/Dashboard-Widget-System.md similarity index 100% rename from docs/en/AspNetCore/DashboardWidgetSystem.md rename to docs/en/AspNetCore/Dashboard-Widget-System.md From f00b3e5dcdb963aa0ebd384b55505b7fbc039aeb Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 19 Jul 2019 09:37:39 +0300 Subject: [PATCH 4/4] add image texts --- docs/en/AspNetCore/Dashboard-Widget-System.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/AspNetCore/Dashboard-Widget-System.md b/docs/en/AspNetCore/Dashboard-Widget-System.md index a50d4d6777..70a95b746b 100644 --- a/docs/en/AspNetCore/Dashboard-Widget-System.md +++ b/docs/en/AspNetCore/Dashboard-Widget-System.md @@ -2,7 +2,7 @@ Dashboard & Widget System allows you to create reusable widgets and dashboards. -![](D:\github\abp\docs\en\images\dashboard1.png) +![Image of a sample, create with this system](D:\github\abp\docs\en\images\dashboard1.png) You can see a sample dashboard, build with that system, in the screenshot above. Top section, where the filters and refresh button is placed is global filter section and each card below is a widget. Both widgets and global filters are reusable components. Also dashboard layout is reusable too. @@ -213,7 +213,7 @@ We will use **FilterDto** in **Global Filters** section. Now we can start to work on our widget. -![](D:\github\abp\docs\en\images\MonthlyProfitWidgetFiles.png) +![widget file tree](D:\github\abp\docs\en\images\MonthlyProfitWidgetFiles.png) You can see the files that we will create our widget. (If your widget won't need css or javascript, you don't need to create them and contributors as well.)