<?php namespace App\Http\Controllers; use App\Enums\User\RoleEnum; use App\Form; use App\Mail\TestEmail; use App\PackageSubscription; use App\UserForm; use Carbon\Carbon; use DB; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use Yajra\DataTables\Facades\DataTables; class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); } /** * Show the application dashboard. * * @return \Illuminate\Contracts\Support\Renderable */ public function index() { $user = request()->user(); if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value, 'web')) { $forms = Form::query() ->withCount('data') ->where('is_template', 0) ->get(); } else { $forms = Form::query() ->withCount('data') ->where('is_template', 0) ->where('created_by', $user->id) ->groupBy('id'); } if (request()->ajax()) { $subscription = PackageSubscription::activeSubscription($user->id); if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value, 'web')) { $forms = Form::query() ->withCount('data') ->where('is_template', 0) ->get(); } else { $forms = Form::query() ->withCount('data') ->where('is_template', 0) ->where('created_by', $user->id) ->get(); } return DataTables::of($forms) ->addColumn( 'action', function (Form $form) use ($subscription, $user) { $action = ''; if (!empty($form->schema)) { $action = '<a href="' . action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $form->slug ?: $form->id]) . '"' . ' target="_blank" class="btn btn-sm btn-info m-1" data-toggle="tooltip" title="' . __('messages.view') . '"> <i class="fa fa-eye" aria-hidden="true"></i> </a>'; } $action .= '<a href="' . action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $form->id]) . '"' . ' class="btn btn-sm btn-warning m-1" data-toggle="tooltip" title="' . __('messages.edit') . '"> <i class="fa fa-edit" aria-hidden="true"></i> </a>'; if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value) || auth()->user()->id === $form->created_by) { $action .= '<button type="button" data-href="' . action([\App\Http\Controllers\FormController::class, 'destroy'], ['form' => $form->id]) . '"' . ' class="btn btn-sm btn-danger delete_form m-1" data-toggle="tooltip" title="' . __('messages.delete') . '"> <i class="fa fa-trash" aria-hidden="true"></i> </button>'; } if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value) || auth()->user()->id === $form->created_by) { $action .= '<button type="button" data-href="' . action([\App\Http\Controllers\FormController::class, 'copyForm'], ['id' => $form->id]) . '"' . ' class="btn btn-sm btn-primary copy_form m-1" data-toggle="tooltip" title="' . __('messages.copy_this_form') . '"> <i class="fas fa-copy"></i> </button>'; } if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value) || auth()->user()->id === $form->created_by) { $action .= '<button type="button" data-href="' . action([\App\Http\Controllers\FormController::class, 'generateWidget'], ['id' => $form->id]) . '"' . ' class="btn btn-sm btn-info generate_widget m-1" data-toggle="tooltip" title="' . __('messages.widget') . '"> <i class="fa fa-random" aria-hidden="true"></i> </button>'; } $action .= '<a href="' . action([\App\Http\Controllers\FormDataController::class, 'show'], ['id' => $form->id]) . '"' . '" class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="' . __('messages.view_form_data') . '"> <i class="fa fa-list" aria-hidden="true"></i> </a>'; if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value) || auth()->user()->id === $form->created_by) { $action .= '<a href="' . action([\App\Http\Controllers\FormController::class, 'downloadCode'], ['id' => $form->id]) . '"' . '" class="btn btn-sm btn-dark m-1" data-toggle="tooltip" title="' . __('messages.download_code') . '"> <i class="fas fa-download" aria-hidden="true"></i> </a>'; } if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value) || auth()->user()->id === $form->created_by) { $action .= '<a data-href="' . action([\App\Http\Controllers\FormController::class, 'getCollab'], ['id' => $form->id]) . '"' . 'class="btn btn-sm btn-primary m-1 collab_btn" data-toggle="tooltip" title="' . __('messages.collaborate') . '"> <i class="fas fa-handshake text-white" aria-hidden="true"></i> </a>'; } return $action; } ) ->editColumn('created_at', function ($row) { $date_format = config('constants.APP_DATE_FORMAT'); if (config('constants.APP_TIME_FORMAT') == '12') { $date_format .= ' h:i A'; } elseif (config('constants.APP_TIME_FORMAT') == '24') { $date_format .= ' H:i'; } else { $date_format = 'm/d/Y h:i A'; } return !empty($row->created_at) ? Carbon::createFromTimestamp(strtotime($row->created_at))->format($date_format) : null; }) ->editColumn('data_count', function ($row) { return $row->data_count; }) ->editColumn('name', function ($row) { $html = $row->name; if (empty($row->schema)) { $html .= '<br><small class="text-danger">(' . (__('messages.form_is_incomplete')) . ')</small>'; } return $html; }) ->removeColumn('id') ->rawColumns(['action', 'created_at', 'data_count', 'name']) ->make(true); } //Count forms $form_count = $forms->count(); //Count templates. $template_count = Form::where('created_by', $user->id) ->where('is_template', 1) ->count(); //Count submissions. $submission_count = Form::join('form_data as fd', 'forms.id', '=', 'fd.form_id') ->where('is_template', 0) ->when(auth()->user()->hasRole(RoleEnum::USER->value), function (Builder $builder) use ($user) { $builder->where('created_by', $user->id); }) ->count(); return view('home') ->with(compact('form_count', 'template_count', 'submission_count')); } /** * Show Form Template * * @return \Illuminate\Contracts\Support\Renderable */ public function getTemplate() { if (request()->ajax()) { $user_id = request()->user()->id; $forms = Form::select('name', 'description', 'id', 'slug', 'is_global_template') ->where(function ($query) use ($user_id) { $query->where('is_template', 1) ->where('created_by', $user_id) ->orWhere('is_global_template', 1); }) ->groupBy('id'); return DataTables::of($forms) ->addColumn('action', function ($row) { $action = '<a href="' . action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $row->slug ?: $row->id]) . '"' . ' target="_blank" class="btn btn-sm btn-info m-1" data-toggle="tooltip" title="' . __('messages.view') . '"> <i class="fa fa-eye" aria-hidden="true"></i> </a>'; if (!$row->is_global_template || auth()->user()->can('superadmin')) { $action .= '<a href="' . action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $row->id]) . '"' . ' class="btn btn-sm btn-warning m-1" data-toggle="tooltip" title="' . __('messages.edit') . '"> <i class="fa fa-edit" aria-hidden="true"></i> </a> <button type="button" data-href="' . action([\App\Http\Controllers\FormController::class, 'destroy'], ['form' => $row->id]) . '"' . ' class="btn btn-sm btn-danger delete_template m-1" data-toggle="tooltip" title="' . __('messages.delete') . '"> <i class="fa fa-trash" aria-hidden="true"></i> </button>'; } return $action; }) ->editColumn('is_global_template', function ($row) { if (auth()->user()->can('superadmin')) { $checked = $row->is_global_template ? 'checked' : ''; $html = '<div class="form-check"> <input class="form-check-input toggle_global_template" type="checkbox" value="1" ' . $checked . ' data-form_id="' . $row->id . '"> </div>'; return $html; } }) ->editColumn('name', function ($row) { $name = $row->name; if ($row->is_global_template) { $name .= '<br><span class="badge badge-pill badge-info">' . __('messages.pre_made') . '</span>'; } return $name; }) ->removeColumn('id') ->rawColumns(['action', 'is_global_template', 'name']) ->make(true); } return view('home'); } /** * Tests if SMTP connection details is correct or not. * * @return \Illuminate\Contracts\Support\Renderable */ public function testSMTP() { try { //Set the default config. config([ 'mail.mailers.smtp.host' => request()->host, 'mail.mailers.smtp.port' => request()->port, 'mail.from.address' => request()->from_address, 'mail.from.name' => request()->from_name, 'mail.mailers.smtp.encryption' => request()->encryption, 'mail.mailers.smtp.username' => request()->username, 'mail.mailers.smtp.password' => request()->password ]); Mail::to(request()->from_address) ->send(new TestEmail()); return $this->respondSuccess(); } catch (\Exception $e) { return $this->respondWithError($e->getMessage()); } } /** * Show assigned forms * * @return \Illuminate\Contracts\Support\Renderable */ public function getAssignedForms(Request $request) { if ($request->ajax()) { $forms = UserForm::join('forms', 'user_forms.form_id', '=', 'forms.id') ->leftJoin('users', 'forms.created_by', '=', 'users.id') ->where('user_forms.assigned_to', \Auth::id()) ->select('user_forms.permissions as permissions', 'forms.name as name', 'forms.description as description', 'forms.id as form_id', 'forms.created_at as created_at', 'forms.slug as slug', 'users.name as created_by'); return DataTables::of($forms) ->addColumn( 'action', function ($row) { $action = ''; if ((!empty($row->permissions) && in_array('can_view_form', $row->permissions)) || auth()->user()->hasRole(RoleEnum::SUPERVISOR->value)) { $action = '<a href="' . action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $row->slug ?: $row->form_id]) . '"' . ' target="_blank" class="btn btn-sm btn-info m-1" data-toggle="tooltip" title="' . __('messages.view') . '"> <i class="fa fa-eye" aria-hidden="true"></i> </a>'; } if ((!empty($row->permissions) && in_array('can_design_form', $row->permissions)) || auth()->user()->hasRole(RoleEnum::SUPERVISOR->value)) { $action .= '<a href="' . action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $row->form_id]) . '"' . ' class="btn btn-sm btn-warning m-1" data-toggle="tooltip" title="' . __('messages.edit') . '"> <i class="fa fa-edit" aria-hidden="true"></i> </a>'; } if ((!empty($row->permissions) && in_array('can_view_data', $row->permissions)) || auth()->user()->hasRole(RoleEnum::SUPERVISOR->value)) { $action .= '<a href="' . action([\App\Http\Controllers\FormDataController::class, 'show'], ['id' => $row->form_id]) . '"' . '" class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="' . __('messages.view_form_data') . '"> <i class="fa fa-list" aria-hidden="true"></i> </a>'; } if (auth()->user()->hasRole(RoleEnum::SUPERVISOR->value)) { $action .= '<a href="' . action([\App\Http\Controllers\FormDataController::class, 'getReport'], ['id' => $row->form_id]) . '"' . '" target="_blank" class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="' . __('messages.report') . '"> <i class="fas fa-chart-pie" aria-hidden="true"></i> </a>'; } return $action; } ) ->editColumn('created_by', function ($row) { return ucfirst($row->created_by); }) ->removeColumn(['id', 'permissions']) ->rawColumns(['action', 'created_by']) ->make(true); } } }