Skip to content

Commit

Permalink
Include last visit chart in administrator panel
Browse files Browse the repository at this point in the history
  • Loading branch information
danon committed Oct 17, 2024
1 parent 40ed8ec commit 8bf9f47
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 19 deletions.
23 changes: 14 additions & 9 deletions app/Domain/Registration/UserRegistrations.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,34 +13,39 @@ public function __construct()
}

public function inRange(HistoryRange $range): array
{
return $this->inRangeColumn($range, 'created_at');
}

public function inRangeColumn(HistoryRange $range, string $column): array
{
return \array_merge(
$this->arrayFrom(
keys:$this->uniformDates->inRange($range),
value:0),
$this->fetchRegistrationsByPeriod($range->startDate(), $range->endDate(), $range->period),
$this->fetchRegistrationsByPeriod($column, $range->startDate(), $range->endDate(), $range->period),
);
}

private function fetchRegistrationsByPeriod(string $from, string $to, Period $period): array
private function fetchRegistrationsByPeriod(string $column, string $from, string $to, Period $period): array
{
$dateTruncSqlField = $this->dateTruncSqlField($period);
$dateTruncSqlField = $this->dateTruncSqlField($column, $period);
return User::withTrashed()
->where('created_at', '>=', "$from 00:00:00")
->where('created_at', '<', "$to 24:00:00")
->where($column, '>=', "$from 00:00:00")
->where($column, '<', "$to 24:00:00")
->selectRaw("$dateTruncSqlField as created_at_group, Count(*) AS count")
->groupByRaw($dateTruncSqlField)
->get()
->pluck(key:'created_at_group', value:'count')
->toArray();
}

private function dateTruncSqlField(Period $period): string
private function dateTruncSqlField(string $column, Period $period): string
{
return match ($period) {
Period::Week => "date_trunc('week', created_at)::date",
Period::Month => "date_trunc('month', created_at)::date",
Period::Year => "date_trunc('year', created_at)::date",
Period::Week => "date_trunc('week', $column)::date",
Period::Month => "date_trunc('month', $column)::date",
Period::Year => "date_trunc('year', $column)::date",
};
}

Expand Down
27 changes: 18 additions & 9 deletions app/Http/Controllers/Adm/DashboardController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,37 +32,46 @@ public function index(UserRegistrations $registrations): View
],
],

'registrationsChartWeeks' => $this->historyChartHtml($registrations, Period::Week),
'registrationsChartMonths' => $this->historyChartHtml($registrations, Period::Month),
'registrationsChartYears' => $this->historyChartHtml($registrations, Period::Year),
'registrationsChartWeeks' => $this->historyChartHtml($registrations, Period::Week, 'created_at'),
'registrationsChartMonths' => $this->historyChartHtml($registrations, Period::Month, 'created_at'),
'registrationsChartYears' => $this->historyChartHtml($registrations, Period::Year, 'created_at'),

'leaveChartWeeks' => $this->historyChartHtml($registrations, Period::Week, 'visited_at'),
'leaveChartMonths' => $this->historyChartHtml($registrations, Period::Month, 'visited_at'),
'leaveChartYears' => $this->historyChartHtml($registrations, Period::Year, 'visited_at'),
]);
}

private function historyChartHtml(UserRegistrations $registrations, Period $period): StringHtml
private function historyChartHtml(UserRegistrations $registrations, Period $period, string $column): StringHtml
{
return new StringHtml($this->view('adm.registrations-chart', [
'chart' => $this->registrationsChart($registrations, $period),
'chart' => $this->registrationsChart($registrations, $period, $column),
'chartLibrarySource' => Chart::librarySourceHtml(),
'title' => $column === 'created_at' ? 'Historia rejestracji' : 'Ostatnia wizyta użytkownika',
]));
}

private function registrationsChart(UserRegistrations $registrations, Period $period): Chart
private function registrationsChart(UserRegistrations $registrations, Period $period, string $column): Chart
{
$range = new HistoryRange($this->dateNow(), $period, 30);
return $this->chart($period->name, $registrations->inRange($range));
return $this->chart(
"$period->name.$column",
$registrations->inRangeColumn($range, $column),
$column === 'created_at',
);
}

private function dateNow(): string
{
return Carbon::now()->toDateString();
}

private function chart(string $chartId, array $registeredUsers): Chart
private function chart(string $chartId, array $registeredUsers, bool $positive): Chart
{
return new Chart(
\array_keys($registeredUsers),
\array_values($registeredUsers),
['#ff9f40'],
[$positive ? '#ff9f40' : '#ff0000'],
"registration-history-chart-$chartId",
);
}
Expand Down
22 changes: 22 additions & 0 deletions resources/views/adm/dashboard.twig
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,26 @@
{{ registrationsChartYears }}
</div>
</div>
<ul class="nav nav-pills mb-3 justify-content-end">
<li class="nav-item" role="presentation">
<button class="nav-link active" data-bs-toggle="pill" data-bs-target="#pills-weeks-leave" type="button">ostatnie 30 tygodni</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" data-bs-toggle="pill" data-bs-target="#pills-months-leave" type="button">ostatnie 30 miesięcy</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" data-bs-toggle="pill" data-bs-target="#pills-years-leave" type="button">ostatnie 30 lat</button>
</li>
</ul>
<div class="tab-content" id="pills-tabContent">
<div class="tab-pane show active" id="pills-weeks-leave">
{{ leaveChartWeeks }}
</div>
<div class="tab-pane" id="pills-months-leave">
{{ leaveChartMonths }}
</div>
<div class="tab-pane" id="pills-years-leave">
{{ leaveChartYears }}
</div>
</div>
{% endblock %}
2 changes: 1 addition & 1 deletion resources/views/adm/registrations-chart.twig
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{{ chartLibrarySource }}
<div class="card card-default">
<div class="card-header">
Historia rejestracji
{{ title }}
</div>
<div class="card-body">
{{ chart }}
Expand Down

0 comments on commit 8bf9f47

Please sign in to comment.