diff --git a/samples/DashboardDemo/src/DashboardDemo.Application/DemoStatisticAppService.cs b/samples/DashboardDemo/src/DashboardDemo.Application/DemoStatisticAppService.cs index 9651c7cbdb..00ff771305 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Application/DemoStatisticAppService.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Application/DemoStatisticAppService.cs @@ -18,5 +18,15 @@ namespace DashboardDemo return new NewUserPerDayStatisticDto{Data = data}; } + + public async Task GetMonthlyProfitStatistic() + { + var data = Enumerable + .Repeat(0, 12) + .Select(i => new Random().Next(-20, 40)) + .ToArray(); + + return new MonthlyProfitStatisticDto { Data = data }; + } } } diff --git a/samples/DashboardDemo/src/DashboardDemo.Application/IDemoStatisticAppService.cs b/samples/DashboardDemo/src/DashboardDemo.Application/IDemoStatisticAppService.cs index 6f7efc064f..5086e94eb8 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Application/IDemoStatisticAppService.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Application/IDemoStatisticAppService.cs @@ -9,5 +9,7 @@ namespace DashboardDemo public interface IDemoStatisticAppService : IApplicationService { Task GetNewUserPerDayStatistic(); + + Task GetMonthlyProfitStatistic(); } } diff --git a/samples/DashboardDemo/src/DashboardDemo.Application/MonthlyProfitStatisticDto.cs b/samples/DashboardDemo/src/DashboardDemo.Application/MonthlyProfitStatisticDto.cs new file mode 100644 index 0000000000..9682b3b025 --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Application/MonthlyProfitStatisticDto.cs @@ -0,0 +1,7 @@ +namespace DashboardDemo +{ + public class MonthlyProfitStatisticDto + { + public int[] Data { get; set; } + } +} \ No newline at end of file diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Dashboards/DashboardDefinitionProvider.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Dashboards/DashboardDefinitionProvider.cs index 5d88d36f1b..fd9553775e 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Dashboards/DashboardDefinitionProvider.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Dashboards/DashboardDefinitionProvider.cs @@ -15,9 +15,10 @@ namespace DashboardDemo.Dashboards DashboardNames.MyDashboard, LocalizableString.Create("MyDashboard") ) - .WithWidget(RoleListWidgetViewComponent.WidgetName) .WithWidget(UserCountWidgetViewComponent.WidgetName) - .WithGlobalFilter(DateRangeGlobalFilterViewComponent.GlobalFilterName); + .WithWidget(RoleListWidgetViewComponent.WidgetName) + .WithWidget(MonthlyProfitWidgetViewComponent.WidgetName) + .WithGlobalFilter(RefreshGlobalFilterViewComponent.GlobalFilterName); return new List { diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/GlobalFilters/GlobalFilterDefinitionProvider.cs b/samples/DashboardDemo/src/DashboardDemo.Web/GlobalFilters/GlobalFilterDefinitionProvider.cs index d6a51a8612..812cb8c0c4 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/GlobalFilters/GlobalFilterDefinitionProvider.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/GlobalFilters/GlobalFilterDefinitionProvider.cs @@ -15,9 +15,9 @@ namespace DashboardDemo.GlobalFilters public static List GetDefinitions() { var dateRangeFilter = new GlobalFilterDefinition( - DateRangeGlobalFilterViewComponent.GlobalFilterName, + RefreshGlobalFilterViewComponent.GlobalFilterName, LocalizableString.Create("DateRangeFilter"), - typeof(DateRangeGlobalFilterViewComponent) + typeof(RefreshGlobalFilterViewComponent) ); return new List diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardScriptBundleContributor.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardScriptBundleContributor.cs index 6b188a7cd5..a3cfb29865 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardScriptBundleContributor.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardScriptBundleContributor.cs @@ -8,6 +8,7 @@ namespace DashboardDemo.Pages [DependsOn( typeof(AbpBasicDashboardScriptContributor), typeof(UserCountWidgetScriptBundleContributor), + typeof(MonthlyProfitWidgetScriptBundleContributor), typeof(RoleListWidgetScriptContributor) )] public class MyDashboardScriptBundleContributor : BundleContributor diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardStyleBundleContributor.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardStyleBundleContributor.cs index 5ef18e0b25..20422e5715 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardStyleBundleContributor.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboardStyleBundleContributor.cs @@ -8,6 +8,7 @@ namespace DashboardDemo.Pages [DependsOn( typeof(AbpBasicDashboardStyleContributor), typeof(UserCountWidgetStyleBundleContributor), + typeof(MonthlyProfitWidgetStyleBundleContributor), typeof(RoleListWidgetStyleContributor) )] public class MyDashboardStyleBundleContributor : BundleContributor diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilter.js b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilter.js deleted file mode 100644 index 0aaf09886a..0000000000 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilter.js +++ /dev/null @@ -1,6 +0,0 @@ -(function ($) { - var $container = $('#DateRangeGlobalFilterContainer'); - if ($container.length > 0) { - console.log("GlobalRefreshButton loaded"); - } -})(jQuery); diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml.cs deleted file mode 100644 index e9ad22e994..0000000000 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace DashboardDemo.Pages.widgets.Filters -{ - [ViewComponent] - public class DateRangeGlobalFilterViewComponent : ViewComponent - { - public const string GlobalFilterName = "DateRangeGlobalFilter"; - - public const string DisplayName = "Date Range Filter"; - - public IViewComponentResult Invoke() - { - return View("/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml", new DateRangeGlobalFilterViewComponent()); - } - } -} \ No newline at end of file diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilter.js b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilter.js new file mode 100644 index 0000000000..507133527d --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilter.js @@ -0,0 +1,6 @@ +(function ($) { + var $container = $('#RefreshGlobalFilterContainer'); + if ($container.length > 0) { + + } +})(jQuery); diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterScriptContributor.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterScriptContributor.cs similarity index 57% rename from samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterScriptContributor.cs rename to samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterScriptContributor.cs index 2af313857c..efd5a18e6a 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterScriptContributor.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterScriptContributor.cs @@ -2,11 +2,11 @@ namespace DashboardDemo.Pages.widgets.Filters { - public class DateRangeGlobalFilterScriptContributor : BundleContributor + public class RefreshGlobalFilterScriptContributor : BundleContributor { public override void ConfigureBundle(BundleConfigurationContext context) { - context.Files.Add("/Pages/widgets/Filters/DateRangeGlobalFilter.js"); + context.Files.Add("/Pages/widgets/Filters/RefreshGlobalFilter.js"); } } } diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml similarity index 67% rename from samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml rename to samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml index 0b2cfdbc05..cf7eb5f9bd 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/DateRangeGlobalFilterViewComponent.cshtml +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml @@ -1,10 +1,10 @@ @inject IHtmlLocalizer L @using DashboardDemo.Localization.DashboardDemo @using Microsoft.AspNetCore.Mvc.Localization -@model DashboardDemo.Pages.widgets.Filters.DateRangeGlobalFilterViewComponent +@model DashboardDemo.Pages.widgets.Filters.RefreshGlobalFilterViewComponent @{ } -
+
diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml.cs new file mode 100644 index 0000000000..99d849e1a1 --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; + +namespace DashboardDemo.Pages.widgets.Filters +{ + [ViewComponent] + public class RefreshGlobalFilterViewComponent : ViewComponent + { + public const string GlobalFilterName = "RefreshGlobalFilter"; + + public const string DisplayName = "Refresh Filter"; + + public IViewComponentResult Invoke() + { + return View("/Pages/widgets/Filters/RefreshGlobalFilterViewComponent.cshtml", new RefreshGlobalFilterViewComponent()); + } + } +} \ No newline at end of file diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.css b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.css new file mode 100644 index 0000000000..587c5f117b --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.css @@ -0,0 +1,3 @@ +body { + margin: 0; +} diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.js b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.js new file mode 100644 index 0000000000..8042d525e0 --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.js @@ -0,0 +1,45 @@ +(function ($) { + var $container = $('#MonthlyProfitWidgetContainer'); + if ($container.length > 0) { + var chart = {}; + var $RefreshGlobalFilterContainer = $("#RefreshGlobalFilterContainer"); + + var createChart = function () { + dashboardDemo.demoStatistic.getMonthlyProfitStatistic().then(function (result) { + + chart = new Chart($container.find('#MonthlyProfitStatistics'), { + type: 'line', + data: { + labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], + datasets: [{ + label: 'Monthly Profit', + data: result.data, + backgroundColor: 'rgba(255, 255, 132, 0.2)' + }] + }, + options: { + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + }); + }; + + if ($RefreshGlobalFilterContainer.length > 0) { + $RefreshGlobalFilterContainer.find('#GlobalRefreshButton').on('click', + function () { + dashboardDemo.demoStatistic.getMonthlyProfitStatistic().then(function (result) { + chart.data.datasets[0].data = result.data; + chart.update(); + }); + }); + } + + createChart(); + } +})(jQuery); diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetScriptBundleContributor.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetScriptBundleContributor.cs new file mode 100644 index 0000000000..f06cabf8a9 --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetScriptBundleContributor.cs @@ -0,0 +1,21 @@ +using DashboardDemo.Pages.widgets.Chartjs; +using DashboardDemo.Pages.widgets.Filters; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.Clipboard; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery; +using Volo.Abp.Modularity; + +namespace DashboardDemo.Pages.widgets +{ + [DependsOn(typeof(JQueryScriptContributor))] + [DependsOn(typeof(ClipboardScriptBundleContributor))] + [DependsOn(typeof(ChartjsScriptContributor))] + [DependsOn(typeof(RefreshGlobalFilterScriptContributor))] + public class MonthlyProfitWidgetScriptBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.js"); + } + } +} \ No newline at end of file diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetStyleBundleContributor.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetStyleBundleContributor.cs new file mode 100644 index 0000000000..2823361ff5 --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetStyleBundleContributor.cs @@ -0,0 +1,20 @@ +using DashboardDemo.Pages.widgets.Chartjs; +using DashboardDemo.Pages.widgets.Filters; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.Bootstrap; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs; +using Volo.Abp.Modularity; + +namespace DashboardDemo.Pages.widgets +{ + [DependsOn(typeof(BootstrapStyleContributor))] + [DependsOn(typeof(HighlightJsStyleContributor))] + [DependsOn(typeof(ChartjsStyleContributor))] + public class MonthlyProfitWidgetStyleBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidget.css"); + } + } +} diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml new file mode 100644 index 0000000000..702bed5acd --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml @@ -0,0 +1,16 @@ +@inject IHtmlLocalizer L +@using DashboardDemo.Localization.DashboardDemo +@using Microsoft.AspNetCore.Mvc.Localization +@model DashboardDemo.Pages.widgets.MonthlyProfitWidgetViewComponent +@{ +} +
+ + @L["Monthly Profit"] + +
+ +
+
+
+
diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml.cs new file mode 100644 index 0000000000..2a8f96c5e2 --- /dev/null +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; + +namespace DashboardDemo.Pages.widgets +{ + public class MonthlyProfitWidgetViewComponent : AbpViewComponent + { + public const string WidgetName = "MonthlyProfitWidget"; + + public const string DisplayName = "Monthly Profit Widget"; + + public IViewComponentResult Invoke() + { + return View("/Pages/widgets/MonthlyProfitWidget/MonthlyProfitWidgetViewComponent.cshtml", new MonthlyProfitWidgetViewComponent()); + } + } +} \ No newline at end of file diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidget.js b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidget.js index 9d4ca3ccea..00270c1b99 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidget.js +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidget.js @@ -1,14 +1,15 @@ (function ($) { var $container = $('#UserCountWidgetContainer'); if ($container.length > 0) { + var chart = {}; - var $DateRangeGlobalFilterContainer = $("#DateRangeGlobalFilterContainer"); + var $DateRangeGlobalFilterContainer = $("#RefreshGlobalFilterContainer"); var createChart = function () { dashboardDemo.demoStatistic.getNewUserPerDayStatistic().then(function (result) { - var chart = new Chart($container.find('#UserStatistics'), { + chart = new Chart($container.find('#UserStatistics'), { type: 'bar', data: { labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', "Sun"], @@ -34,7 +35,11 @@ if ($DateRangeGlobalFilterContainer.length > 0) { $DateRangeGlobalFilterContainer.find('#GlobalRefreshButton').on('click', function () { - createChart(); + dashboardDemo.demoStatistic.getNewUserPerDayStatistic().then(function (result) { + + chart.data.datasets[0].data = result.data; + chart.update(); + }); }); } diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidgetScriptBundleContributor.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidgetScriptBundleContributor.cs index de7f39a754..b0799cecd6 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidgetScriptBundleContributor.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/widgets/UserCountWidget/UserCountWidgetScriptBundleContributor.cs @@ -10,7 +10,7 @@ namespace DashboardDemo.Pages.widgets [DependsOn(typeof(JQueryScriptContributor))] [DependsOn(typeof(ClipboardScriptBundleContributor))] [DependsOn(typeof(ChartjsScriptContributor))] - [DependsOn(typeof(DateRangeGlobalFilterScriptContributor))] + [DependsOn(typeof(RefreshGlobalFilterScriptContributor))] public class UserCountWidgetScriptBundleContributor : BundleContributor { public override void ConfigureBundle(BundleConfigurationContext context) diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Widgets/WidgetDefinitionProvider.cs b/samples/DashboardDemo/src/DashboardDemo.Web/Widgets/WidgetDefinitionProvider.cs index a276dd3478..98b11f7064 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Widgets/WidgetDefinitionProvider.cs +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Widgets/WidgetDefinitionProvider.cs @@ -16,7 +16,15 @@ namespace DashboardDemo.Widgets LocalizableString.Create(UserCountWidgetViewComponent.DisplayName), typeof(UserCountWidgetViewComponent) ) - .SetDefaultDimension(6, 7) + .SetDefaultDimension(6, 4) + .AddRequiredPermission(IdentityPermissions.Users.Default); + + var monthlyProfitWidget = new WidgetDefinition( + MonthlyProfitWidgetViewComponent.WidgetName, + LocalizableString.Create(MonthlyProfitWidgetViewComponent.DisplayName), + typeof(MonthlyProfitWidgetViewComponent) + ) + .SetDefaultDimension(6, 4) .AddRequiredPermission(IdentityPermissions.Users.Default); var roleListWidget = new WidgetDefinition( @@ -30,6 +38,7 @@ namespace DashboardDemo.Widgets return new List { userCountWidget, + monthlyProfitWidget, roleListWidget }; }