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:
@@ -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
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ class PublicFormController extends Controller
|
||||
|
||||
$internal_url = Storage::temporaryUrl($path, now()->addMinutes(5));
|
||||
|
||||
foreach(config('filesystems.disks.s3.temporary_url_rewrites') as $from => $to) {
|
||||
foreach (config('filesystems.disks.s3.temporary_url_rewrites') as $from => $to) {
|
||||
$internal_url = str_replace($from, $to, $internal_url);
|
||||
}
|
||||
|
||||
@@ -89,12 +89,16 @@ class PublicFormController extends Controller
|
||||
$form = $request->form;
|
||||
$submissionId = false;
|
||||
|
||||
$submissionData = $request->validated();
|
||||
$completionTime = $request->get('completion_time') ?? null;
|
||||
unset($submissionData['completion_time']); // Remove completion_time from the main data array
|
||||
|
||||
if ($form->editable_submissions) {
|
||||
$job = new StoreFormSubmissionJob($form, $request->validated());
|
||||
$job = new StoreFormSubmissionJob($form, $submissionData, $completionTime);
|
||||
$job->handle();
|
||||
$submissionId = Hashids::encode($job->getSubmissionId());
|
||||
} else {
|
||||
StoreFormSubmissionJob::dispatch($form, $request->validated());
|
||||
StoreFormSubmissionJob::dispatch($form, $submissionData, $completionTime);
|
||||
}
|
||||
|
||||
return $this->success(array_merge([
|
||||
|
||||
Reference in New Issue
Block a user