Better Form Stats (#567)

* Better Form Stats

* fix lint

* submission timer store in localstorage

* Update test case for stats

* remove extra code

* fix form stats

* on restart remove timer

* fix resetTimer function name

* Improve form timer

* Fix timer after form validation error + polish UI

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
Chirag Chhatrala
2024-09-18 22:50:52 +05:30
committed by GitHub
parent a057045ef6
commit ceb0648262
14 changed files with 381 additions and 62 deletions

View File

@@ -3,7 +3,9 @@
namespace App\Http\Controllers\Forms;
use App\Http\Controllers\Controller;
use App\Http\Requests\FormStatsRequest;
use Carbon\CarbonPeriod;
use Carbon\CarbonInterval;
use Illuminate\Http\Request;
class FormStatsController extends Controller
@@ -13,14 +15,14 @@ class FormStatsController extends Controller
$this->middleware('auth');
}
public function getFormStats(Request $request)
public function getFormStats(FormStatsRequest $request)
{
$form = $request->form; // Added by ProForm middleware
$this->authorize('view', $form);
$formStats = $form->statistics()->where('date', '>', now()->subDays(29)->startOfDay())->get();
$formStats = $form->statistics()->whereBetween('date', [$request->date_from, $request->date_to])->get();
$periodStats = ['views' => [], 'submissions' => []];
foreach (CarbonPeriod::create(now()->subDays(29), now()) as $dateObj) {
foreach (CarbonPeriod::create($request->date_from, $request->date_to) as $dateObj) {
$date = $dateObj->format('d-m-Y');
$statisticData = $formStats->where('date', $dateObj->format('Y-m-d'))->first();
@@ -34,4 +36,26 @@ class FormStatsController extends Controller
return $periodStats;
}
public function getFormStatsDetails(Request $request)
{
$form = $request->form; // Added by ProForm middleware
$this->authorize('view', $form);
$totalViews = $form->views()->count();
$totalSubmissions = $form->submissions_count;
$averageDuration = \Cache::remember('form_stats_average_duration_' . $form->id, 1800, function () use ($form) {
$submissionsWithDuration = $form->submissions()->whereNotNull('completion_time')->count() ?? 0;
$totalDuration = $form->submissions()->whereNotNull('completion_time')->sum('completion_time') ?? 0;
return $submissionsWithDuration > 0 ? round($totalDuration / $submissionsWithDuration) : null;
});
return [
'views' => $totalViews,
'submissions' => $totalSubmissions,
'completion_rate' => $totalViews > 0 ? round(($totalSubmissions / $totalViews) * 100, 2) : 0,
'average_duration' => $averageDuration ? CarbonInterval::seconds($averageDuration)->cascade()->forHumans() : null
];
}
}