Browse Source

added NewUserStatistic chart to dashboard demo

pull/1520/head
Yunus Emre Kalkan 7 years ago
parent
commit
83a7d8e850
  1. 2
      samples/DashboardDemo/src/DashboardDemo.Application.Contracts/IDashboardAppService.cs
  2. 9
      samples/DashboardDemo/src/DashboardDemo.Application.Contracts/NewUserStatistiWidgetResultDto.cs
  3. 8
      samples/DashboardDemo/src/DashboardDemo.Application.Contracts/NewUserStatisticFrequency.cs
  4. 13
      samples/DashboardDemo/src/DashboardDemo.Application.Contracts/NewUserStatisticWidgetInputDto.cs
  5. 69
      samples/DashboardDemo/src/DashboardDemo.Application/DashboardAppService.cs
  6. 12
      samples/DashboardDemo/src/DashboardDemo.Web/Bundles/ChartjsScriptContributor.cs
  7. 12
      samples/DashboardDemo/src/DashboardDemo.Web/Bundles/ChartjsStyleContributor.cs
  8. 20
      samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/Default.cshtml
  9. 93
      samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/Default.js
  10. 19
      samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/NewUserStatisticWidgetScriptContributor.cs
  11. 22
      samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/NewUserStatisticWidgetViewComponent.cs
  12. 5
      samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboard.cshtml
  13. 7
      samples/DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js
  14. 3
      samples/DashboardDemo/src/DashboardDemo.Web/package.json
  15. 19288
      samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.bundle.js
  16. 7
      samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.bundle.min.js
  17. 47
      samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.css
  18. 14680
      samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.js
  19. 1
      samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.min.css
  20. 7
      samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.min.js
  21. 38
      samples/DashboardDemo/src/DashboardDemo.Web/yarn.lock

2
samples/DashboardDemo/src/DashboardDemo.Application.Contracts/IDashboardAppService.cs

@ -6,5 +6,7 @@ namespace DashboardDemo
public interface IDashboardAppService : IApplicationService
{
Task<CountersWidgetResultDto> GetCountersWidgetAsync(CountersWidgetInputDto input);
Task<NewUserStatistiWidgetResultDto> GetNewUserStatisticWidgetAsync(NewUserStatisticWidgetInputDto input);
}
}

9
samples/DashboardDemo/src/DashboardDemo.Application.Contracts/NewUserStatistiWidgetResultDto.cs

@ -0,0 +1,9 @@
namespace DashboardDemo
{
public class NewUserStatistiWidgetResultDto
{
public string[] Labels { get; set; }
public int[] Data { get; set; }
}
}

8
samples/DashboardDemo/src/DashboardDemo.Application.Contracts/NewUserStatisticFrequency.cs

@ -0,0 +1,8 @@
namespace DashboardDemo
{
public enum NewUserStatisticFrequency
{
Daily,
Monthly
}
}

13
samples/DashboardDemo/src/DashboardDemo.Application.Contracts/NewUserStatisticWidgetInputDto.cs

@ -0,0 +1,13 @@
using System;
namespace DashboardDemo
{
public class NewUserStatisticWidgetInputDto
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public NewUserStatisticFrequency Frequency { get; set; } = NewUserStatisticFrequency.Daily;
}
}

69
samples/DashboardDemo/src/DashboardDemo.Application/DashboardAppService.cs

@ -1,5 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
namespace DashboardDemo
{
@ -19,5 +22,71 @@ namespace DashboardDemo
TotalProfit = dayFactor * 239.45,
};
}
public async Task<NewUserStatistiWidgetResultDto> GetNewUserStatisticWidgetAsync(NewUserStatisticWidgetInputDto input)
{
switch (input.Frequency)
{
case NewUserStatisticFrequency.Daily:
return await GetDailyNewUserStatisticWidgetAsync(input);
case NewUserStatisticFrequency.Monthly:
return await GetMonthlyNewUserStatisticWidgetAsync(input);
}
throw new UserFriendlyException("Not implemented statistic frequency.");
}
private async Task<NewUserStatistiWidgetResultDto> GetMonthlyNewUserStatisticWidgetAsync(NewUserStatisticWidgetInputDto input)
{
DateTime endDate = input.EndDate;
DateTime startDate = input.StartDate;
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;
var labels = new List<string>();
for (int i = 0; i < monthCount; i++)
{
labels.Add(months[endDate.Month - 1]);
endDate = endDate.AddMonths(-1);
}
labels.Reverse();
var data = Enumerable
.Repeat(0, monthCount)
.Select(i => new Random().Next(1500, 3000))
.ToArray();
return new NewUserStatistiWidgetResultDto()
{
Data = data,
Labels = labels.ToArray()
};
}
private async Task<NewUserStatistiWidgetResultDto> GetDailyNewUserStatisticWidgetAsync(NewUserStatisticWidgetInputDto input)
{
var dayCount = (input.EndDate - input.StartDate).Days + 1;
var data = Enumerable
.Repeat(0, dayCount)
.Select(i => new Random().Next(50, 100))
.ToArray();
var labels = new List<string>();
for (int i = 0; i < dayCount; i++)
{
labels.Add(input.StartDate.AddDays(i).Day.ToString());
}
return new NewUserStatistiWidgetResultDto()
{
Data = data,
Labels = labels.ToArray()
};
}
}
}

12
samples/DashboardDemo/src/DashboardDemo.Web/Bundles/ChartjsScriptContributor.cs

@ -0,0 +1,12 @@
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace DashboardDemo.Web.Bundles
{
public class ChartjsScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.Add("/libs/chart.js/Chart.js");
}
}
}

12
samples/DashboardDemo/src/DashboardDemo.Web/Bundles/ChartjsStyleContributor.cs

@ -0,0 +1,12 @@
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace DashboardDemo.Web.Bundles
{
public class ChartjsStyleContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.Add("/libs/chart.js/Chart.css");
}
}
}

20
samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/Default.cshtml

@ -0,0 +1,20 @@
<div class="newUserStatistic-widget">
<abp-card background="Light">
<abp-card-header background="Secondary" class="text-white">
User Statistics
</abp-card-header>
<abp-card-body>
<div>
<div class="form-group" id="FrequencyFilter">
<select class="form-control">
<option value="Daily">Daily</option>
<option value="Monthly">Monthly</option>
</select>
</div>
</div
<div class="row mt-5">
<canvas id="NewUserStatisticChart" class="NewUserStatisticChart"></canvas>
</div>
</abp-card-body>
</abp-card>
</div>

93
samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/Default.js

@ -0,0 +1,93 @@
(function () {
var chart;
var serviceMethod = dashboardDemo.dashboard.getNewUserStatisticWidget;
var latestEndDate;
var latestStartDate;
var getFrequencyVal = function() {
return $("#FrequencyFilter option:selected").val();
};
var createChart = function (statistic) {
chart = new Chart($('#NewUserStatisticChart'),
{
type: 'bar',
data: {
labels: statistic.labels,
datasets: [
{
label: 'User count',
data: statistic.data,
backgroundColor: 'rgba(255, 132, 132, 1)'
}
]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
});
};
var refreshChart = function (statistic) {
chart.data = {
labels: statistic.labels,
datasets: [
{
label: 'User count',
data: statistic.data,
backgroundColor: 'rgba(255, 132, 132, 1)'
}
]
};
chart.update();
};
var init = function (args) {
serviceMethod({
startDate: args.filters.startDate,
endDate: args.filters.endDate,
frequency: getFrequencyVal()
})
.then(function (result) {
createChart(result);
});
latestStartDate = args.filters.startDate;
latestEndDate = args.filters.endDate;
};
var refresh = function (args) {
serviceMethod({
startDate: args.filters.startDate,
endDate: args.filters.endDate,
frequency: getFrequencyVal()
})
.then(function (result) {
refreshChart(result);
});
latestStartDate = args.filters.startDate;
latestEndDate = args.filters.endDate;
};
$('#FrequencyFilter').on('change',
function () {
refresh({
filters: {
startDate: latestStartDate,
endDate: latestEndDate
}
});
});
abp.event.on('refresh-widgets', refresh);
abp.event.on('init-widgets', init);
})();

19
samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/NewUserStatisticWidgetScriptContributor.cs

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DashboardDemo.Web.Bundles;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.Modularity;
namespace DashboardDemo.Web.Pages.Components.NewUserStatisticWidget
{
[DependsOn(typeof(ChartjsScriptContributor))]
public class NewUserStatisticWidgetScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.Add("/Pages/Components/NewUserStatisticWidget/Default.js");
}
}
}

22
samples/DashboardDemo/src/DashboardDemo.Web/Pages/Components/NewUserStatisticWidget/NewUserStatisticWidgetViewComponent.cs

@ -0,0 +1,22 @@
using System;
using System.Threading.Tasks;
using DashboardDemo.Web.Bundles;
using DashboardDemo.Web.Pages.Components.NewUserStatisticWidget;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.Widgets;
namespace DashboardDemo.Web.Pages.Components.CountersWidget
{
[Widget(
StyleTypes = new[] { typeof(ChartjsStyleContributor) },
ScriptTypes = new[] { typeof(NewUserStatisticWidgetScriptContributor)}
)]
public class NewUserStatisticWidgetViewComponent : AbpViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
return View();
}
}
}

5
samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboard.cshtml

@ -33,4 +33,9 @@
})
</abp-column>
</abp-row>
<abp-row class="mt-5">
<abp-column size="_6" class="mr-1">
@await Component.InvokeAsync("NewUserStatisticWidget")
</abp-column>
</abp-row>
</div>

7
samples/DashboardDemo/src/DashboardDemo.Web/abp.resourcemapping.js

@ -1,8 +1,5 @@
module.exports = {
aliases: {
},
mappings: {
"@node_modules/chart.js/dist/*.*": "@libs/chart.js/"
}
};
};

3
samples/DashboardDemo/src/DashboardDemo.Web/package.json

@ -3,6 +3,7 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^0.6.6"
"@abp/aspnetcore.mvc.ui.theme.basic": "^0.6.6",
"chart.js": "^2.8.0"
}
}

19288
samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.bundle.js

File diff suppressed because it is too large

7
samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.bundle.min.js

File diff suppressed because one or more lines are too long

47
samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.css

@ -0,0 +1,47 @@
/*
* DOM element rendering detection
* https://davidwalsh.name/detect-node-insertion
*/
@keyframes chartjs-render-animation {
from { opacity: 0.99; }
to { opacity: 1; }
}
.chartjs-render-monitor {
animation: chartjs-render-animation 0.001s;
}
/*
* DOM element resizing detection
* https://github.com/marcj/css-element-queries
*/
.chartjs-size-monitor,
.chartjs-size-monitor-expand,
.chartjs-size-monitor-shrink {
position: absolute;
direction: ltr;
left: 0;
top: 0;
right: 0;
bottom: 0;
overflow: hidden;
pointer-events: none;
visibility: hidden;
z-index: -1;
}
.chartjs-size-monitor-expand > div {
position: absolute;
width: 1000000px;
height: 1000000px;
left: 0;
top: 0;
}
.chartjs-size-monitor-shrink > div {
position: absolute;
width: 200%;
height: 200%;
left: 0;
top: 0;
}

14680
samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.js

File diff suppressed because it is too large

1
samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.min.css

@ -0,0 +1 @@
@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}

7
samples/DashboardDemo/src/DashboardDemo.Web/wwwroot/libs/chart.js/Chart.min.js

File diff suppressed because one or more lines are too long

38
samples/DashboardDemo/src/DashboardDemo.Web/yarn.lock

@ -411,6 +411,29 @@ camelcase@^3.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
chart.js@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.8.0.tgz#b703b10d0f4ec5079eaefdcd6ca32dc8f826e0e9"
integrity sha512-Di3wUL4BFvqI5FB5K26aQ+hvWh8wnP9A3DWGvXHVkO13D3DSnaSsdZx29cXlEsYKVkn1E2az+ZYFS4t0zi8x0w==
dependencies:
chartjs-color "^2.1.0"
moment "^2.10.2"
chartjs-color-string@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71"
integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==
dependencies:
color-name "^1.0.0"
chartjs-color@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.3.0.tgz#0e7e1e8dba37eae8415fd3db38bf572007dd958f"
integrity sha512-hEvVheqczsoHD+fZ+tfPUE+1+RbV6b+eksp2LwAhwRTVXEjCSEavvk+Hg3H6SZfGlPh/UfmWKGIvZbtobOEm3g==
dependencies:
chartjs-color-string "^0.6.0"
color-convert "^0.5.3"
chokidar@^2.0.0:
version "2.1.6"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5"
@ -498,6 +521,16 @@ collection-visit@^1.0.0:
map-visit "^1.0.0"
object-visit "^1.0.0"
color-convert@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd"
integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=
color-name@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
@ -1510,6 +1543,11 @@ mkdirp@^0.5.0, mkdirp@^0.5.1:
dependencies:
minimist "0.0.8"
moment@^2.10.2:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"

Loading…
Cancel
Save