/home/mip/mip/app/Modules/Client/Controllers/Questionnaire/QuestionController.php
<?php
namespace QxCMS\Modules\Client\Controllers\Questionnaire;
use DB;
use Auth;
use Datatables;
use Illuminate\Http\Request;
use QxCMS\Http\Controllers\Controller;
use QxCMS\Modules\Client\Requests\Questionnaire\QuestionRequest;
use QxCMS\Modules\Client\Repositories\Questionnaire\TemplateRepositoryInterface as Template;
use QxCMS\Modules\Client\Repositories\Questionnaire\QuestionRepositoryInterface as Question;
use QxCMS\Modules\Client\Repositories\Questionnaire\AnswerRepositoryInterface as Answer;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;
class QuestionController extends Controller
{
protected $template;
protected $question;
protected $answer;
protected $permission;
protected $auth;
protected $prefix_name = '';
public function __construct(
Template $template,
Question $question,
Answer $answer,
Permission $permission
)
{
$this->template = $template;
$this->question = $question;
$this->answer = $answer;
$this->permission = $permission;
$this->auth = Auth::guard('client');
$this->prefix_name = config('modules.client');
config(['jsvalidation.view' => 'jsvalidation::bootstrap-modal']);
}
public function permissions()
{
return $this->permission->getPermission($this->template->getModuleId());
}
public function index($template_hashid)
{
$this->authorize('activated', $this->permissions());
$data['permissions'] = $this->permissions();
$template_id = decode($template_hashid);
$data['template'] = $this->template->findById($template_id);
$data['userLogs'] = $this->question->getUserLogs($this->template->getModuleId(), '', 'Questions-'.$template_id);
return view('Client::questionnaire.question.index', $data);
}
public function create($template_hashid)
{
$this->authorize('create', $this->permissions());
$data['permissions'] = $this->permissions();
$template_id = decode($template_hashid);
$data['template'] = $this->template->findById($template_id);
$data['question_types'] = $this->question->getQuestionTypes();
return view('Client::questionnaire.question.create', $data);
}
public function store(Request $request, $template_hashid)
{
$this->authorize('create', $this->permissions());
$template_id = decode($template_hashid);
$question_input = $request->except(['name']);
$question_input['template_id'] = $template_id;
$question = $this->question->create($question_input);
$choices = array_filter($request->get('name'), 'strlen');
if(!empty($choices)) {
$order = 1;
foreach ($choices as $choice_key => $choice) {
$input['name'] = $choice;
$input['question_id'] = $question->id;
$input['order'] = $order;
$this->answer->create($input);
$order = $order + 1;
}
}
if($request->get('_save') == 'add_another') {
session()->flash('success', 'Question is successfully added. Please add another question.');
return redirect($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question/create');
}
session()->flash('success', 'Question is successfully added.');
return redirect($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question');
}
public function show($id)
{
$this->authorize('activated', $this->permissions());
return $id;
}
public function edit($template_hashid, $hashid)
{
$this->authorize('update', $this->permissions());
$template_id = decode($template_hashid);
$id = decode($hashid);
$data['permissions'] = $this->permissions();
$data['question_types'] = $this->question->getQuestionTypes();
$data['template'] = $this->template->findById($template_id);
$data['userLogs'] = $this->question->getUserLogs($this->question->getModuleId(), $id,'Questions-'.$template_id);
$data['question'] = $this->question->with(['answers' => function($query){
$query->orderBy('order', 'ASC');
}])->find($id);
return view('Client::questionnaire.question.edit', $data);
}
public function update(QuestionRequest $request, $template_hashid, $hashid)
{
$this->authorize('update', $this->permissions());
$id = decode($hashid);
$template_id = decode($template_hashid);
$question = $this->question->update($id, $request->except(['name']));
$choices = array_filter($request->get('name'), 'strlen');
$this->answer->where('question_id', $id)->whereNotIn('id', array_keys($choices))->delete();
if(!empty($choices)) {
$order = 1;
foreach ($choices as $choice_key => $choice) {
// return $choice_key;
$input['name'] = $choice;
$input['question_id'] = $question->id;
$input['order'] = $order;
if(starts_with($choice_key, 'new')) {
$this->answer->create($input);
} else {
$this->answer->update($choice_key, $input);
}
$order = $order + 1;
}
}
return redirect($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question');
}
public function destroy($template_hashid, $hashid)
{
$this->authorize('delete', $this->permissions());
$id = decode($hashid);
$template_id = decode($template_hashid);
return $this->question->delete($id);
}
public function copyQuestion($hashid)
{
$this->authorize('update', $this->permissions());
$id = decode($hashid);
$question = $this->question->with(['answers'])->find($id);
return $this->question->copyQuestion($question);
}
public function sortQuestion(Request $request)
{
$orders = $request->get('question-table');
foreach ($orders as $order => $id) {
//if ($key <> 0) {
$this->question->sort(($order + 1), $id);
// }
}
return $orders;
}
/*
* Datatables
*/
public function getQuestionData($template_hashid)
{
$template_id = decode($template_hashid);
$questions = $this->question->where('template_id', '=', $template_id)->orderBy('order', 'ASC');
$permissions = $this->permissions();
return Datatables::of($questions)
->addColumn('action', function ($question) use ($permissions) {
$html_out = '';
if($this->auth->user()->can('update', $permissions)) {
$html_out .= '<a href="'.url($this->prefix_name.'/questionnaire/'.hashid($question->template_id).'/question/'.$question->hashid.'/edit').'" class="btn btn-xs btn-flat btn-warning" data-toggle="tooltip" data-placement="top" title="Edit"><i class="fa fa-pencil"></i></a>';
$html_out .= ' <a href="'.url($this->prefix_name.'/questionnaire/'.$question->hashid.'/question/copy').'" id="copy-question" class="btn btn-xs btn-flat btn-info" data-toggle="tooltip" data-placement="top" title="Duplicate"><i class="fa fa-copy"></i></a>';
}
if($this->auth->user()->can('delete', $permissions)) {
$html_out .= ' <a href="#delete-'.$question->hashid.'" class="btn btn-xs btn-flat btn-danger" id="btn-delete" data-action="'.url($this->prefix_name).'/questionnaire/'.hashid($question->template_id).'/question/'.$question->hashid.'" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fa fa-trash-o"></i></a>';
}
return $html_out;
})
->setRowId('id')
->make(true);
}
/*public function getTokenInputUserLists(Request $request)
{
if($request->has('q')) {
if($request->input('q') <> '') {
return $this->user->tokenInputLists()->where('name', 'LIKE', '%'.$request->input('q').'%')->where('client_id', $this->auth->user()->client->id)->get();
}
}
return $this->user->tokenInputLists()->where('client_id', $this->auth->user()->client->id)->get();
}*/
}