Extra fields: Add edit/delete user tags.

pull/4032/head
Julio 4 years ago
parent 95fdb2de0b
commit 081c7acc69
  1. 25
      public/main/inc/ajax/extra_field.ajax.php
  2. 24
      src/CoreBundle/Form/ExtraFieldType.php
  3. 22
      src/CoreBundle/Repository/TagRepository.php
  4. 34
      src/CoreBundle/Resources/views/Account/edit.html.twig
  5. 7
      tests/CoreBundle/Repository/TagRepositoryTest.php

@ -35,6 +35,29 @@ switch ($action) {
); );
} }
break; break;
case 'delete_tag':
header('Content-Type: application/json');
$tagId = $_REQUEST['tag_id'] ?? 0;
$tagRepo = Container::getTagRepository();
$extraFieldRepo = Container::getExtraFieldRepository();
$tag = $tagRepo->find($tagId);
if (empty($tag)) {
echo json_encode(['items' => []]);
exit;
}
$user = api_get_user_entity();
$tagRepo = Container::getTagRepository();
$deleted = $tagRepo->deleteTagFromUser($user, $tag);
if ($deleted) {
echo json_encode(['ok' => 1]);
exit;
} else {
echo json_encode(['error' => 1]);
exit;
}
break;
case 'search_tags': case 'search_tags':
header('Content-Type: application/json'); header('Content-Type: application/json');
$tag = isset($_REQUEST['q']) ? (string) $_REQUEST['q'] : ''; $tag = isset($_REQUEST['q']) ? (string) $_REQUEST['q'] : '';
@ -52,7 +75,7 @@ switch ($action) {
$result = []; $result = [];
foreach ($tags as $tag) { foreach ($tags as $tag) {
$result[] = [ $result[] = [
'id' => $tag->getTag(), 'id' => $tag->getId(),
'text' => $tag->getTag(), 'text' => $tag->getTag(),
]; ];
} }

@ -102,15 +102,20 @@ class ExtraFieldType extends AbstractType
if (ExtraField::USER_FIELD_TYPE === $extraFieldType) { if (ExtraField::USER_FIELD_TYPE === $extraFieldType) {
$class = 'select2_user_rel_tag'; $class = 'select2_user_rel_tag';
$tags = $this->tagRepository->getTagsByUser($extraField, $item); $tags = $this->tagRepository->getTagsByUser($extraField, $item);
$choices = []; $choices = [];
$choicesAttributes = [];
foreach ($tags as $tag) { foreach ($tags as $tag) {
$stringTag = $tag->getTag(); $stringTag = $tag->getTag();
if (empty($stringTag)) { if (empty($stringTag)) {
continue; continue;
} }
$choices[$stringTag] = $stringTag; $choices[$stringTag] = $stringTag;
$choicesAttributes[$stringTag] = ['data-id' => $tag->getId()];
} }
$defaultOptions['choices'] = $choices; $defaultOptions['choices'] = $choices;
$defaultOptions['choice_attr'] = $choicesAttributes;
$defaultOptions['data'] = $choices; $defaultOptions['data'] = $choices;
} }
@ -200,31 +205,34 @@ class ExtraFieldType extends AbstractType
} }
/*$builder->addEventListener( /*$builder->addEventListener(
FormEvents::PRE_SET_DATA, FormEvents::POST_SET_DATA,
function (FormEvent $event) use ($item, $extraFields): void { function (FormEvent $event) use ($item, $extraFields): void {
$data = $event->getData(); $data = $event->getData();
foreach ($extraFields as $extraField) { foreach ($extraFields as $extraField) {
$newValue = $data[$extraField->getVariable()] ?? ''; $newValue = $data[$extraField->getVariable()] ?? null;
if (!empty($newValue)) { if (!empty($newValue)) {
if (\ExtraField::FIELD_TYPE_DATE === $extraField->getFieldType()) { if (\ExtraField::FIELD_TYPE_TAG === $extraField->getFieldType()) {
var_dump($newValue); $formItem = $event->getForm()->get($extraField->getVariable());
exit; $formItem->setData($newValue);
}
if (\ExtraField::FIELD_TYPE_DATETIME === $extraField->getFieldType()) {
} }
} }
} }
} }
);*/ );*/
$builder->addEventListener( $builder->addEventListener(
FormEvents::PRE_SUBMIT, FormEvents::PRE_SUBMIT,
function (FormEvent $event) use ($item, $extraFields): void { function (FormEvent $event) use ($item, $extraFields): void {
$data = $event->getData(); $data = $event->getData();
foreach ($extraFields as $extraField) { foreach ($extraFields as $extraField) {
$newValue = $data[$extraField->getVariable()] ?? null; $newValue = $data[$extraField->getVariable()] ?? null;
if (\ExtraField::FIELD_TYPE_TAG === $extraField->getFieldType()) { if (\ExtraField::FIELD_TYPE_TAG === $extraField->getFieldType()) {
$formItem = $event->getForm()->get($extraField->getVariable());
$options = $formItem->getConfig()->getOptions();
$options['choices'] = $newValue;
$event->getForm()->add($extraField->getVariable(), ChoiceType::class, $options);
foreach ($newValue as $tag) { foreach ($newValue as $tag) {
$this->tagRepository->addTagToUser($extraField, $item, $tag); $this->tagRepository->addTagToUser($extraField, $item, $tag);
} }

@ -105,4 +105,26 @@ class TagRepository extends ServiceEntityRepository
return $user; return $user;
} }
public function deleteTagFromUser(User $user, Tag $tag): bool
{
$em = $this->getEntityManager();
$userRelTags = $user->getUserRelTags()->filter(
function ($element) use ($tag) {
return $tag->getId() === $element->getTag()->getId();
}
);
if ($userRelTags->count() > 0 && $userRelTags->first()) {
$tag->setCount($tag->getCount() - 1);
$em->persist($tag);
$em->remove($userRelTags->first());
$em->flush();
return true;
}
return false;
}
} }

@ -1,16 +1,23 @@
{% extends "@ChamiloCore/Layout/layout_one_col.html.twig" %} {% extends "@ChamiloCore/Layout/layout_one_col.html.twig" %}
{% block content %} {% block content %}
{% autoescape false %}
<script>
{% autoescape false %}<script> document.addEventListener("DOMContentLoaded", function () {
document.addEventListener("DOMContentLoaded", function() {
$('.select2_user_rel_tag').each(function(i, obj) { $('.select2_user_rel_tag').each(function(i, obj) {
let fieldId = '&field_id=' + $(this).attr('data.field_id'); let fieldId = '&field_id=' + $(this).attr('data.field_id');
$(this).select2({ $(this).select2({
ajax: { ajax: {
url: '{{ url('legacy_main', { 'name' : 'inc/ajax/extra_field.ajax.php', 'a': 'search_tags', 'type': 'user'}) }}' + fieldId, url: '{{ url('legacy_main', { 'name' : 'inc/ajax/extra_field.ajax.php', 'a': 'search_tags', 'type': 'user'}) }}' + fieldId,
processResults: function (data) { processResults: function (data) {
/*let results = data.items.map(function(item){
let newItem = {
id: item.text,
text: item.text
};
return newItem;
});*/
return { return {
results: data.items results: data.items
} }
@ -20,6 +27,25 @@
tags: true, tags: true,
tokenSeparators: [','], tokenSeparators: [','],
}); });
$(this).on('select2:select', function (e) {
const data = e.params.data;
$(this).children('[value="' + data['id'] + '"]').attr({
'data-id': data['id'],
'value': data['text']
});
});
$(this).on('select2:unselect', function (e) {
//let fieldId = '&tag_id=' + e.params.data.id;
let fieldId = '&tag_id=' + e.params.data.element.dataset.id;
$.ajax({
url: '{{ url('legacy_main', { 'name' : 'inc/ajax/extra_field.ajax.php', 'a': 'delete_tag', 'type': 'user'}) }}' + fieldId,
success: function(data) {
}
});
});
}); });
$('.select2_user_rel_tag').refresh $('.select2_user_rel_tag').refresh
}); });

@ -162,5 +162,12 @@ class TagRepositoryTest extends AbstractApiTest
$user = $this->getUser('test'); $user = $this->getUser('test');
$repo->addTagToUser($extraField, $user, 'php'); $repo->addTagToUser($extraField, $user, 'php');
$this->assertSame(1, $user->getUserRelTags()->count()); $this->assertSame(1, $user->getUserRelTags()->count());
$tag = $user->getUserRelTags()->first();
$repo->deleteTagFromUser($user, $tag->getTag());
$this->assertSame(0, $user->getUserRelTags()->count());
$repo->deleteTagFromUser($user, $tag->getTag());
$this->assertSame(0, $user->getUserRelTags()->count());
} }
} }

Loading…
Cancel
Save