Spaces:
No application file
No application file
namespace Mautic\LeadBundle\Controller; | |
use Mautic\CoreBundle\Controller\FormController; | |
use Mautic\CoreBundle\Helper\InputHelper; | |
use Mautic\LeadBundle\Entity\LeadNote; | |
use Mautic\LeadBundle\Model\NoteModel; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class NoteController extends FormController | |
{ | |
use LeadAccessTrait; | |
/** | |
* Generate's default list view. | |
* | |
* @return JsonResponse|Response | |
*/ | |
public function indexAction(Request $request, $leadId = 0, $page = 1) | |
{ | |
if (empty($leadId)) { | |
return $this->accessDenied(); | |
} | |
$lead = $this->checkLeadAccess($leadId, 'view'); | |
if ($lead instanceof Response) { | |
return $lead; | |
} | |
$this->setListFilters(); | |
$session = $request->getSession(); | |
// set limits | |
$limit = $session->get( | |
'mautic.lead.'.$lead->getId().'.note.limit', | |
$this->coreParametersHelper->get('default_pagelimit') | |
); | |
$start = (1 === $page) ? 0 : (($page - 1) * $limit); | |
if ($start < 0) { | |
$start = 0; | |
} | |
$search = $request->get('search', $session->get('mautic.lead.'.$lead->getId().'.note.filter', '')); | |
$session->set('mautic.lead.'.$lead->getId().'.note.filter', $search); | |
// do some default filtering | |
$orderBy = $session->get('mautic.lead.'.$lead->getId().'.note.orderby', 'n.dateTime'); | |
$orderByDir = $session->get('mautic.lead.'.$lead->getId().'.note.orderbydir', 'DESC'); | |
$model = $this->getModel('lead.note'); | |
$force = [ | |
[ | |
'column' => 'n.lead', | |
'expr' => 'eq', | |
'value' => $lead, | |
], | |
]; | |
$tmpl = $request->isXmlHttpRequest() ? $request->get('tmpl', 'index') : 'index'; | |
$noteType = InputHelper::clean($request->request->get('noteTypes') ?? []); | |
if (empty($noteType) && 'index' === $tmpl) { | |
$noteType = $session->get('mautic.lead.'.$lead->getId().'.notetype.filter', []); | |
} | |
$session->set('mautic.lead.'.$lead->getId().'.notetype.filter', $noteType); | |
$noteTypes = [ | |
'general' => 'mautic.lead.note.type.general', | |
'email' => 'mautic.lead.note.type.email', | |
'call' => 'mautic.lead.note.type.call', | |
'meeting' => 'mautic.lead.note.type.meeting', | |
]; | |
if (!empty($noteType)) { | |
$force[] = [ | |
'column' => 'n.type', | |
'expr' => 'in', | |
'value' => $noteType, | |
]; | |
} | |
$items = $model->getEntities( | |
[ | |
'filter' => [ | |
'force' => $force, | |
'string' => $search, | |
], | |
'start' => $start, | |
'limit' => $limit, | |
'orderBy' => $orderBy, | |
'orderByDir' => $orderByDir, | |
'hydration_mode' => 'HYDRATE_ARRAY', | |
] | |
); | |
$security = $this->security; | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'notes' => $items, | |
'lead' => $lead, | |
'page' => $page, | |
'limit' => $limit, | |
'search' => $search, | |
'noteType' => $noteType, | |
'noteTypes' => $noteTypes, | |
'tmpl' => $tmpl, | |
'permissions' => [ | |
'edit' => $security->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser()), | |
'delete' => $security->hasEntityAccess('lead:leads:deleteown', 'lead:leads:deleteown', $lead->getPermissionUser()), | |
], | |
], | |
'passthroughVars' => [ | |
'route' => false, | |
'mauticContent' => 'leadNote', | |
'noteCount' => count($items), | |
], | |
'contentTemplate' => '@MauticLead/Note/list.html.twig', | |
] | |
); | |
} | |
/** | |
* Generate's new note and processes post data. | |
* | |
* @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response | |
*/ | |
public function newAction(Request $request, $leadId) | |
{ | |
$lead = $this->checkLeadAccess($leadId, 'view'); | |
if ($lead instanceof Response) { | |
return $lead; | |
} | |
// retrieve the entity | |
$note = new LeadNote(); | |
$note->setLead($lead); | |
$model = $this->getModel('lead.note'); | |
\assert($model instanceof NoteModel); | |
$action = $this->generateUrl( | |
'mautic_contactnote_action', | |
[ | |
'objectAction' => 'new', | |
'leadId' => $leadId, | |
] | |
); | |
// get the user form factory | |
$form = $model->createForm($note, $this->formFactory, $action); | |
$closeModal = false; | |
$valid = false; | |
// /Check for a submitted form and process it | |
if (Request::METHOD_POST === $request->getMethod()) { | |
if (!$cancelled = $this->isFormCancelled($form)) { | |
if ($valid = $this->isFormValid($form)) { | |
$closeModal = true; | |
// form is valid so process the data | |
$model->saveEntity($note); | |
} | |
} else { | |
$closeModal = true; | |
} | |
} | |
$security = $this->security; | |
$permissions = [ | |
'edit' => $security->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser()), | |
'delete' => $security->hasEntityAccess('lead:leads:deleteown', 'lead:leads:deleteown', $lead->getPermissionUser()), | |
]; | |
if ($closeModal) { | |
// just close the modal | |
$passthroughVars = [ | |
'closeModal' => 1, | |
'mauticContent' => 'leadNote', | |
]; | |
if ($valid && !$cancelled) { | |
$passthroughVars['upNoteCount'] = 1; | |
$passthroughVars['noteHtml'] = $this->renderView( | |
'@MauticLead/Note/note.html.twig', | |
[ | |
'note' => $note, | |
'lead' => $lead, | |
'permissions' => $permissions, | |
] | |
); | |
$passthroughVars['noteId'] = $note->getId(); | |
} | |
return new JsonResponse($passthroughVars); | |
} else { | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'form' => $form->createView(), | |
'lead' => $lead, | |
'permissions' => $permissions, | |
], | |
'contentTemplate' => '@MauticLead/Note/form.html.twig', | |
] | |
); | |
} | |
} | |
/** | |
* Generate's edit form and processes post data. | |
* | |
* @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response | |
*/ | |
public function editAction(Request $request, $leadId, $objectId) | |
{ | |
$lead = $this->checkLeadAccess($leadId, 'view'); | |
if ($lead instanceof Response) { | |
return $lead; | |
} | |
$model = $this->getModel('lead.note'); | |
\assert($model instanceof NoteModel); | |
$note = $model->getEntity($objectId); | |
$closeModal = false; | |
$valid = false; | |
if (null === $note || !$this->security->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser())) { | |
return $this->accessDenied(); | |
} | |
$action = $this->generateUrl( | |
'mautic_contactnote_action', | |
[ | |
'objectAction' => 'edit', | |
'objectId' => $objectId, | |
'leadId' => $leadId, | |
] | |
); | |
$form = $model->createForm($note, $this->formFactory, $action); | |
// /Check for a submitted form and process it | |
if (Request::METHOD_POST === $request->getMethod()) { | |
if (!$cancelled = $this->isFormCancelled($form)) { | |
if ($valid = $this->isFormValid($form)) { | |
// form is valid so process the data | |
$model->saveEntity($note); | |
$closeModal = true; | |
} | |
} else { | |
$closeModal = true; | |
} | |
} | |
$security = $this->security; | |
$permissions = [ | |
'edit' => $security->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser()), | |
'delete' => $security->hasEntityAccess('lead:leads:deleteown', 'lead:leads:deleteown', $lead->getPermissionUser()), | |
]; | |
if ($closeModal) { | |
// just close the modal | |
$passthroughVars['closeModal'] = 1; | |
if ($valid && !$cancelled) { | |
$passthroughVars['noteHtml'] = $this->renderView( | |
'@MauticLead/Note/note.html.twig', | |
[ | |
'note' => $note, | |
'lead' => $lead, | |
'permissions' => $permissions, | |
] | |
); | |
$passthroughVars['noteId'] = $note->getId(); | |
} | |
$passthroughVars['mauticContent'] = 'leadNote'; | |
return new JsonResponse($passthroughVars); | |
} else { | |
return $this->delegateView( | |
[ | |
'viewParameters' => [ | |
'form' => $form->createView(), | |
'lead' => $lead, | |
'permissions' => $permissions, | |
], | |
'contentTemplate' => '@MauticLead/Note/form.html.twig', | |
] | |
); | |
} | |
} | |
/** | |
* Deletes the entity. | |
* | |
* @return Response | |
*/ | |
public function deleteAction(Request $request, $leadId, $objectId) | |
{ | |
$lead = $this->checkLeadAccess($leadId, 'view'); | |
if ($lead instanceof Response) { | |
return $lead; | |
} | |
$model = $this->getModel('lead.note'); | |
\assert($model instanceof NoteModel); | |
$note = $model->getEntity($objectId); | |
if (null === $note) { | |
return $this->notFound(); | |
} | |
if ( | |
!$this->security->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser()) | |
|| $model->isLocked($note) | |
) { | |
return $this->accessDenied(); | |
} | |
$model->deleteEntity($note); | |
return new JsonResponse( | |
[ | |
'deleteId' => $objectId, | |
'mauticContent' => 'leadNote', | |
'downNoteCount' => 1, | |
] | |
); | |
} | |
/** | |
* Executes an action defined in route. | |
* | |
* @param int $objectId | |
* @param int $leadId | |
* | |
* @return Response | |
*/ | |
public function executeNoteAction(Request $request, $objectAction, $objectId = 0, $leadId = 0) | |
{ | |
if (method_exists($this, "{$objectAction}Action")) { | |
return $this->{"{$objectAction}Action"}($request, $leadId, $objectId); | |
} else { | |
return $this->accessDenied(); | |
} | |
} | |
} | |